aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2009-09-12 01:00:39 +0000
committerDaniel Dunbar <daniel@zuster.org>2009-09-12 01:00:39 +0000
commit5e7bacef79f7725f4abc45e2a5eccedae40dfcd3 (patch)
tree853c012ec2944f7162d6ba3399b7b834209c9881 /lib/CodeGen
parent34d91fddd0252d64456cdcea0bd22073f006f4e2 (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.cpp41
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());