diff options
| author | Tim Northover <tnorthover@apple.com> | 2013-06-21 23:05:33 +0000 |
|---|---|---|
| committer | Tim Northover <tnorthover@apple.com> | 2013-06-21 23:05:33 +0000 |
| commit | 1711cc930bda8d27e87a2092bd220c18e4600c98 (patch) | |
| tree | d729b08354346fbf0054495aaa45d9a9f1a62883 /clang/lib/CodeGen | |
| parent | 97c6c5bd9869a3c929cef0880425c198b70b6d46 (diff) | |
| download | bcm5719-llvm-1711cc930bda8d27e87a2092bd220c18e4600c98.tar.gz bcm5719-llvm-1711cc930bda8d27e87a2092bd220c18e4600c98.zip | |
Teach ARM va_arg to ignore empty structs.
Empty structs are ignored for parameter passing purposes, but va_arg was
incrementing the pointer anyway which could lead to va_list getting out of
sync.
llvm-svn: 184605
Diffstat (limited to 'clang/lib/CodeGen')
| -rw-r--r-- | clang/lib/CodeGen/TargetInfo.cpp | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/TargetInfo.cpp b/clang/lib/CodeGen/TargetInfo.cpp index c9f0d757946..bef0d058d6f 100644 --- a/clang/lib/CodeGen/TargetInfo.cpp +++ b/clang/lib/CodeGen/TargetInfo.cpp @@ -3593,6 +3593,12 @@ llvm::Value *ARMABIInfo::EmitVAArg(llvm::Value *VAListAddr, QualType Ty, llvm::Value *VAListAddrAsBPP = Builder.CreateBitCast(VAListAddr, BPP, "ap"); llvm::Value *Addr = Builder.CreateLoad(VAListAddrAsBPP, "ap.cur"); + if (isEmptyRecord(getContext(), Ty, true)) { + // These are ignored for parameter passing purposes. + llvm::Type *PTy = llvm::PointerType::getUnqual(CGF.ConvertType(Ty)); + return Builder.CreateBitCast(Addr, PTy); + } + uint64_t Size = CGF.getContext().getTypeSize(Ty) / 8; uint64_t TyAlign = CGF.getContext().getTypeAlign(Ty) / 8; bool IsIndirect = false; |

