aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2013-04-12 16:55:36 -0700
committerAlon Zakai <alonzakai@gmail.com>2013-04-12 16:55:36 -0700
commitf0c69a1cfeb7ec8050f3f22a05087335b6f56f38 (patch)
tree6cc49faebbbad3d9f0d7428cba344806ed5f8f1c
parent94aa7b917086053fbf4f6125daad8bb1bd889190 (diff)
handle inline struct definitions (assuming zeroinit) in illegal insertvalue, and add testcase based on gmp.js
-rw-r--r--src/analyzer.js4
-rw-r--r--tests/cases/uadd_overflow_ta2.ll6
-rw-r--r--tests/cases/uadd_overflow_ta2.txt1
3 files changed, 11 insertions, 0 deletions
diff --git a/src/analyzer.js b/src/analyzer.js
index c10f18cc..3921cab8 100644
--- a/src/analyzer.js
+++ b/src/analyzer.js
@@ -124,6 +124,10 @@ function analyzer(data, sidePass) {
bits = bits || 32; // things like pointers are all i32, but show up as 0 bits from getBits
if (allowLegal && bits <= 32) return [{ ident: base + ('i' + bits in Runtime.INT_TYPES ? '' : '$0'), bits: bits }];
if (isNumber(base)) return getLegalLiterals(base, bits);
+ if (base[0] == '{') {
+ warnOnce('seeing source of illegal data ' + base + ', likely an inline struct - assuming zeroinit');
+ return getLegalLiterals('0', bits);
+ }
var ret = new Array(Math.ceil(bits/32));
var i = 0;
if (base == 'zeroinitializer' || base == 'undef') base = 0;
diff --git a/tests/cases/uadd_overflow_ta2.ll b/tests/cases/uadd_overflow_ta2.ll
index 81a76bcd..feac60e3 100644
--- a/tests/cases/uadd_overflow_ta2.ll
+++ b/tests/cases/uadd_overflow_ta2.ll
@@ -33,6 +33,12 @@ entry:
%64ba2 = zext i1 %64ba1 to i32
call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([9 x i8]* @.str2, i32 0, i32 0), i32 %64ba0, i32 %64ba2) ; [#uses=0]
+ %zbuadd1 = insertvalue { i32, i1 } { i32 undef, i1 false }, i32 10, 0 ; undef and explicit
+ %zba0 = extractvalue { i32, i1 } %zbuadd1, 0
+ %zba1 = extractvalue { i32, i1 } %zbuadd1, 1
+ %zba2 = zext i1 %ba1 to i32
+ call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([9 x i8]* @.str2, i32 0, i32 0), i32 %zba0, i32 %zba2) ; [#uses=0]
+
ret i32 1
}
diff --git a/tests/cases/uadd_overflow_ta2.txt b/tests/cases/uadd_overflow_ta2.txt
index bcd04599..81513080 100644
--- a/tests/cases/uadd_overflow_ta2.txt
+++ b/tests/cases/uadd_overflow_ta2.txt
@@ -1,3 +1,4 @@
*3319578,1*
*5177,0*
*9875,1*
+*10,0*