diff options
-rw-r--r-- | src/analyzer.js | 16 | ||||
-rw-r--r-- | tests/cases/phi24_ta2.ll | 1 |
2 files changed, 16 insertions, 1 deletions
diff --git a/src/analyzer.js b/src/analyzer.js index 931ce421..2a7d64f5 100644 --- a/src/analyzer.js +++ b/src/analyzer.js @@ -953,9 +953,23 @@ function analyzer(data, sidePass) { if (type[0] == '{' || type[0] == '<') { type = nonPointing; var packed = type[0] == '<'; + var internal = type; + if (packed) { + if (internal[internal.length-1] != '>') { + warnOnce('ignoring type ' + internal); + return; // function pointer or such + } + internal = internal.substr(1, internal.length-2); + } + assert(internal[0] == '{', internal); + if (internal[internal.length-1] != '}') { + warnOnce('ignoring type ' + internal); + return; // function pointer or such + } + internal = internal.substr(2, internal.length-4); Types.types[type] = { name_: type, - fields: splitTokenList(tokenize(type.substr(2 + packed, type.length - 4 - 2*packed)).tokens).map(function(segment) { + fields: splitTokenList(tokenize(internal).tokens).map(function(segment) { return segment[0].text; }), packed: packed, diff --git a/tests/cases/phi24_ta2.ll b/tests/cases/phi24_ta2.ll index 4894d5e6..2d9b6646 100644 --- a/tests/cases/phi24_ta2.ll +++ b/tests/cases/phi24_ta2.ll @@ -252,6 +252,7 @@ target triple = "i386-pc-linux-gnu" @g_287 = internal constant i32 -1, align 4 define i32 @main(i32 %argc, i8** nocapture %argv) nounwind { + %msgdummy = alloca { i8*, { i64, i8* } (i8*)* } ; test for parsing of this kind of stuff, compilation-only test %p_6.i.i = alloca %union.U3, align 8 %1 = icmp eq i32 %argc, 2 br i1 %1, label %2, label %7 |