Revert "Revert "[sanitizer_common] Use atomic builtin in sanitizer_atomic_clang.h"" 48/292048/1
authorŁukasz Stelmach <l.stelmach@samsung.com>
Wed, 26 Apr 2023 15:26:13 +0000 (17:26 +0200)
committerŁukasz Stelmach <l.stelmach@samsung.com>
Wed, 26 Apr 2023 15:28:02 +0000 (17:28 +0200)
This reverts commit 6b19188ca7ff28a9c0f654d36572bc716c189a8f.

Commit 6b19188ca7ff28a9c0f654d36572bc716c189a8f is unnecessary if
libclang_rt.asan.so is linked against libatomic.

Change-Id: I01d9ceac32ae360f395f3e888d65bd07ec24e6cf
Signed-off-by: Łukasz Stelmach <l.stelmach@samsung.com>
compiler-rt/lib/sanitizer_common/sanitizer_atomic_clang.h

index ccf18f0..4318d64 100644 (file)
@@ -74,13 +74,12 @@ template <typename T>
 inline bool atomic_compare_exchange_strong(volatile T *a, typename T::Type *cmp,
                                            typename T::Type xchg,
                                            memory_order mo) {
-  typedef typename T::Type Type;
-  Type cmpv = *cmp;
-  Type prev;
-  prev = __sync_val_compare_and_swap(&a->val_dont_use, cmpv, xchg);
-  if (prev == cmpv) return true;
-  *cmp = prev;
-  return false;
+  // Transitioned from __sync_val_compare_and_swap to support targets like
+  // SPARC V8 that cannot inline atomic cmpxchg.  __atomic_compare_exchange
+  // can then be resolved from libatomic.  __ATOMIC_SEQ_CST is used to best
+  // match the __sync builtin memory order.
+  return __atomic_compare_exchange(&a->val_dont_use, cmp, &xchg, false,
+                                   __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
 }
 
 template<typename T>