diff options
author | Alon Zakai <azakai@mozilla.com> | 2011-02-22 20:49:19 -0800 |
---|---|---|
committer | Alon Zakai <azakai@mozilla.com> | 2011-02-22 20:49:19 -0800 |
commit | 9efae48667c05a5cd7e699a3a95b7db80539b801 (patch) | |
tree | 3fd91082153c1d702b39f100e792557ee8de918c /src/modules.js | |
parent | b381f9f375aa479dcbd4367af19cb698d4de1b43 (diff) |
global Types object refactoring
Diffstat (limited to 'src/modules.js')
-rw-r--r-- | src/modules.js | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/src/modules.js b/src/modules.js new file mode 100644 index 00000000..f2c458f5 --- /dev/null +++ b/src/modules.js @@ -0,0 +1,100 @@ +// Various namespace-like modules + +var LLVM_STYLE = null; + +var LLVM = { + LINKAGES: set('private', 'linker_private', 'linker_private_weak', 'linker_private_weak_def_auto', 'internal', + 'available_externally', 'linkonce', 'common', 'weak', 'appending', 'extern_weak', 'linkonce_odr', + 'weak_odr', 'externally_visible', 'dllimport', 'dllexport'), + CALLING_CONVENTIONS: set('ccc', 'fastcc', 'coldcc', 'cc10') +}; + +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 !{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 .*$/); + + var ret = lines.map(function(line, i) { + if (form6.exec(line)) return null; + + var calc = form1.exec(line) || form2.exec(line); + if (calc) { + llvmLineToMetadata[i+1] = calc[1]; + return line.replace(', !dbg !' + calc[1], ''); + } + 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 = 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) { + 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] + ' "' + + this.llvmLineToSourceFile[lineNum] + '"' : ''; + }, + + getIdentifier: function(lineNum) { + var sourceFile = this.llvmLineToSourceFile[lineNum]; + if (!sourceFile) return null; + return sourceFile.split('/').slice(-1)[0] + ':' + this.llvmLineToSourceLine[lineNum]; + } +}; + +var Types = { + types: {}, +}; + |