aboutsummaryrefslogtreecommitdiff
path: root/src/modules.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/modules.js')
-rw-r--r--src/modules.js62
1 files changed, 61 insertions, 1 deletions
diff --git a/src/modules.js b/src/modules.js
index 7c7a6ea4..6b8d880a 100644
--- a/src/modules.js
+++ b/src/modules.js
@@ -19,6 +19,12 @@ var Debugging = {
var metadataToParentMetadata = {};
var metadataToFilename = {};
+ var structToMemberMeta = {};
+ var memberMetaToStruct = {};
+ var structMetaToStruct = {};
+ var memberMetaToMembers = {};
+ var metadataToMember = {};
+
var form1 = new RegExp(/^ .*, !dbg !(\d+) *$/);
var form2 = new RegExp(/^ .*, !dbg !(\d+) *; .*$/);
var form3 = new RegExp(/^!(\d+) = metadata !{i32 (\d+), i32 \d+, metadata !(\d+), .*}$/);
@@ -30,11 +36,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|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 ';';
@@ -43,6 +53,26 @@ var Debugging = {
llvmLineToMetadata[i+1] = calc[1];
return line.replace(', !dbg !' + calc[1], '');
}
+ calc = formStruct.exec(line);
+ if (calc && !(calc[2] in structToMemberMeta)) {
+ structMetaToStruct[calc[1]] = calc[2];
+ structToMemberMeta[calc[2]] = calc[3];
+ memberMetaToStruct[calc[3]] = calc[1];
+ skipLine = true;
+ }
+ calc = formStructMembers.exec(line);
+ if (calc) {
+ 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);
+ skipLine = true;
+ }
calc = form3.exec(line);
if (calc) {
metadataToSourceLine[calc[1]] = calc[2];
@@ -61,7 +91,7 @@ var Debugging = {
}
calc = form3c.exec(line) || form4.exec(line) || form5.exec(line);
if (calc) return ';';
- return line;
+ return skipLine ? ';' : line;
}, this);
/*
@@ -85,6 +115,35 @@ var Debugging = {
this.llvmLineToSourceFile[l] = metadataToFilename[m];
}
+ // Create struct definitions.
+ // TODO: Account for bitfields.
+ function generateStructDefinition(name) {
+ if (!Types.structMetadata.hasOwnProperty(name)) {
+ var struct = [];
+ var membersMetaId = structToMemberMeta[name];
+ var memberIds = memberMetaToMembers[membersMetaId];
+ for (var i = 0; i < memberIds.length; i++) {
+ var memberId = memberIds[i];
+ if (memberId in metadataToMember) {
+ var member = metadataToMember[memberId];
+ if (member[1] in structMetaToStruct) {
+ var def = generateStructDefinition(structMetaToStruct[member[1]]);
+ var record = {};
+ record[member[0]] = def;
+ struct.push(record);
+ } else {
+ struct.push(member[0]);
+ }
+ }
+ }
+ Types.structMetadata[name] = struct;
+ }
+ return Types.structMetadata[name];
+ }
+ for (var name in structToMemberMeta) {
+ generateStructDefinition(name);
+ }
+
this.on = true;
return ret;
@@ -118,6 +177,7 @@ var Types = {
this.fatTypes = this.types;
this.types = temp;
},
+ structMetadata: {},
// Remove all data not needed during runtime (like line numbers, JS, etc.)
cleanForRuntime: function() {