diff options
author | Mark Seaborn <mseaborn@chromium.org> | 2014-01-22 20:11:01 +0000 |
---|---|---|
committer | Mark Seaborn <mseaborn@chromium.org> | 2014-01-22 20:11:01 +0000 |
commit | 74020868ee91ff303a81a8781c5da656a92ab399 (patch) | |
tree | 6c333be6990112b94ed3894e63dabc145319dc97 /clang/lib/CodeGen/CGExprAgg.cpp | |
parent | 566184ac7591e693cc5375cfccd9ccac4ae6eddb (diff) | |
download | bcm5719-llvm-74020868ee91ff303a81a8781c5da656a92ab399.tar.gz bcm5719-llvm-74020868ee91ff303a81a8781c5da656a92ab399.zip |
Handle va_arg on struct types for the le32 target (PNaCl and Emscripten)
PNaCl and Emscripten can both handle va_arg IR instructions with
struct type.
Also add a test to cover generating a va_arg IR instruction from
va_arg in C on le32 (as already handled by VisitVAArgExpr() in
CGExprScalar.cpp), which was not covered by a test before.
(This fixes https://code.google.com/p/nativeclient/issues/detail?id=2381)
Differential Revision: http://llvm-reviews.chandlerc.com/D2539
llvm-svn: 199830
Diffstat (limited to 'clang/lib/CodeGen/CGExprAgg.cpp')
-rw-r--r-- | clang/lib/CodeGen/CGExprAgg.cpp | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/clang/lib/CodeGen/CGExprAgg.cpp b/clang/lib/CodeGen/CGExprAgg.cpp index 3395bd7d33b..ef56c0b06f2 100644 --- a/clang/lib/CodeGen/CGExprAgg.cpp +++ b/clang/lib/CodeGen/CGExprAgg.cpp @@ -935,7 +935,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; } |