aboutsummaryrefslogtreecommitdiff
path: root/src/modules.js
diff options
context:
space:
mode:
authorAlon Zakai <azakai@mozilla.com>2011-02-22 20:49:19 -0800
committerAlon Zakai <azakai@mozilla.com>2011-02-22 20:49:19 -0800
commit9efae48667c05a5cd7e699a3a95b7db80539b801 (patch)
tree3fd91082153c1d702b39f100e792557ee8de918c /src/modules.js
parentb381f9f375aa479dcbd4367af19cb698d4de1b43 (diff)
global Types object refactoring
Diffstat (limited to 'src/modules.js')
-rw-r--r--src/modules.js100
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: {},
+};
+