diff options
Diffstat (limited to 'debian/patches/atomic_library_1.diff')
-rw-r--r-- | debian/patches/atomic_library_1.diff | 46 |
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 |