From e337bf303dde9258bc7e2c87722a270fed96460b Mon Sep 17 00:00:00 2001 From: Dmitry Vyukov Date: Fri, 9 Nov 2012 12:54:37 +0000 Subject: tsan: add __tsan_atomicX_compare_exchange_val() function It's easier to call from compiler module. git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@167611 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/tsan/rtl/tsan_interface_atomic.cc | 26 ++++++++++++++++++++++++++ lib/tsan/rtl/tsan_interface_atomic.h | 13 +++++++++++++ 2 files changed, 39 insertions(+) diff --git a/lib/tsan/rtl/tsan_interface_atomic.cc b/lib/tsan/rtl/tsan_interface_atomic.cc index 83b5d2577..b521fd557 100644 --- a/lib/tsan/rtl/tsan_interface_atomic.cc +++ b/lib/tsan/rtl/tsan_interface_atomic.cc @@ -189,6 +189,13 @@ static bool AtomicCAS(ThreadState *thr, uptr pc, return false; } +template +static T AtomicCAS(ThreadState *thr, uptr pc, + volatile T *a, T c, T v, morder mo) { + AtomicCAS(thr, pc, a, &c, v, mo); + return c; +} + static void AtomicFence(ThreadState *thr, uptr pc, morder mo) { __sync_synchronize(); } @@ -361,6 +368,25 @@ int __tsan_atomic64_compare_exchange_weak(volatile a64 *a, a64 *c, a64 v, SCOPED_ATOMIC(CAS, a, c, v, mo); } +a8 __tsan_atomic8_compare_exchange_val(volatile a8 *a, a8 c, a8 v, + morder mo) { + SCOPED_ATOMIC(CAS, a, c, v, mo); +} +a16 __tsan_atomic16_compare_exchange_val(volatile a16 *a, a16 c, a16 v, + morder mo) { + SCOPED_ATOMIC(CAS, a, c, v, mo); +} + +a32 __tsan_atomic32_compare_exchange_val(volatile a32 *a, a32 c, a32 v, + morder mo) { + SCOPED_ATOMIC(CAS, a, c, v, mo); +} + +a64 __tsan_atomic64_compare_exchange_val(volatile a64 *a, a64 c, a64 v, + morder mo) { + SCOPED_ATOMIC(CAS, a, c, v, mo); +} + void __tsan_atomic_thread_fence(morder mo) { char* a; SCOPED_ATOMIC(Fence, mo); diff --git a/lib/tsan/rtl/tsan_interface_atomic.h b/lib/tsan/rtl/tsan_interface_atomic.h index 2fa002197..d5c628275 100644 --- a/lib/tsan/rtl/tsan_interface_atomic.h +++ b/lib/tsan/rtl/tsan_interface_atomic.h @@ -123,6 +123,19 @@ int __tsan_atomic32_compare_exchange_strong(volatile __tsan_atomic32 *a, int __tsan_atomic64_compare_exchange_strong(volatile __tsan_atomic64 *a, __tsan_atomic64 *c, __tsan_atomic64 v, __tsan_memory_order mo); +__tsan_atomic8 __tsan_atomic8_compare_exchange_val( + volatile __tsan_atomic8 *a, __tsan_atomic8 c, __tsan_atomic8 v, + __tsan_memory_order mo); +__tsan_atomic16 __tsan_atomic16_compare_exchange_val( + volatile __tsan_atomic16 *a, __tsan_atomic16 c, __tsan_atomic16 v, + __tsan_memory_order mo); +__tsan_atomic32 __tsan_atomic32_compare_exchange_val( + volatile __tsan_atomic32 *a, __tsan_atomic32 c, __tsan_atomic32 v, + __tsan_memory_order mo); +__tsan_atomic64 __tsan_atomic64_compare_exchange_val( + volatile __tsan_atomic64 *a, __tsan_atomic64 c, __tsan_atomic64 v, + __tsan_memory_order mo); + void __tsan_atomic_thread_fence(__tsan_memory_order mo); void __tsan_atomic_signal_fence(__tsan_memory_order mo); -- cgit v1.2.1