From 067650fd12fccf44de1d7c148b50658831c672b0 Mon Sep 17 00:00:00 2001 From: Rainer Orth Date: Sat, 29 Jan 2022 22:52:55 +0100 Subject: [PATCH] [sanitizer_common] Use atomic builtin in sanitizer_atomic_clang.h As discussed in 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 --- .../lib/sanitizer_common/sanitizer_atomic_clang.h | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_atomic_clang.h b/compiler-rt/lib/sanitizer_common/sanitizer_atomic_clang.h index fc13ca52dda7..c2b22cf572a6 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_atomic_clang.h +++ b/compiler-rt/lib/sanitizer_common/sanitizer_atomic_clang.h @@ -74,13 +74,12 @@ template 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