aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormax99x <max99x@gmail.com>2011-07-20 01:19:59 +0300
committermax99x <max99x@gmail.com>2011-07-20 04:39:44 +0300
commit08a7f5d20fb3d9c8089e482de03d3c22440e4151 (patch)
treec623b8af362d135eb6acfadf182694d0b33bc82d
parentcc08f5f3f1c06ef3e1e32111d9ad7043e633f186 (diff)
Fixed various metadata parsing error and activated -g by default in settings and emmaken.
-rw-r--r--settings.py6
-rw-r--r--src/intertyper.js11
-rw-r--r--src/modules.js50
-rw-r--r--tests/runner.py2
-rwxr-xr-xtools/emmaken.py2
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']