Revert "[sanitizer_common] Use atomic builtin in sanitizer_atomic_clang.h" 88/291988/2
authorDongkyun Son <dongkyun.s@samsung.com>
Wed, 26 Apr 2023 01:38:20 +0000 (10:38 +0900)
committerDongkyun Son <dongkyun.s@samsung.com>
Wed, 26 Apr 2023 01:42:27 +0000 (10:42 +0900)
To fix link issue on riscv64:
undefined reference to `__atomic_compare_exchange_1'

This reverts commit 067650fd12fccf44de1d7c148b50658831c672b0.

Change-Id: I19d557c9ffb34f5bdacbd14e457ddbfd53aadbb6

compiler-rt/lib/sanitizer_common/sanitizer_atomic_clang.h

index 4318d64..ccf18f0 100644 (file)
@@ -74,12 +74,13 @@ template <typename T>
 inline bool atomic_compare_exchange_strong(volatile T *a, typename T::Type *cmp,
                                            typename T::Type xchg,
                                            memory_order mo) {
-  // 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);
+  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;
 }
 
 template<typename T>