diff options
author | Alon Zakai <alonzakai@gmail.com> | 2013-08-26 22:13:56 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2013-08-26 22:13:56 -0700 |
commit | 315570d2fd052967f2a1e80930b63593d31672e3 (patch) | |
tree | c2970a3c5ca801b301d1fa2557f400c2ba03b808 | |
parent | 71ce3922336051978d9fc1aa3be642b68e522d1c (diff) |
handle illegal values in structural constants in calls; fixes #1318
-rw-r--r-- | src/analyzer.js | 4 | ||||
-rw-r--r-- | tests/cases/callwithstructural64.ll | 29 | ||||
-rw-r--r-- | tests/cases/callwithstructural64.txt | 1 |
3 files changed, 31 insertions, 3 deletions
diff --git a/src/analyzer.js b/src/analyzer.js index 97ca880c..b20dedff 100644 --- a/src/analyzer.js +++ b/src/analyzer.js @@ -285,12 +285,10 @@ function analyzer(data, sidePass) { // 'flatten' out the struct into scalars var toAdd = param.params; toAdd.forEach(function(param) { - assert(param.intertype == 'value' && (param.type in Runtime.FLOAT_TYPES || getNumIntChunks(param.type) == 1), param.type); param.byval = 0; }); Array.prototype.splice.apply(params, [i, 1].concat(toAdd)); - i += toAdd.length; - continue; + continue; // do not increment i; proceed to process the new params } i++; } diff --git a/tests/cases/callwithstructural64.ll b/tests/cases/callwithstructural64.ll new file mode 100644 index 00000000..d16b0e87 --- /dev/null +++ b/tests/cases/callwithstructural64.ll @@ -0,0 +1,29 @@ +; ModuleID = 'foo.bc' +target datalayout = "e-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-p:32:32:32-v128:32:32" +target triple = "le32-unknown-nacl" + +%ac = type { i8*, i64 } + +@0 = constant [9 x i8] c"func %s\0A\00" +@1 = constant [4 x i8] c"foo\00" + +declare void @llvm.trap() noreturn nounwind + +define void @direct(%ac) { +entry: + %str = alloca %ac + store %ac %0, %ac* %str + %1 = getelementptr inbounds %ac* %str, i32 0, i32 0 + %2 = load i8** %1 + call void (i8*, ...)* @printf(i8* getelementptr inbounds ([9 x i8]* @0, i32 0, i32 0), i8* %2) + ret void +} + +declare void @printf(i8*, ...) + +define i32 @main() { +entry: + call void @direct(%ac { i8* getelementptr inbounds ([4 x i8]* @1, i32 0, i32 0), i64 3 }) + ret i32 0 +} + diff --git a/tests/cases/callwithstructural64.txt b/tests/cases/callwithstructural64.txt new file mode 100644 index 00000000..51a6ac7c --- /dev/null +++ b/tests/cases/callwithstructural64.txt @@ -0,0 +1 @@ +func foo |