diff options
author | David Tweed <david.tweed@arm.com> | 2012-10-25 13:33:01 +0000 |
---|---|---|
committer | David Tweed <david.tweed@arm.com> | 2012-10-25 13:33:01 +0000 |
commit | 8f67653d2611dac4f5f5a705e7576933aae29876 (patch) | |
tree | fc11edb1050c7e827ec5892849605ef2985a76ab /clang/lib | |
parent | 5fc11b3554e7c742368e9a776018f3f9a71c0b70 (diff) | |
download | bcm5719-llvm-8f67653d2611dac4f5f5a705e7576933aae29876.tar.gz bcm5719-llvm-8f67653d2611dac4f5f5a705e7576933aae29876.zip |
Modify the targets to set appropriate calling convention defaults and C variables when using a gnueabihf or aapcs-vfp target.
Tested by me and Wei-Ren Chen.
llvm-svn: 166679
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/Basic/Targets.cpp | 6 | ||||
-rw-r--r-- | clang/lib/CodeGen/TargetInfo.cpp | 8 |
2 files changed, 8 insertions, 6 deletions
diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp index ba96185f72d..9b758d1c212 100644 --- a/clang/lib/Basic/Targets.cpp +++ b/clang/lib/Basic/Targets.cpp @@ -3077,7 +3077,7 @@ public: } // FIXME: Override "preferred align" for double and long long. - } else if (Name == "aapcs") { + } else if (Name == "aapcs" || Name == "aapcs-vfp") { IsAAPCS = true; // FIXME: Enumerated types are variable width in straight AAPCS. } else if (Name == "aapcs-linux") { @@ -3212,13 +3212,13 @@ public: if ('5' <= CPUArch[0] && CPUArch[0] <= '7') Builder.defineMacro("__THUMB_INTERWORK__"); - if (ABI == "aapcs" || ABI == "aapcs-linux") { + if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") { // M-class CPUs on Darwin follow AAPCS, but not EABI. if (!(getTriple().isOSDarwin() && CPUProfile == "M")) Builder.defineMacro("__ARM_EABI__"); Builder.defineMacro("__ARM_PCS", "1"); - if (!SoftFloat && !SoftFloatABI) + if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp") Builder.defineMacro("__ARM_PCS_VFP", "1"); } diff --git a/clang/lib/CodeGen/TargetInfo.cpp b/clang/lib/CodeGen/TargetInfo.cpp index 2c2d17df77b..0a6ebb897e9 100644 --- a/clang/lib/CodeGen/TargetInfo.cpp +++ b/clang/lib/CodeGen/TargetInfo.cpp @@ -2933,7 +2933,9 @@ void ARMABIInfo::computeInfo(CGFunctionInfo &FI) const { // Calling convention as default by an ABI. llvm::CallingConv::ID DefaultCC; - if (isEABI()) + if (getContext().getTargetInfo().getTriple().getEnvironmentName()=="gnueabihf") + DefaultCC = llvm::CallingConv::ARM_AAPCS_VFP; + else if (isEABI()) DefaultCC = llvm::CallingConv::ARM_AAPCS; else DefaultCC = llvm::CallingConv::ARM_APCS; @@ -4187,10 +4189,10 @@ const TargetCodeGenInfo &CodeGenModule::getTargetCodeGenInfo() { case llvm::Triple::thumb: { ARMABIInfo::ABIKind Kind = ARMABIInfo::AAPCS; - if (strcmp(getContext().getTargetInfo().getABI(), "apcs-gnu") == 0) Kind = ARMABIInfo::APCS; - else if (CodeGenOpts.FloatABI == "hard") + else if (CodeGenOpts.FloatABI == "hard" || + (CodeGenOpts.FloatABI != "soft" && Triple.getEnvironment()==llvm::Triple::GNUEABIHF)) Kind = ARMABIInfo::AAPCS_VFP; switch (Triple.getOS()) { |