diff options
author | max99x <max99x@gmail.com> | 2011-07-20 01:19:59 +0300 |
---|---|---|
committer | max99x <max99x@gmail.com> | 2011-07-20 04:39:44 +0300 |
commit | 08a7f5d20fb3d9c8089e482de03d3c22440e4151 (patch) | |
tree | c623b8af362d135eb6acfadf182694d0b33bc82d | |
parent | cc08f5f3f1c06ef3e1e32111d9ad7043e633f186 (diff) |
Fixed various metadata parsing error and activated -g by default in settings and emmaken.
-rw-r--r-- | settings.py | 6 | ||||
-rw-r--r-- | src/intertyper.js | 11 | ||||
-rw-r--r-- | src/modules.js | 50 | ||||
-rw-r--r-- | tests/runner.py | 2 | ||||
-rwxr-xr-x | tools/emmaken.py | 2 |
5 files changed, 41 insertions, 30 deletions
diff --git a/settings.py b/settings.py index e91d07d2..31f115c2 100644 --- a/settings.py +++ b/settings.py @@ -9,9 +9,9 @@ LLVM_ROOT=os.path.expanduser('~/Dev/llvm-2.9/cbuild/bin') LLVM_GCC=os.path.expanduser('~/Dev/llvm-gcc-2.9/cbuild/install/bin/llvm-g++') -COMPILER_OPTS = ['-m32'] # Need to build as 32bit arch, for now - - # various errors on 64bit compilation - # WARNING: '-g' here will generate llvm bitcode that lli will crash on! +COMPILER_OPTS = ['-m32', '-g'] # Need to build as 32bit arch, for now - + # various errors on 64bit compilation + # WARNING: '-g' here will generate llvm bitcode that lli will crash on! SPIDERMONKEY_ENGINE = [os.path.expanduser('~/Dev/tracemonkey/js/src/js'), '-m', '-j', '-p'] V8_ENGINE = [os.path.expanduser('~/Dev/v8/d8')] diff --git a/src/intertyper.js b/src/intertyper.js index b6ff89f5..95b1fcd3 100644 --- a/src/intertyper.js +++ b/src/intertyper.js @@ -19,10 +19,13 @@ function intertyper(data, parseFunctions, baseLineNum) { } // If the source contains debug info as LLVM metadata, process that out (and save the debugging info for later) - if (/!\d+ = metadata .*/.exec(data[data.length-1])) { // Fast test to see if we have metadata. If this fails when it shouldn't, we should generalize - data = Debugging.processMetadata(data); - //print(data.join('\n')); - //dprint(JSON.stringify(Debugging)); + for (var i = data.length-1; i >= 0; i--) { + if (/^!\d+ = metadata .*/.exec(data[i])) { + data = Debugging.processMetadata(data); + //print(data.join('\n')); + //dprint(JSON.stringify(Debugging)); + break; + } } substrate = new Substrate('Intertyper'); diff --git a/src/modules.js b/src/modules.js index 81280988..500297f0 100644 --- a/src/modules.js +++ b/src/modules.js @@ -21,6 +21,7 @@ var Debugging = { var structToMemberMeta = {}; var memberMetaToStruct = {}; + var structMetaToStruct = {}; var structToSize = {}; var memberMetaToMembers = {}; var metadataToMember = {}; @@ -36,14 +37,15 @@ var Debugging = { var form4 = new RegExp(/^!llvm.dbg.[\w\.]+ = .*$/); var form5 = new RegExp(/^!(\d+) = metadata !{.*$/); var form6 = new RegExp(/^ (tail )?call void \@llvm.dbg.\w+\(metadata .*$/); - var formStruct = /^!(\d+) = metadata !\{i32 \d+, metadata !\d+, metadata !"([^"]+)", metadata !\d+, i32 \d+, i64 (\d+), .+?, metadata !(\d+),[^,]*,[^,]*} ; \[ DW_TAG_structure_type \]$/; - var formStructMembers = /^!(\d+) = metadata !\{(metadata !\d+(?:, metadata !\d+)*)\}$/; + var formStruct = /^!(\d+) = metadata !\{i32 \d+, metadata !\d+, metadata !"([^"]+)", metadata !\d+, i32 \d+, i64 (\d+), [^,]*, [^,]*, [^,]*, [^,]*, metadata !(\d+), .*} ; \[ DW_TAG_(?:structure|class)_type \]$/; + var formStructMembers = /^!(\d+) = metadata !\{(.*)\}$/; var formMember = /^!(\d+) = metadata !\{i32 \d+, metadata !\d+, metadata !"([^"]+)", metadata !\d+, i32 \d+, i64 (\d+), i64 \d+, i64 (\d+), .+?, metadata !(\d+)} ; \[ DW_TAG_member \]$/; var debugComment = new RegExp(/; +\[debug line = \d+:\d+\]/); var ret = lines.map(function(line, i) { line = line.replace(debugComment, ''); + var skipLine = false; if (form6.exec(line)) return ';'; @@ -54,20 +56,24 @@ var Debugging = { } calc = formStruct.exec(line); if (calc) { - memberMetaToStruct[calc[1]] = calc[2]; + structMetaToStruct[calc[1]] = calc[2]; structToSize[calc[2]] = calc[3]; structToMemberMeta[calc[2]] = calc[4]; - return ';'; + memberMetaToStruct[calc[4]] = calc[1]; + skipLine = true; } calc = formStructMembers.exec(line); - if (calc) { - memberMetaToMembers[calc[1]] = calc[2].match(/\d+/g); - return ';'; + if (calc && calc[1] in memberMetaToStruct) { + var children = calc[2].match(/!\d+/g) || []; + memberMetaToMembers[calc[1]] = children.map(function(i) { + return i.slice(1); + }); + skipLine = true; } calc = formMember.exec(line); if (calc) { metadataToMember[calc[1]] = calc.slice(2); - return ';'; + skipLine = true; } calc = form3.exec(line); if (calc) { @@ -87,7 +93,7 @@ var Debugging = { } calc = form3c.exec(line) || form4.exec(line) || form5.exec(line); if (calc) return ';'; - return line; + return skipLine ? ';' : line; }, this); /* @@ -112,7 +118,6 @@ var Debugging = { } // Create base struct definitions. - Types.structDefinitions = {}; for (var structName in structToMemberMeta) { // TODO: Account for bitfields. Types.structDefinitions[structName] = { @@ -123,19 +128,21 @@ var Debugging = { // Fill struct members. for (var structName in structToMemberMeta) { var struct = Types.structDefinitions[structName]; - var memberIds = memberMetaToMembers[structToMemberMeta[structName]]; + var memberMetaId = structToMemberMeta[structName]; + var memberIds = memberMetaToMembers[memberMetaId]; for (var i = 0; i < memberIds.length; i++) { - var member = metadataToMember[memberIds[i]]; - var memberObj = { - size: parseInt(member[1]) / 8, - offset: parseInt(member[2]) / 8 - } - dprint(member[3] + " in " + keys(memberMetaToStruct)); - if (member[3] in memberMetaToStruct) { - var subStruct = Types.structDefinitions[memberMetaToStruct[member[3]]]; - memberObj.members = subStruct.members; + if (memberIds[i] in metadataToMember) { + var member = metadataToMember[memberIds[i]]; + var memberObj = { + size: parseInt(member[1]) / 8, + offset: parseInt(member[2]) / 8 + } + if (member[3] in structMetaToStruct) { + var subStruct = Types.structDefinitions[structMetaToStruct[member[3]]]; + memberObj.members = subStruct.members; + } + struct.members[member[0]] = memberObj; } - struct.members[member[0]] = memberObj; } } @@ -172,6 +179,7 @@ var Types = { this.fatTypes = this.types; this.types = temp; }, + structDefinitions: {}, // Remove all data not needed during runtime (like line numbers, JS, etc.) cleanForRuntime: function() { diff --git a/tests/runner.py b/tests/runner.py index ff90e63b..27c19867 100644 --- a/tests/runner.py +++ b/tests/runner.py @@ -2736,7 +2736,7 @@ if 'benchmark' not in sys.argv: # Compare to each other, and to expected output self.do_ll_test(path_from_root('tests', filename+'.o.ll.ll')) - self.do_ll_test(path_from_root('tests', filename+'.o.ll.ll'), 'AD:34,10\nAD:43,7008\nAD:53,7018\n') + self.do_ll_test(path_from_root('tests', filename+'.o.ll.ll'), 'AD:38,10\nAD:47,7008\nAD:57,7018\n') # Test using build_ll_hook src = ''' diff --git a/tools/emmaken.py b/tools/emmaken.py index dea8194e..c902bbdb 100755 --- a/tools/emmaken.py +++ b/tools/emmaken.py @@ -85,7 +85,7 @@ try: sys.argv = sys.argv[:-1] CC_ARG_SKIP = ['-O1', '-O2', '-O3'] - CC_ADDITIONAL_ARGS = ['-m32', '-U__i386__', '-U__x86_64__', '-U__i386', '-U__x86_64', '-U__SSE__', '-U__SSE2__', '-UX87_DOUBLE_ROUNDING', '-UHAVE_GCC_ASM_FOR_X87'] + CC_ADDITIONAL_ARGS = ['-m32', '-g', '-U__i386__', '-U__x86_64__', '-U__i386', '-U__x86_64', '-U__SSE__', '-U__SSE2__', '-UX87_DOUBLE_ROUNDING', '-UHAVE_GCC_ASM_FOR_X87', '-D__USE_XOPEN2K8'] ALLOWED_LINK_ARGS = ['-f', '-help', '-o', '-print-after', '-print-after-all', '-print-before', '-print-before-all', '-time-passes', '-v', '-verify-dom-info', '-version' ] DISALLOWED_LINK_ARGS = []#['rc'] |