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 | 3d9f47fe6f9ac0f4b47b443a12f118e1f30a70bb (patch) | |
| tree | 42e4e893e83bb96b5e7e89fbe4d6b708eb7f71a5 | |
| parent | 52d00e4815bc4c89016c9e57fbfffb6513b68c6d (diff) | |
| download | bcm5719-llvm-3d9f47fe6f9ac0f4b47b443a12f118e1f30a70bb.tar.gz bcm5719-llvm-3d9f47fe6f9ac0f4b47b443a12f118e1f30a70bb.zip | |
Fix alignment on alloca's for parameters using ABIArgInfo::Expand.
llvm-svn: 143658
| -rw-r--r-- | clang/lib/CodeGen/CGCall.cpp | 9 | ||||
| -rw-r--r-- | clang/test/CodeGen/align-param.c | 9 |
2 files changed, 14 insertions, 4 deletions
diff --git a/clang/lib/CodeGen/CGCall.cpp b/clang/lib/CodeGen/CGCall.cpp index 6e3b70cef85..92ac5ae560e 100644 --- a/clang/lib/CodeGen/CGCall.cpp +++ b/clang/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/clang/test/CodeGen/align-param.c b/clang/test/CodeGen/align-param.c index 15a8c2a79a3..8907f66409a 100644 --- a/clang/test/CodeGen/align-param.c +++ b/clang/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 |

