diff --git a/src/analyzer.js b/src/analyzer.js index 2a7d64f58..97ca880c2 100644 --- a/src/analyzer.js +++ b/src/analyzer.js @@ -281,6 +281,16 @@ function analyzer(data, sidePass) { Array.prototype.splice.apply(params, [i, 1].concat(toAdd)); i += toAdd.length; continue; + } else if (param.intertype == 'structvalue') { + // '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; } i++; } diff --git a/tests/cases/callwithstructural.ll b/tests/cases/callwithstructural.ll new file mode 100644 index 000000000..bc6f852ab --- /dev/null +++ b/tests/cases/callwithstructural.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*, i32 } + +@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), i32 3 }) + ret i32 0 +} + diff --git a/tests/cases/callwithstructural.txt b/tests/cases/callwithstructural.txt new file mode 100644 index 000000000..51a6ac7c5 --- /dev/null +++ b/tests/cases/callwithstructural.txt @@ -0,0 +1 @@ +func foo