atomic_library_1
authorLLVM Packaging Team <pkg-llvm-team@lists.alioth.debian.org>
Sun, 12 Mar 2017 08:49:18 +0000 (08:49 +0000)
committerSylvestre Ledru <sylvestre@debian.org>
Sun, 12 Mar 2017 08:49:18 +0000 (08:49 +0000)
===================================================================

Gbp-Pq: Name atomic_library_1.diff

clang/lib/Basic/Targets.cpp
clang/test/CodeGen/linux-arm-atomic.c

index 9c6eaffd54fe8148ad45e6ff2f02d3a70eba8d03..83f2c045afe483177eb8cd0b7138b0e8450ccb2e 100644 (file)
@@ -4467,6 +4467,20 @@ class ARMTargetInfo : public TargetInfo {
     }
   }
 
+  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:
   ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
       : TargetInfo(Triple), FPMath(FP_Default),
index 116925a585b69cb7c4121764767dd8a4dd852fed..0e0fa902549757ffa741cf7f5731ff7e9a532582 100644 (file)
@@ -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