From 4ea31ab3698e9fae8d27f5ddc9e9aff6efd5f2d0 Mon Sep 17 00:00:00 2001 From: Charles Davis Date: Sat, 13 Feb 2010 15:54:06 +0000 Subject: [PATCH] Emit the 'alignstack' LLVM function attribute when we encounter a function marked 'force_align_arg_pointer'. Almost there; now all I need to do is finish up the backend. llvm-svn: 96100 --- clang/lib/CodeGen/TargetInfo.cpp | 17 +++++++++++++++++ clang/test/CodeGen/function-attributes.c | 8 ++++++++ 2 files changed, 25 insertions(+) diff --git a/clang/lib/CodeGen/TargetInfo.cpp b/clang/lib/CodeGen/TargetInfo.cpp index 6f650fc2ef70..a3d76c660af0 100644 --- a/clang/lib/CodeGen/TargetInfo.cpp +++ b/clang/lib/CodeGen/TargetInfo.cpp @@ -325,6 +325,9 @@ class X86_32TargetCodeGenInfo : public TargetCodeGenInfo { public: X86_32TargetCodeGenInfo(ASTContext &Context, bool d, bool p) :TargetCodeGenInfo(new X86_32ABIInfo(Context, d, p)) {} + + void SetTargetAttributes(const Decl *D, llvm::GlobalValue *GV, + CodeGen::CodeGenModule &CGM) const; }; } @@ -551,6 +554,20 @@ llvm::Value *X86_32ABIInfo::EmitVAArg(llvm::Value *VAListAddr, QualType Ty, return AddrTyped; } +void X86_32TargetCodeGenInfo::SetTargetAttributes(const Decl *D, + llvm::GlobalValue *GV, + CodeGen::CodeGenModule &CGM) const { + if (const FunctionDecl *FD = dyn_cast(D)) { + if (FD->hasAttr()) { + // Get the LLVM function. + llvm::Function *Fn = cast(GV); + + // Now add the 'alignstack' attribute with a value of 16. + Fn->addFnAttr(llvm::Attribute::constructStackAlignmentFromInt(16)); + } + } +} + namespace { /// X86_64ABIInfo - The X86_64 ABI information. class X86_64ABIInfo : public ABIInfo { diff --git a/clang/test/CodeGen/function-attributes.c b/clang/test/CodeGen/function-attributes.c index 8ddaa28eed03..3a1030a61b90 100644 --- a/clang/test/CodeGen/function-attributes.c +++ b/clang/test/CodeGen/function-attributes.c @@ -81,3 +81,11 @@ void f14(int a) { // CHECK: { void f15(void) { } + +// PR5254 +// CHECK: define void @f16 +// CHECK: alignstack(16) +// CHECK: { +void __attribute__((force_align_arg_pointer)) f16(void) { +} +