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.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@96100 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Charles Davis 2010-02-13 15:54:06 +00:00
Родитель fd3194bedb
Коммит 74f7293eb3
2 изменённых файлов: 25 добавлений и 0 удалений

Просмотреть файл

@ -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<FunctionDecl>(D)) {
if (FD->hasAttr<X86ForceAlignArgPointerAttr>()) {
// Get the LLVM function.
llvm::Function *Fn = cast<llvm::Function>(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 {

Просмотреть файл

@ -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) {
}