diff --git a/emscripten-version.txt b/emscripten-version.txt index 958bb4d7634..9f67c6b08c1 100644 --- a/emscripten-version.txt +++ b/emscripten-version.txt @@ -1,2 +1,2 @@ -1.26.0 +1.26.1 diff --git a/lib/CodeGen/CGExprAgg.cpp b/lib/CodeGen/CGExprAgg.cpp index b974e1dcc68..7a38b36baf6 100644 --- a/lib/CodeGen/CGExprAgg.cpp +++ b/lib/CodeGen/CGExprAgg.cpp @@ -996,7 +996,11 @@ void AggExprEmitter::VisitVAArgExpr(VAArgExpr *VE) { llvm::Value *ArgPtr = CGF.EmitVAArg(ArgValue, VE->getType()); if (!ArgPtr) { - CGF.ErrorUnsupported(VE, "aggregate va_arg expression"); + // If EmitVAArg fails, we fall back to the LLVM instruction. + llvm::Value *Val = + Builder.CreateVAArg(ArgValue, CGF.ConvertType(VE->getType())); + if (!Dest.isIgnored()) + Builder.CreateStore(Val, Dest.getAddr()); return; } diff --git a/test/CodeGen/le32-vaarg.c b/test/CodeGen/le32-vaarg.c new file mode 100644 index 00000000000..51bbb029684 --- /dev/null +++ b/test/CodeGen/le32-vaarg.c @@ -0,0 +1,28 @@ +// RUN: %clang_cc1 -triple le32-unknown-nacl -emit-llvm -o - %s | FileCheck %s +#include + +int get_int(va_list *args) { + return va_arg(*args, int); +} +// CHECK: define i32 @get_int +// CHECK: [[RESULT:%[a-z_0-9]+]] = va_arg {{.*}}, i32{{$}} +// CHECK: ret i32 [[RESULT]] + +struct Foo { + int x; +}; + +struct Foo dest; + +void get_struct(va_list *args) { + dest = va_arg(*args, struct Foo); +} +// CHECK: define void @get_struct +// CHECK: [[RESULT:%[a-z_0-9]+]] = va_arg {{.*}}, %struct.Foo{{$}} +// CHECK: store %struct.Foo [[RESULT]], %struct.Foo* @dest + +void skip_struct(va_list *args) { + va_arg(*args, struct Foo); +} +// CHECK: define void @skip_struct +// CHECK: va_arg {{.*}}, %struct.Foo{{$}}