aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <azakai@mozilla.com>2011-02-18 22:40:29 -0800
committerAlon Zakai <azakai@mozilla.com>2011-02-18 22:40:29 -0800
commit6ccab6bbb7f9fc715901c83e10109a9a20bc4c73 (patch)
tree02f879cdd28faf5e7ac5a3741308c1e5486409f8
parenta24e070ab3d7497d52d0808159accbb9f6461020 (diff)
parse debugging metadata for original filenames
-rw-r--r--src/intertyper.js44
-rw-r--r--tests/runner.py3
2 files changed, 42 insertions, 5 deletions
diff --git a/src/intertyper.js b/src/intertyper.js
index b181be61..e4a3cf4b 100644
--- a/src/intertyper.js
+++ b/src/intertyper.js
@@ -14,9 +14,16 @@ var Debugging = {
processMetadata: function(lines) {
var llvmLineToMetadata = {};
var metadataToSourceLine = {};
+ var metadataToParentMetadata = {};
+ var metadataToFilename = {};
var form1 = new RegExp(/^ .*, !dbg !(\d+)$/);
var form2 = new RegExp(/^ .*, !dbg !(\d+) +; \[#uses=\d+\]$/);
- var form3 = new RegExp(/^!(\d+) = metadata !{\w+\d* !?(\d+)[^\d].*$/);
+ var form3 = new RegExp(/^!(\d+) = metadata !{i32 (\d+), i32 \d+, metadata !(\d+), .*}$/);
+ var form3a = new RegExp(/^!(\d+) = metadata !{i32 \d+, metadata !\d+, i32 \d+, i32 \d+, metadata !(\d+), i32 \d+} ; \[ DW_TAG_lexical_block \]$/);
+ var form3ab = new RegExp(/^!(\d+) = metadata !{i32 \d+, i32 \d+, metadata !(\d+), .*$/);
+ var form3ac = new RegExp(/^!(\d+) = metadata !{i32 \d+, metadata !\d+, metadata !"[^"]+", metadata !(\d+)[^\[]* ; \[ DW_TAG_structure_type \]$/);
+ var form3b = new RegExp(/^!(\d+) = metadata !{i32 \d+, metadata !"([^"]+)", metadata !"([^"]+)", metadata !\d+} ; \[ DW_TAG_file_type \]$/);
+ var form3c = new RegExp(/^!(\d+) = metadata !{\w+\d* !?(\d+)[^\d].*$/);
var form4 = new RegExp(/^!llvm.dbg.\w+ = .*$/);
var form5 = new RegExp(/^!(\d+) = metadata !{null.*$/);
var form6 = new RegExp(/^ call void \@llvm.dbg.declare\(metadata .*$/);
@@ -32,24 +39,53 @@ var Debugging = {
calc = form3.exec(line);
if (calc) {
metadataToSourceLine[calc[1]] = calc[2];
+ metadataToParentMetadata[calc[1]] = calc[3];
return ';'; // return an empty line, to keep line numbers of subsequent lines the same
}
- calc = form4.exec(line) || form5.exec(line);
+ calc = form3a.exec(line) || form3ab.exec(line) || form3ac.exec(line);
+ if (calc) {
+ metadataToParentMetadata[calc[1]] = calc[2];
+ return ';';
+ }
+ calc = form3b.exec(line);
+ if (calc) {
+ metadataToFilename[calc[1]] = calc[3] + '/' + calc[2];
+ return ';';
+ }
+ calc = form3c.exec(line) || form4.exec(line) || form5.exec(line);
if (calc) return ';';
return line;
}, this);
+ /*
+ dprint("ll ==> meta: " + JSON.stringify(llvmLineToMetadata));
+ dprint("meta ==> sline: " + JSON.stringify(metadataToSourceLine));
+ dprint("meta ==> pmeta: " + JSON.stringify(metadataToParentMetadata));
+ dprint("meta ==> fname: " + JSON.stringify(metadataToFilename));
+ */
+
this.llvmLineToSourceLine = {};
+ this.llvmLineToSourceFile = {};
for (var l in llvmLineToMetadata) {
- this.llvmLineToSourceLine[l] = metadataToSourceLine[llvmLineToMetadata[l]];
+ var m = llvmLineToMetadata[l];
+ this.llvmLineToSourceLine[l] = metadataToSourceLine[m];
+ //dprint('starting to recurse metadata for: ' + m);
+ while (!metadataToFilename[m]) {
+ //dprint('recursing metadata, at: ' + m);
+ m = metadataToParentMetadata[m];
+ assert(m, 'Confused as to parent metadata for llvm #' + l + ', metadata !' + m);
+ }
+ this.llvmLineToSourceFile[l] = metadataToFilename[m];
}
+
this.on = true;
return ret;
},
getComment: function(lineNum) {
- return lineNum in this.llvmLineToSourceLine ? ' //@line ' + this.llvmLineToSourceLine[lineNum] : '';
+ return lineNum in this.llvmLineToSourceLine ? ' //@line ' + this.llvmLineToSourceLine[lineNum] + ' "' +
+ this.llvmLineToSourceFile[lineNum] + '"' : '';
}
};
diff --git a/tests/runner.py b/tests/runner.py
index 6bf6ccd0..cfe0dd55 100644
--- a/tests/runner.py
+++ b/tests/runner.py
@@ -1741,7 +1741,8 @@ if 'benchmark' not in sys.argv:
def post(filename):
lines = open(filename, 'r').readlines()
line = filter(lambda line: '___assert_fail(' in line, lines)[0]
- assert '//@line 7\n' in line, 'Must have debug info with the line number'
+ assert '//@line 7 "' in line, 'Must have debug info with the line number'
+ assert 'src.cpp"\n' in line, 'Must have debug info with the filename'
self.do_test(src, '*nothingatall*', post_build=post)
except Exception, e:
# This test *should* fail