summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorEd Schouten <ed@80386.nl>2013-06-15 09:40:14 +0000
committerEd Schouten <ed@80386.nl>2013-06-15 09:40:14 +0000
commit60afa2d923e6032b3295a87ca5144322437a59ce (patch)
tree6356965092e006ce572b7432f44c17fd63cf39ff /clang
parent8e8415f5ab255b051f15d24b60f80d83ffef6753 (diff)
downloadbcm5719-llvm-60afa2d923e6032b3295a87ca5144322437a59ce.tar.gz
bcm5719-llvm-60afa2d923e6032b3295a87ca5144322437a59ce.zip
Emit native implementations of atomic operations on FreeBSD/armv6.
Just like on Linux, FreeBSD/armv6 assumes the system supports ldrex/strex unconditionally. It is also used by the kernel. We can therefore enable support for it, like we do on Linux. While there, change one of the unit tests to explicitly test against armv5 instead of armv7, as it actually tests whether libcalls are emitted. llvm-svn: 184040
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/Basic/Targets.cpp4
-rw-r--r--clang/test/CodeGen/c11atomics.c2
-rw-r--r--clang/test/CodeGen/linux-arm-atomic.c1
3 files changed, 4 insertions, 3 deletions
diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp
index baf83c1a14c..f3d7e0ce671 100644
--- a/clang/lib/Basic/Targets.cpp
+++ b/clang/lib/Basic/Targets.cpp
@@ -3534,8 +3534,8 @@ class ARMTargetInfo : public TargetInfo {
// the kernel which on armv6 and newer uses ldrex and strex. The net result
// is that if we assume the kernel is at least as recent as the hardware,
// it is safe to use atomic instructions on armv6 and newer.
- if (T.getOS() != llvm::Triple::Linux)
- return false;
+ if (T.getOS() != llvm::Triple::Linux && T.getOS() != llvm::Triple::FreeBSD)
+ return false;
StringRef ArchName = T.getArchName();
if (T.getArch() == llvm::Triple::arm) {
if (!ArchName.startswith("armv"))
diff --git a/clang/test/CodeGen/c11atomics.c b/clang/test/CodeGen/c11atomics.c
index 8d298af0191..6c845e9e01d 100644
--- a/clang/test/CodeGen/c11atomics.c
+++ b/clang/test/CodeGen/c11atomics.c
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 %s -emit-llvm -o - -triple=armv7-unknown-freebsd -std=c11 | FileCheck %s
+// RUN: %clang_cc1 %s -emit-llvm -o - -triple=armv5-unknown-freebsd -std=c11 | FileCheck %s
// Test that we are generating atomicrmw instructions, rather than
// compare-exchange loops for common atomic ops. This makes a big difference
diff --git a/clang/test/CodeGen/linux-arm-atomic.c b/clang/test/CodeGen/linux-arm-atomic.c
index c7ce1d228bb..b8535f82482 100644
--- a/clang/test/CodeGen/linux-arm-atomic.c
+++ b/clang/test/CodeGen/linux-arm-atomic.c
@@ -1,6 +1,7 @@
// RUN: %clang_cc1 %s -emit-llvm -o - -triple=armv7-unknown-linux | FileCheck %s
// RUN: %clang_cc1 %s -emit-llvm -o - -triple=armv6-unknown-linux | FileCheck %s
// RUN: %clang_cc1 %s -emit-llvm -o - -triple=thumbv7-unknown-linux | FileCheck %s
+// RUN: %clang_cc1 %s -emit-llvm -o - -triple=armv6-unknown-freebsd | FileCheck %s
typedef int _Atomic_word;
_Atomic_word exchange_and_add(volatile _Atomic_word *__mem, int __val) {
OpenPOWER on IntegriCloud