diff options
author | Reid Kleckner <reid@kleckner.net> | 2014-04-10 19:09:43 +0000 |
---|---|---|
committer | Reid Kleckner <reid@kleckner.net> | 2014-04-10 19:09:43 +0000 |
commit | d378a71b4e38127e7d658d2e6efa551731b78d8c (patch) | |
tree | 706bb7af4b5b228aa3ca72d0647e3a6807d8bde6 /clang/lib/CodeGen/TargetInfo.cpp | |
parent | 7701194d61d41b531a9d99e419b4a200091b27a7 (diff) | |
download | bcm5719-llvm-d378a71b4e38127e7d658d2e6efa551731b78d8c.tar.gz bcm5719-llvm-d378a71b4e38127e7d658d2e6efa551731b78d8c.zip |
inalloca: Pad the struct *after* inserting each arg
This ensures that the overall struct size will be a multiple of 4, as
required by the ABI.
llvm-svn: 205981
Diffstat (limited to 'clang/lib/CodeGen/TargetInfo.cpp')
-rw-r--r-- | clang/lib/CodeGen/TargetInfo.cpp | 16 |
1 files changed, 7 insertions, 9 deletions
diff --git a/clang/lib/CodeGen/TargetInfo.cpp b/clang/lib/CodeGen/TargetInfo.cpp index d2e57ac73be..1f98920ed40 100644 --- a/clang/lib/CodeGen/TargetInfo.cpp +++ b/clang/lib/CodeGen/TargetInfo.cpp @@ -1013,24 +1013,22 @@ void X86_32ABIInfo::addFieldToArgStruct(SmallVector<llvm::Type *, 6> &FrameFields, unsigned &StackOffset, ABIArgInfo &Info, QualType Type) const { + assert(StackOffset % 4U == 0 && "unaligned inalloca struct"); + Info = ABIArgInfo::getInAlloca(FrameFields.size()); + FrameFields.push_back(CGT.ConvertTypeForMem(Type)); + StackOffset += getContext().getTypeSizeInChars(Type).getQuantity(); + // Insert padding bytes to respect alignment. For x86_32, each argument is 4 // byte aligned. - unsigned Align = 4U; - if (Info.getKind() == ABIArgInfo::Indirect && Info.getIndirectByVal()) - Align = std::max(Align, Info.getIndirectAlign()); - if (StackOffset & (Align - 1)) { + if (StackOffset % 4U) { unsigned OldOffset = StackOffset; - StackOffset = llvm::RoundUpToAlignment(StackOffset, Align); + StackOffset = llvm::RoundUpToAlignment(StackOffset, 4U); unsigned NumBytes = StackOffset - OldOffset; assert(NumBytes); llvm::Type *Ty = llvm::Type::getInt8Ty(getVMContext()); Ty = llvm::ArrayType::get(Ty, NumBytes); FrameFields.push_back(Ty); } - - Info = ABIArgInfo::getInAlloca(FrameFields.size()); - FrameFields.push_back(CGT.ConvertTypeForMem(Type)); - StackOffset += getContext().getTypeSizeInChars(Type).getQuantity(); } void X86_32ABIInfo::rewriteWithInAlloca(CGFunctionInfo &FI) const { |