diff options
author | Daniel Dunbar <daniel@zuster.org> | 2009-09-12 01:00:39 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2009-09-12 01:00:39 +0000 |
commit | 5e7bacef79f7725f4abc45e2a5eccedae40dfcd3 (patch) | |
tree | 853c012ec2944f7162d6ba3399b7b834209c9881 /lib/CodeGen | |
parent | 34d91fddd0252d64456cdcea0bd22073f006f4e2 (diff) |
Stub out room for ARM APCS ABI implementation (and AAPCS_VFP, although you can't
hit this via command line options yet).
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@81595 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen')
-rw-r--r-- | lib/CodeGen/TargetABIInfo.cpp | 41 |
1 files changed, 39 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()); |