diff options
author | Alon Zakai <azakai@mozilla.com> | 2011-02-18 22:40:29 -0800 |
---|---|---|
committer | Alon Zakai <azakai@mozilla.com> | 2011-02-18 22:40:29 -0800 |
commit | 6ccab6bbb7f9fc715901c83e10109a9a20bc4c73 (patch) | |
tree | 02f879cdd28faf5e7ac5a3741308c1e5486409f8 | |
parent | a24e070ab3d7497d52d0808159accbb9f6461020 (diff) |
parse debugging metadata for original filenames
-rw-r--r-- | src/intertyper.js | 44 | ||||
-rw-r--r-- | tests/runner.py | 3 |
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 |