summaryrefslogtreecommitdiff
path: root/debian/patches/atomic_library_1.diff
diff options
context:
space:
mode:
Diffstat (limited to 'debian/patches/atomic_library_1.diff')
-rw-r--r--debian/patches/atomic_library_1.diff46
1 files changed, 46 insertions, 0 deletions
diff --git a/debian/patches/atomic_library_1.diff b/debian/patches/atomic_library_1.diff
new file mode 100644
index 0000000..b73581d
--- /dev/null
+++ b/debian/patches/atomic_library_1.diff
@@ -0,0 +1,46 @@
+---
+ clang/lib/Basic/Targets.cpp | 14 ++++++++++++++
+ clang/test/CodeGen/linux-arm-atomic.c | 10 ++++++++++
+ 2 files changed, 24 insertions(+)
+
+--- a/clang/lib/Basic/Targets.cpp
++++ b/clang/lib/Basic/Targets.cpp
+@@ -4414,6 +4414,20 @@ protected:
+ Builder.defineMacro("__ELF__");
+ }
+
++ static bool shouldUseInlineAtomic(const llvm::Triple &T) {
++ // On linux, binaries targeting old cpus call functions in libgcc to
++ // perform atomic operations. The implementation in libgcc then calls into
++ // 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;
++ StringRef ArchName = T.getArchName();
++ if (ArchName.startswith("armv6") || ArchName.startswith("armv7"))
++ return true;
++ return false;
++ }
++
+ public:
+ RTEMSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
+ : OSTargetInfo<Target>(Triple, Opts) {
+--- a/clang/test/CodeGen/linux-arm-atomic.c
++++ b/clang/test/CodeGen/linux-arm-atomic.c
+@@ -1,5 +1,15 @@
+ // 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
++
++typedef int _Atomic_word;
++_Atomic_word exchange_and_add(volatile _Atomic_word *__mem, int __val) {
++ return __atomic_fetch_add(__mem, __val, __ATOMIC_ACQ_REL);
++}
++
++// CHECK: define {{.*}} @exchange_and_add
++// CHECK: atomicrmw {{.*}} add
++// 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
+ // RUN: %clang_cc1 %s -emit-llvm -o - -triple=armv6-unknown-bitrig | FileCheck %s