forked from OSchip/llvm-project
[sanitizer_common] Use atomic builtin in sanitizer_atomic_clang.h
As discussed in D118021 <https://reviews.llvm.org/D118021>, `clang -m32` on Solaris/sparcv9 currently incorrectly doesn't inline atomics on 8-byte operands, unlike `gcc`. With the workaround in that patch in place, we're left with may undefined references to `__sync_val_compare_and_swap_8`, which isn't provided by `libatomic`. This reference is due to the use of `__sync_val_compare_and_swap` in `sanitizer_atomic_clang.h`'s `atomic_compare_exchange_strong`. As is already done in `scudo/standalone/atomic_helpers.h`, using `__atomic_compare_exchange` instead avoids this problem. Tested on `sparcv9-sun-solaris2.11`, `amd64-pc-solaris2.11`, and `x86_64-pc-linux-gnu`. Differential Revision: https://reviews.llvm.org/D118024
This commit is contained in:
parent
f1c18acb07
commit
067650fd12
|
@ -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>
|
||||
|
|
Loading…
Reference in New Issue