Match compiler: Workaround broken optimizations in verify mode
If the match compiler uses the 'verify' mode and we compile with -O2, some tests comparing the on-the-fly-parser to the compiled match fail. Small functions are inlined by the -O2 compile flag. If we disable function inlining and still compile with -O2, everything is back to normal. gdb didn't show anything useful during the mismatch since the needed variables are optimized out. Once we start printing them, the problem vanishes, too. -> Can only be diagnosed at the x86 assembly level. The problem vanished by switching the invocation order of Token::Match() and the compiled match, so just swap them. Also add commented out helper code to better diagnose mismatch problems.
This commit is contained in:
parent
33619de072
commit
982503f457
|
@ -259,12 +259,12 @@ class MatchCompiler:
|
||||||
origMatchName = 'simpleMatch'
|
origMatchName = 'simpleMatch'
|
||||||
assert(varId == None)
|
assert(varId == None)
|
||||||
|
|
||||||
ret += ' bool res_parsed_match = Token::' + origMatchName + '(tok, "' + pattern + '"'
|
ret += ' bool res_compiled_match = match'+str(patternNumber)+'(tok'
|
||||||
if varId:
|
if varId:
|
||||||
ret += ', varid'
|
ret += ', varid'
|
||||||
ret += ');\n'
|
ret += ');\n'
|
||||||
|
|
||||||
ret += ' bool res_compiled_match = match'+str(patternNumber)+'(tok'
|
ret += ' bool res_parsed_match = Token::' + origMatchName + '(tok, "' + pattern + '"'
|
||||||
if varId:
|
if varId:
|
||||||
ret += ', varid'
|
ret += ', varid'
|
||||||
ret += ');\n'
|
ret += ');\n'
|
||||||
|
@ -272,8 +272,14 @@ class MatchCompiler:
|
||||||
ret += '\n'
|
ret += '\n'
|
||||||
# Don't use assert() here, it's disabled for optimized builds.
|
# Don't use assert() here, it's disabled for optimized builds.
|
||||||
# We also need to verify builds in 'release' mode
|
# We also need to verify builds in 'release' mode
|
||||||
ret += ' if (res_parsed_match != res_compiled_match)\n'
|
ret += ' if (res_parsed_match != res_compiled_match) {\n'
|
||||||
|
# ret += ' std::cout << "res_parsed_match' + str(verifyNumber) + ': " << res_parsed_match << ", res_compiled_match: " << res_compiled_match << "\\n";\n'
|
||||||
|
# ret += ' if (tok)\n'
|
||||||
|
# ret += ' std::cout << "tok: " << tok->str();\n'
|
||||||
|
# ret += ' if (tok->next())\n'
|
||||||
|
# ret += ' std::cout << "tok next: " << tok->next()->str();\n'
|
||||||
ret += ' throw InternalError(tok, "Internal error. compiled match returned different result than parsed match");\n'
|
ret += ' throw InternalError(tok, "Internal error. compiled match returned different result than parsed match");\n'
|
||||||
|
ret += ' }\n'
|
||||||
ret += ' return res_compiled_match;\n'
|
ret += ' return res_compiled_match;\n'
|
||||||
ret += '}\n'
|
ret += '}\n'
|
||||||
|
|
||||||
|
@ -432,6 +438,7 @@ class MatchCompiler:
|
||||||
header += '#include "errorlogger.h"\n'
|
header += '#include "errorlogger.h"\n'
|
||||||
header += '#include <string>\n'
|
header += '#include <string>\n'
|
||||||
header += '#include <cstring>\n'
|
header += '#include <cstring>\n'
|
||||||
|
# header += '#include <iostream>\n'
|
||||||
code = ''
|
code = ''
|
||||||
|
|
||||||
for line in srclines:
|
for line in srclines:
|
||||||
|
|
Loading…
Reference in New Issue