diff options
-rw-r--r-- | src/analyzer.js | 4 | ||||
-rw-r--r-- | tests/cases/uadd_overflow_ta2.ll | 6 | ||||
-rw-r--r-- | tests/cases/uadd_overflow_ta2.txt | 1 |
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* |