diff options
-rw-r--r-- | lib/CodeGen/TargetABIInfo.cpp | 41 | ||||
-rw-r--r-- | test/CodeGen/arm-apcs-arguments.c | 6 |
2 files changed, 45 insertions, 2 deletions
diff --git a/lib/CodeGen/TargetABIInfo.cpp b/lib/CodeGen/TargetABIInfo.cpp index 1ebad5dd5c..c85504e64c 100644 --- a/lib/CodeGen/TargetABIInfo.cpp +++ b/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/test/CodeGen/arm-apcs-arguments.c b/test/CodeGen/arm-apcs-arguments.c new file mode 100644 index 0000000000..f646806490 --- /dev/null +++ b/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; +} |