diff --git a/lib/Driver/ToolChains.cpp b/lib/Driver/ToolChains.cpp index 3784ee7351669a9a81ee5b672e0c5b58cefe9314..8d17ab10f2ee4914b16daaf1836fc37e257f36aa 100644 --- a/lib/Driver/ToolChains.cpp +++ b/lib/Driver/ToolChains.cpp @@ -2428,6 +2428,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/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp index d1e58bac01426114e7a2267c5d049034ae5cddac..25dc5c5ea831e2301de017ecaf712823b16f58d1 100644 --- a/lib/Driver/Tools.cpp +++ b/lib/Driver/Tools.cpp @@ -639,8 +639,15 @@ StringRef tools::arm::getARMFloatABI(const Driver &D, const ArgList &Args, } 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: @@ -5913,8 +5920,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 = arm::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"); diff --git a/test/Driver/freebsd.c b/test/Driver/freebsd.c index baacb93e4c3c4ca533f28e52d266c955eae6e401..c2f14add36aa964d7e1430ea3b72bb213be7db2f 100644 --- a/test/Driver/freebsd.c +++ b/test/Driver/freebsd.c @@ -101,13 +101,22 @@ // RUN: | FileCheck --check-prefix=CHECK-ARM %s // CHECK-ARM: clang{{.*}}" "-cc1"{{.*}}" "-fsjlj-exceptions" // CHECK-ARM: as{{.*}}" "-mfpu=softvfp"{{.*}}"-matpcs" +// CHECK-ARM-EABI-NOT: as{{.*}}" "-mfpu=vfp" // RUN: %clang %s -### -o %t.o -target arm-gnueabi-freebsd10.0 -no-integrated-as 2>&1 \ // RUN: | FileCheck --check-prefix=CHECK-ARM-EABI %s // CHECK-ARM-EABI-NOT: clang{{.*}}" "-cc1"{{.*}}" "-fsjlj-exceptions" // CHECK-ARM-EABI: as{{.*}}" "-mfpu=softvfp" "-meabi=5" +// CHECK-ARM-EABI-NOT: as{{.*}}" "-mfpu=vfp" // CHECK-ARM-EABI-NOT: as{{.*}}" "-matpcs" +// RUN: %clang %s -### -o %t.o -target arm-gnueabihf-freebsd10.0 -no-integrated-as 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-ARM-EABIHF %s +// CHECK-ARM-EABIHF-NOT: clang{{.*}}" "-cc1"{{.*}}" "-fsjlj-exceptions" +// CHECK-ARM-EABIHF: as{{.*}}" "-mfpu=vfp" "-meabi=5" +// CHECK-ARM-EABIHF-NOT: as{{.*}}" "-mfpu=softvfp" +// CHECK-ARM-EABIHF-NOT: as{{.*}}" "-matpcs" + // RUN: %clang -target x86_64-pc-freebsd8 %s -### -flto -o %t.o 2>&1 \ // RUN: | FileCheck --check-prefix=CHECK-LTO %s // CHECK-LTO: ld{{.*}}" "-plugin{{.*}}LLVMgold.so