diff options
author | Eli Friedman <eli.friedman@gmail.com> | 2011-11-03 21:39:02 +0000 |
---|---|---|
committer | Eli Friedman <eli.friedman@gmail.com> | 2011-11-03 21:39:02 +0000 |
commit | 1bb94a417a53a524784ec98f232acc70e62370b2 (patch) | |
tree | 30bcbd285f2d87e6de8fc378d92186fb2df6d4c6 | |
parent | 05272a659437fc6ec7fa5a7c3f3fc6eb220a6fa2 (diff) |
Fix alignment on alloca's for parameters using ABIArgInfo::Expand.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@143658 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/CodeGen/CGCall.cpp | 9 | ||||
-rw-r--r-- | test/CodeGen/align-param.c | 9 |
2 files changed, 14 insertions, 4 deletions
diff --git a/lib/CodeGen/CGCall.cpp b/lib/CodeGen/CGCall.cpp index 6e3b70cef8..92ac5ae560 100644 --- a/lib/CodeGen/CGCall.cpp +++ b/lib/CodeGen/CGCall.cpp @@ -1058,10 +1058,11 @@ void CodeGenFunction::EmitFunctionProlog(const CGFunctionInfo &FI, // If this structure was expanded into multiple arguments then // we need to create a temporary and reconstruct it from the // arguments. - llvm::Value *Temp = CreateMemTemp(Ty, Arg->getName() + ".addr"); - llvm::Function::arg_iterator End = - ExpandTypeFromArgs(Ty, MakeAddrLValue(Temp, Ty), AI); - EmitParmDecl(*Arg, Temp, ArgNo); + llvm::AllocaInst *Alloca = CreateMemTemp(Ty); + Alloca->setAlignment(getContext().getDeclAlign(Arg).getQuantity()); + LValue LV = MakeAddrLValue(Alloca, Ty, Alloca->getAlignment()); + llvm::Function::arg_iterator End = ExpandTypeFromArgs(Ty, LV, AI); + EmitParmDecl(*Arg, Alloca, ArgNo); // Name the arguments used in expansion and increment AI. unsigned Index = 0; diff --git a/test/CodeGen/align-param.c b/test/CodeGen/align-param.c index 15a8c2a79a..8907f66409 100644 --- a/test/CodeGen/align-param.c +++ b/test/CodeGen/align-param.c @@ -7,3 +7,12 @@ int test (long long x) { } // CHECK: define i32 @test // CHECK: alloca i64, align 8 + + +// Make sure we honor the aligned attribute. +struct X { int x,y,z,a; }; +int test2(struct X x __attribute((aligned(16)))) { + return x.z; +} +// CHECK: define i32 @test2 +// CHECK: alloca %struct.X, align 16 |