diff options
-rw-r--r-- | src/analyzer.js | 14 | ||||
-rw-r--r-- | src/intertyper.js | 3 | ||||
-rw-r--r-- | src/modules.js | 5 | ||||
-rw-r--r-- | src/parseTools.js | 3 |
4 files changed, 22 insertions, 3 deletions
diff --git a/src/analyzer.js b/src/analyzer.js index 824e7903..8e8f8ac7 100644 --- a/src/analyzer.js +++ b/src/analyzer.js @@ -107,6 +107,8 @@ function analyzer(data) { // check that we never allocate with this (either as a child structure // in the analyzer, or in calcSize in alloca). var subType = check[2]; + addTypeInternal(subType, data); // needed for anonymous structure definitions (see below) + Types.types[nonPointing] = { name_: nonPointing, fields: range(num).map(function() { return subType }), @@ -124,6 +126,18 @@ function analyzer(data) { return; } + // anonymous structure definition, for example |{ i32, i8*, void ()*, i32 }| + if (type[0] == '{') { + Types.types[type] = { + name_: type, + fields: splitTokenList(tokenize(type.substr(2, type.length-4)).tokens).map(function(segment) { + return segment[0].text; + }), + lineNum: '?' + }; + return; + } + if (isPointerType(type)) return; if (['['].indexOf(type) != -1) return; Types.types[type] = { diff --git a/src/intertyper.js b/src/intertyper.js index 83a49645..56443d20 100644 --- a/src/intertyper.js +++ b/src/intertyper.js @@ -2,6 +2,9 @@ // to be processed by the later stages. var tokenizer; // TODO: Clean this up/out +function tokenize(text) { + return tokenizer.processItem({ lineText: text }, true); +} //! @param parseFunctions We parse functions only on later passes, since we do not //! want to parse all of them at once, and have all their diff --git a/src/modules.js b/src/modules.js index f613c20b..9765fa8d 100644 --- a/src/modules.js +++ b/src/modules.js @@ -31,7 +31,8 @@ var Debugging = { 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_.*$/); - var form3b = new RegExp(/^!(\d+) = metadata !{i32 \d+, metadata !"([^"]+)", metadata !"([^"]+)", metadata !\d+} ; \[ DW_TAG_file_type \]$/); + var form3ad = new RegExp(/^!(\d+) = metadata !{i32 \d+, i32 \d+, null, metadata !"[^"]*", metadata !"[^"]*", metadata !"[^"]*", metadata !(\d+),.*$/); + var form3b = new RegExp(/^!(\d+) = metadata !{i32 \d+, metadata !"([^"]+)", metadata !"([^"]+)", (metadata !\d+|null)} ; \[ 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 !{.*$/); @@ -79,7 +80,7 @@ var Debugging = { 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); + calc = form3a.exec(line) || form3ab.exec(line) || form3ac.exec(line) || form3ad.exec(line); if (calc) { metadataToParentMetadata[calc[1]] = calc[2]; return ';'; diff --git a/src/parseTools.js b/src/parseTools.js index a3347139..78b88ea8 100644 --- a/src/parseTools.js +++ b/src/parseTools.js @@ -114,6 +114,7 @@ function isStructPointerType(type) { function isStructType(type) { if (isPointerType(type)) return false; if (new RegExp(/^\[\d+\ x\ (.*)\]/g).test(type)) return true; // [15 x ?] blocks. Like structs + if (new RegExp(/{ [^}]* }/g).test(type)) return true; // { i32, i8 } etc. - anonymous struct types // See comment in isStructPointerType() return !Runtime.isNumberType(type) && type[0] == '%'; } @@ -148,7 +149,7 @@ function isFunctionType(type) { if (pointingLevels(type) !== 1) return false; var text = removeAllPointing(parts.slice(1).join(' ')); if (!text) return false; - return isType(parts[0]) && isFunctionDef({ text: text, item: tokenizer.processItem({ lineText: text.substr(1, text.length-2) }, true) }); + return isType(parts[0]) && isFunctionDef({ text: text, item: tokenize(text.substr(1, text.length-2), true) }); } function isType(type) { // TODO! |