From 020daa9476b5a2c8bce553066b0121d39de151fe Mon Sep 17 00:00:00 2001 From: Daniel Dunbar Date: Sat, 12 Sep 2009 01:00:39 +0000 Subject: [PATCH] Stub out room for ARM APCS ABI implementation (and AAPCS_VFP, although you can't hit this via command line options yet). llvm-svn: 81595 --- clang/lib/CodeGen/TargetABIInfo.cpp | 41 +++++++++++++++++++++++-- clang/test/CodeGen/arm-apcs-arguments.c | 6 ++++ 2 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 clang/test/CodeGen/arm-apcs-arguments.c diff --git a/clang/lib/CodeGen/TargetABIInfo.cpp b/clang/lib/CodeGen/TargetABIInfo.cpp index 1ebad5dd5c24..c85504e64cc3 100644 --- a/clang/lib/CodeGen/TargetABIInfo.cpp +++ b/clang/lib/CodeGen/TargetABIInfo.cpp @@ -1327,6 +1327,22 @@ llvm::Value *PIC16ABIInfo::EmitVAArg(llvm::Value *VAListAddr, QualType Ty, namespace { class ARMABIInfo : public ABIInfo { +public: + enum ABIKind { + APCS = 0, + AAPCS = 1, + AAPCS_VFP + }; + +private: + ABIKind Kind; + +public: + ARMABIInfo(ABIKind _Kind) : Kind(_Kind) {} + +private: + ABIKind getABIKind() const { return Kind; } + ABIArgInfo classifyReturnType(QualType RetTy, ASTContext &Context, llvm::LLVMContext &VMCOntext) const; @@ -1352,6 +1368,21 @@ void ARMABIInfo::computeInfo(CGFunctionInfo &FI, ASTContext &Context, it != ie; ++it) { it->info = classifyArgumentType(it->type, Context, VMContext); } + + // ARM always overrides the calling convention. + switch (getABIKind()) { + case APCS: + FI.setEffectiveCallingConvention(llvm::CallingConv::ARM_APCS); + break; + + case AAPCS: + FI.setEffectiveCallingConvention(llvm::CallingConv::ARM_AAPCS); + break; + + case AAPCS_VFP: + FI.setEffectiveCallingConvention(llvm::CallingConv::ARM_AAPCS_VFP); + break; + } } ABIArgInfo ARMABIInfo::classifyArgumentType(QualType Ty, @@ -1544,8 +1575,14 @@ const ABIInfo &CodeGenTypes::getABIInfo() const { case llvm::Triple::arm: case llvm::Triple::thumb: - // FIXME: Support for OABI? - return *(TheABIInfo = new ARMABIInfo()); + // FIXME: We should get this from the target, we also need a -target-abi + // because the user should have some control over this. + // + // FIXME: We want to know the float calling convention as well. + if (Triple.getOS() == llvm::Triple::Darwin) + return *(TheABIInfo = new ARMABIInfo(ARMABIInfo::APCS)); + + return *(TheABIInfo = new ARMABIInfo(ARMABIInfo::AAPCS)); case llvm::Triple::pic16: return *(TheABIInfo = new PIC16ABIInfo()); diff --git a/clang/test/CodeGen/arm-apcs-arguments.c b/clang/test/CodeGen/arm-apcs-arguments.c new file mode 100644 index 000000000000..f64680649049 --- /dev/null +++ b/clang/test/CodeGen/arm-apcs-arguments.c @@ -0,0 +1,6 @@ +// RUN: clang-cc -triple armv7-apple-darwin9 -emit-llvm -o - %s | FileCheck %s + +// CHECK: define arm_apcscc signext i8 @f0() +char f0(void) { + return 0; +}