1 Index: tools/clang/lib/Driver/ToolChains.cpp
2 ===================================================================
3 --- tools/clang/lib/Driver/ToolChains.cpp
4 +++ tools/clang/lib/Driver/ToolChains.cpp
6 bool FreeBSD::UseSjLjExceptions() const {
7 // FreeBSD uses SjLj exceptions on ARM oabi.
8 switch (getTriple().getEnvironment()) {
9 + case llvm::Triple::GNUEABIHF:
10 case llvm::Triple::GNUEABI:
11 case llvm::Triple::EABI:
13 Index: tools/clang/lib/Driver/Tools.cpp
14 ===================================================================
15 --- tools/clang/lib/Driver/Tools.cpp
16 +++ tools/clang/lib/Driver/Tools.cpp
20 case llvm::Triple::FreeBSD:
21 - // FreeBSD defaults to soft float
23 + switch(Triple.getEnvironment()) {
24 + case llvm::Triple::GNUEABIHF:
28 + // FreeBSD defaults to soft float
35 @@ -5776,8 +5783,18 @@
37 } else if (getToolChain().getArch() == llvm::Triple::arm ||
38 getToolChain().getArch() == llvm::Triple::thumb) {
39 - CmdArgs.push_back("-mfpu=softvfp");
40 + const Driver &D = getToolChain().getDriver();
41 + llvm::Triple Triple = getToolChain().getTriple();
42 + StringRef FloatABI = getARMFloatABI(D, Args, Triple);
44 + if (FloatABI == "hard") {
45 + CmdArgs.push_back("-mfpu=vfp");
47 + CmdArgs.push_back("-mfpu=softvfp");
50 switch(getToolChain().getTriple().getEnvironment()) {
51 + case llvm::Triple::GNUEABIHF:
52 case llvm::Triple::GNUEABI:
53 case llvm::Triple::EABI:
54 CmdArgs.push_back("-meabi=5");
55 Index: tools/clang/test/Driver/freebsd.c
56 ===================================================================
57 --- tools/clang/test/Driver/freebsd.c
58 +++ tools/clang/test/Driver/freebsd.c
60 // RUN: | FileCheck --check-prefix=CHECK-ARM %s
61 // CHECK-ARM: clang{{.*}}" "-cc1"{{.*}}" "-fsjlj-exceptions"
62 // CHECK-ARM: as{{.*}}" "-mfpu=softvfp"{{.*}}"-matpcs"
63 +// CHECK-ARM-EABI-NOT: as{{.*}}" "-mfpu=vfp"
65 // RUN: %clang %s -### -target arm-gnueabi-freebsd10.0 2>&1 \
66 // RUN: | FileCheck --check-prefix=CHECK-ARM-EABI %s
67 // CHECK-ARM-EABI-NOT: clang{{.*}}" "-cc1"{{.*}}" "-fsjlj-exceptions"
68 // CHECK-ARM-EABI: as{{.*}}" "-mfpu=softvfp" "-meabi=5"
69 +// CHECK-ARM-EABI-NOT: as{{.*}}" "-mfpu=vfp"
70 // CHECK-ARM-EABI-NOT: as{{.*}}" "-matpcs"
72 +// RUN: %clang %s -### -o %t.o -target arm-gnueabihf-freebsd10.0 -no-integrated-as 2>&1 \
73 +// RUN: | FileCheck --check-prefix=CHECK-ARM-EABIHF %s
74 +// CHECK-ARM-EABIHF-NOT: clang{{.*}}" "-cc1"{{.*}}" "-fsjlj-exceptions"
75 +// CHECK-ARM-EABIHF: as{{.*}}" "-mfpu=vfp" "-meabi=5"
76 +// CHECK-ARM-EABIHF-NOT: as{{.*}}" "-mfpu=softvfp"
77 +// CHECK-ARM-EABIHF-NOT: as{{.*}}" "-matpcs"
79 // RUN: %clang -target x86_64-pc-freebsd8 %s -### -flto -o %t.o 2>&1 \
80 // RUN: | FileCheck --check-prefix=CHECK-LTO %s
81 // CHECK-LTO: ld{{.*}}" "-plugin{{.*}}LLVMgold.so