aboutsummaryrefslogtreecommitdiff
path: root/contrib
diff options
context:
space:
mode:
authorAndrew Turner <andrew@FreeBSD.org>2014-03-22 09:23:13 +0000
committerAndrew Turner <andrew@FreeBSD.org>2014-03-22 09:23:13 +0000
commit856c73664bf3a16293fd3acf80e85eba1fdba278 (patch)
tree41ad66b8fc304358dce832d2147d36084c20997f /contrib
parentf857fb4fa3e67cccee8c2d3aaf4a8048b193465f (diff)
downloadsrc-856c73664bf3a16293fd3acf80e85eba1fdba278.tar.gz
src-856c73664bf3a16293fd3acf80e85eba1fdba278.zip
Pull in r201662 from upstream clang trunk:
Add FreeBSD ARM EABI hard-float support Patch by Andrew Turner.
Notes
Notes: svn path=/head/; revision=263619
Diffstat (limited to 'contrib')
-rw-r--r--contrib/llvm/tools/clang/lib/Driver/ToolChains.cpp1
-rw-r--r--contrib/llvm/tools/clang/lib/Driver/Tools.cpp23
2 files changed, 21 insertions, 3 deletions
diff --git a/contrib/llvm/tools/clang/lib/Driver/ToolChains.cpp b/contrib/llvm/tools/clang/lib/Driver/ToolChains.cpp
index f5dc3dfb2d12..d98c65463115 100644
--- a/contrib/llvm/tools/clang/lib/Driver/ToolChains.cpp
+++ b/contrib/llvm/tools/clang/lib/Driver/ToolChains.cpp
@@ -2034,6 +2034,7 @@ Tool *FreeBSD::buildLinker() const {
bool FreeBSD::UseSjLjExceptions() const {
// FreeBSD uses SjLj exceptions on ARM oabi.
switch (getTriple().getEnvironment()) {
+ case llvm::Triple::GNUEABIHF:
case llvm::Triple::GNUEABI:
case llvm::Triple::EABI:
return false;
diff --git a/contrib/llvm/tools/clang/lib/Driver/Tools.cpp b/contrib/llvm/tools/clang/lib/Driver/Tools.cpp
index b37b31cec987..423c245a4dd4 100644
--- a/contrib/llvm/tools/clang/lib/Driver/Tools.cpp
+++ b/contrib/llvm/tools/clang/lib/Driver/Tools.cpp
@@ -737,8 +737,15 @@ static StringRef getARMFloatABI(const Driver &D,
}
case llvm::Triple::FreeBSD:
- // FreeBSD defaults to soft float
- FloatABI = "soft";
+ switch(Triple.getEnvironment()) {
+ case llvm::Triple::GNUEABIHF:
+ FloatABI = "hard";
+ break;
+ default:
+ // FreeBSD defaults to soft float
+ FloatABI = "soft";
+ break;
+ }
break;
default:
@@ -5776,8 +5783,18 @@ void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
}
} else if (getToolChain().getArch() == llvm::Triple::arm ||
getToolChain().getArch() == llvm::Triple::thumb) {
- CmdArgs.push_back("-mfpu=softvfp");
+ const Driver &D = getToolChain().getDriver();
+ llvm::Triple Triple = getToolChain().getTriple();
+ StringRef FloatABI = getARMFloatABI(D, Args, Triple);
+
+ if (FloatABI == "hard") {
+ CmdArgs.push_back("-mfpu=vfp");
+ } else {
+ CmdArgs.push_back("-mfpu=softvfp");
+ }
+
switch(getToolChain().getTriple().getEnvironment()) {
+ case llvm::Triple::GNUEABIHF:
case llvm::Triple::GNUEABI:
case llvm::Triple::EABI:
CmdArgs.push_back("-meabi=5");