From: Renato Golin Date: Wed, 19 Feb 2014 10:44:07 +0000 (+0000) Subject: Add FreeBSD ARM EABI hard-float support X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f2e65351984ddf8944df7adc181275c1d6dc62c2;p=clang Add FreeBSD ARM EABI hard-float support Patch by Andrew Turner. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@201662 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Driver/ToolChains.cpp b/lib/Driver/ToolChains.cpp index 3784ee7351..8d17ab10f2 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 d1e58bac01..25dc5c5ea8 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 baacb93e4c..c2f14add36 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