[llvm-branch-commits] Revert "[nfc][tsan] Eliminate a few macros" (PR #115028)

via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Tue Nov 5 09:22:52 PST 2024


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-compiler-rt-sanitizer

Author: Vitaly Buka (vitalybuka)

<details>
<summary>Changes</summary>

This reverts commit 67edb0ebbd5bb1139dc0dac9bf1ba6f1aa56c7ce.


---

Patch is 23.28 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/115028.diff


1 Files Affected:

- (modified) compiler-rt/lib/tsan/rtl/tsan_interface_atomic.cpp (+110-131) 


``````````diff
diff --git a/compiler-rt/lib/tsan/rtl/tsan_interface_atomic.cpp b/compiler-rt/lib/tsan/rtl/tsan_interface_atomic.cpp
index 5b1fc8982d95a8..283eaee3b8ba7a 100644
--- a/compiler-rt/lib/tsan/rtl/tsan_interface_atomic.cpp
+++ b/compiler-rt/lib/tsan/rtl/tsan_interface_atomic.cpp
@@ -519,373 +519,357 @@ static morder convert_morder(morder mo) {
   return static_cast<morder>(static_cast<int>(mo) & 0x7fff);
 }
 
-template <class Op, class... Types>
-ALWAYS_INLINE auto AtomicImpl(morder mo, Types... args) {
-  ThreadState *const thr = cur_thread();
-  ProcessPendingSignals(thr);
-  if (UNLIKELY(thr->ignore_sync || thr->ignore_interceptors))
-    return Op::NoTsanAtomic(mo, args...);
-  return Op::Atomic(thr, GET_CALLER_PC(), convert_morder(mo), args...);
-}
+#  define ATOMIC_IMPL(func, mo, ...)                                  \
+    ThreadState *const thr = cur_thread();                            \
+    ProcessPendingSignals(thr);                                       \
+    if (UNLIKELY(thr->ignore_sync || thr->ignore_interceptors))       \
+      return Op##func::NoTsanAtomic(mo, ##__VA_ARGS__);               \
+    return Op##func::Atomic(thr, GET_CALLER_PC(), convert_morder(mo), \
+                            ##__VA_ARGS__);
 
 extern "C" {
 SANITIZER_INTERFACE_ATTRIBUTE
 a8 __tsan_atomic8_load(const volatile a8 *a, int mo) {
-  return AtomicImpl<OpLoad>(static_cast<morder>(mo), a);
+  ATOMIC_IMPL(Load, static_cast<morder>(mo), a);
 }
 
 SANITIZER_INTERFACE_ATTRIBUTE
 a16 __tsan_atomic16_load(const volatile a16 *a, int mo) {
-  return AtomicImpl<OpLoad>(static_cast<morder>(mo), a);
+  ATOMIC_IMPL(Load, static_cast<morder>(mo), a);
 }
 
 SANITIZER_INTERFACE_ATTRIBUTE
 a32 __tsan_atomic32_load(const volatile a32 *a, int mo) {
-  return AtomicImpl<OpLoad>(static_cast<morder>(mo), a);
+  ATOMIC_IMPL(Load, static_cast<morder>(mo), a);
 }
 
 SANITIZER_INTERFACE_ATTRIBUTE
 a64 __tsan_atomic64_load(const volatile a64 *a, int mo) {
-  return AtomicImpl<OpLoad>(static_cast<morder>(mo), a);
+  ATOMIC_IMPL(Load, static_cast<morder>(mo), a);
 }
 
 #  if __TSAN_HAS_INT128
 SANITIZER_INTERFACE_ATTRIBUTE
 a128 __tsan_atomic128_load(const volatile a128 *a, int mo) {
-  return AtomicImpl<OpLoad>(static_cast<morder>(mo), a);
+  ATOMIC_IMPL(Load, static_cast<morder>(mo), a);
 }
 #  endif
 
 SANITIZER_INTERFACE_ATTRIBUTE
 void __tsan_atomic8_store(volatile a8 *a, a8 v, int mo) {
-  return AtomicImpl<OpStore>(static_cast<morder>(mo), a, v);
+  ATOMIC_IMPL(Store, static_cast<morder>(mo), a, v);
 }
 
 SANITIZER_INTERFACE_ATTRIBUTE
 void __tsan_atomic16_store(volatile a16 *a, a16 v, int mo) {
-  return AtomicImpl<OpStore>(static_cast<morder>(mo), a, v);
+  ATOMIC_IMPL(Store, static_cast<morder>(mo), a, v);
 }
 
 SANITIZER_INTERFACE_ATTRIBUTE
 void __tsan_atomic32_store(volatile a32 *a, a32 v, int mo) {
-  return AtomicImpl<OpStore>(static_cast<morder>(mo), a, v);
+  ATOMIC_IMPL(Store, static_cast<morder>(mo), a, v);
 }
 
 SANITIZER_INTERFACE_ATTRIBUTE
 void __tsan_atomic64_store(volatile a64 *a, a64 v, int mo) {
-  return AtomicImpl<OpStore>(static_cast<morder>(mo), a, v);
+  ATOMIC_IMPL(Store, static_cast<morder>(mo), a, v);
 }
 
 #  if __TSAN_HAS_INT128
 SANITIZER_INTERFACE_ATTRIBUTE
 void __tsan_atomic128_store(volatile a128 *a, a128 v, int mo) {
-  return AtomicImpl<OpStore>(static_cast<morder>(mo), a, v);
+  ATOMIC_IMPL(Store, static_cast<morder>(mo), a, v);
 }
 #  endif
 
 SANITIZER_INTERFACE_ATTRIBUTE
 a8 __tsan_atomic8_exchange(volatile a8 *a, a8 v, int mo) {
-  return AtomicImpl<OpExchange>(static_cast<morder>(mo), a, v);
+  ATOMIC_IMPL(Exchange, static_cast<morder>(mo), a, v);
 }
 
 SANITIZER_INTERFACE_ATTRIBUTE
 a16 __tsan_atomic16_exchange(volatile a16 *a, a16 v, int mo) {
-  return AtomicImpl<OpExchange>(static_cast<morder>(mo), a, v);
+  ATOMIC_IMPL(Exchange, static_cast<morder>(mo), a, v);
 }
 
 SANITIZER_INTERFACE_ATTRIBUTE
 a32 __tsan_atomic32_exchange(volatile a32 *a, a32 v, int mo) {
-  return AtomicImpl<OpExchange>(static_cast<morder>(mo), a, v);
+  ATOMIC_IMPL(Exchange, static_cast<morder>(mo), a, v);
 }
 
 SANITIZER_INTERFACE_ATTRIBUTE
 a64 __tsan_atomic64_exchange(volatile a64 *a, a64 v, int mo) {
-  return AtomicImpl<OpExchange>(static_cast<morder>(mo), a, v);
+  ATOMIC_IMPL(Exchange, static_cast<morder>(mo), a, v);
 }
 
 #  if __TSAN_HAS_INT128
 SANITIZER_INTERFACE_ATTRIBUTE
 a128 __tsan_atomic128_exchange(volatile a128 *a, a128 v, int mo) {
-  return AtomicImpl<OpExchange>(static_cast<morder>(mo), a, v);
+  ATOMIC_IMPL(Exchange, static_cast<morder>(mo), a, v);
 }
 #  endif
 
 SANITIZER_INTERFACE_ATTRIBUTE
 a8 __tsan_atomic8_fetch_add(volatile a8 *a, a8 v, int mo) {
-  return AtomicImpl<OpFetchAdd>(static_cast<morder>(mo), a, v);
+  ATOMIC_IMPL(FetchAdd, static_cast<morder>(mo), a, v);
 }
 
 SANITIZER_INTERFACE_ATTRIBUTE
 a16 __tsan_atomic16_fetch_add(volatile a16 *a, a16 v, int mo) {
-  return AtomicImpl<OpFetchAdd>(static_cast<morder>(mo), a, v);
+  ATOMIC_IMPL(FetchAdd, static_cast<morder>(mo), a, v);
 }
 
 SANITIZER_INTERFACE_ATTRIBUTE
 a32 __tsan_atomic32_fetch_add(volatile a32 *a, a32 v, int mo) {
-  return AtomicImpl<OpFetchAdd>(static_cast<morder>(mo), a, v);
+  ATOMIC_IMPL(FetchAdd, static_cast<morder>(mo), a, v);
 }
 
 SANITIZER_INTERFACE_ATTRIBUTE
 a64 __tsan_atomic64_fetch_add(volatile a64 *a, a64 v, int mo) {
-  return AtomicImpl<OpFetchAdd>(static_cast<morder>(mo), a, v);
+  ATOMIC_IMPL(FetchAdd, static_cast<morder>(mo), a, v);
 }
 
 #  if __TSAN_HAS_INT128
 SANITIZER_INTERFACE_ATTRIBUTE
 a128 __tsan_atomic128_fetch_add(volatile a128 *a, a128 v, int mo) {
-  return AtomicImpl<OpFetchAdd>(static_cast<morder>(mo), a, v);
+  ATOMIC_IMPL(FetchAdd, static_cast<morder>(mo), a, v);
 }
 #  endif
 
 SANITIZER_INTERFACE_ATTRIBUTE
 a8 __tsan_atomic8_fetch_sub(volatile a8 *a, a8 v, int mo) {
-  return AtomicImpl<OpFetchSub>(static_cast<morder>(mo), a, v);
+  ATOMIC_IMPL(FetchSub, static_cast<morder>(mo), a, v);
 }
 
 SANITIZER_INTERFACE_ATTRIBUTE
 a16 __tsan_atomic16_fetch_sub(volatile a16 *a, a16 v, int mo) {
-  return AtomicImpl<OpFetchSub>(static_cast<morder>(mo), a, v);
+  ATOMIC_IMPL(FetchSub, static_cast<morder>(mo), a, v);
 }
 
 SANITIZER_INTERFACE_ATTRIBUTE
 a32 __tsan_atomic32_fetch_sub(volatile a32 *a, a32 v, int mo) {
-  return AtomicImpl<OpFetchSub>(static_cast<morder>(mo), a, v);
+  ATOMIC_IMPL(FetchSub, static_cast<morder>(mo), a, v);
 }
 
 SANITIZER_INTERFACE_ATTRIBUTE
 a64 __tsan_atomic64_fetch_sub(volatile a64 *a, a64 v, int mo) {
-  return AtomicImpl<OpFetchSub>(static_cast<morder>(mo), a, v);
+  ATOMIC_IMPL(FetchSub, static_cast<morder>(mo), a, v);
 }
 
 #  if __TSAN_HAS_INT128
 SANITIZER_INTERFACE_ATTRIBUTE
 a128 __tsan_atomic128_fetch_sub(volatile a128 *a, a128 v, int mo) {
-  return AtomicImpl<OpFetchSub>(static_cast<morder>(mo), a, v);
+  ATOMIC_IMPL(FetchSub, static_cast<morder>(mo), a, v);
 }
 #  endif
 
 SANITIZER_INTERFACE_ATTRIBUTE
 a8 __tsan_atomic8_fetch_and(volatile a8 *a, a8 v, int mo) {
-  return AtomicImpl<OpFetchAnd>(static_cast<morder>(mo), a, v);
+  ATOMIC_IMPL(FetchAnd, static_cast<morder>(mo), a, v);
 }
 
 SANITIZER_INTERFACE_ATTRIBUTE
 a16 __tsan_atomic16_fetch_and(volatile a16 *a, a16 v, int mo) {
-  return AtomicImpl<OpFetchAnd>(static_cast<morder>(mo), a, v);
+  ATOMIC_IMPL(FetchAnd, static_cast<morder>(mo), a, v);
 }
 
 SANITIZER_INTERFACE_ATTRIBUTE
 a32 __tsan_atomic32_fetch_and(volatile a32 *a, a32 v, int mo) {
-  return AtomicImpl<OpFetchAnd>(static_cast<morder>(mo), a, v);
+  ATOMIC_IMPL(FetchAnd, static_cast<morder>(mo), a, v);
 }
 
 SANITIZER_INTERFACE_ATTRIBUTE
 a64 __tsan_atomic64_fetch_and(volatile a64 *a, a64 v, int mo) {
-  return AtomicImpl<OpFetchAnd>(static_cast<morder>(mo), a, v);
+  ATOMIC_IMPL(FetchAnd, static_cast<morder>(mo), a, v);
 }
 
 #  if __TSAN_HAS_INT128
 SANITIZER_INTERFACE_ATTRIBUTE
 a128 __tsan_atomic128_fetch_and(volatile a128 *a, a128 v, int mo) {
-  return AtomicImpl<OpFetchAnd>(static_cast<morder>(mo), a, v);
+  ATOMIC_IMPL(FetchAnd, static_cast<morder>(mo), a, v);
 }
 #  endif
 
 SANITIZER_INTERFACE_ATTRIBUTE
 a8 __tsan_atomic8_fetch_or(volatile a8 *a, a8 v, int mo) {
-  return AtomicImpl<OpFetchOr>(static_cast<morder>(mo), a, v);
+  ATOMIC_IMPL(FetchOr, static_cast<morder>(mo), a, v);
 }
 
 SANITIZER_INTERFACE_ATTRIBUTE
 a16 __tsan_atomic16_fetch_or(volatile a16 *a, a16 v, int mo) {
-  return AtomicImpl<OpFetchOr>(static_cast<morder>(mo), a, v);
+  ATOMIC_IMPL(FetchOr, static_cast<morder>(mo), a, v);
 }
 
 SANITIZER_INTERFACE_ATTRIBUTE
 a32 __tsan_atomic32_fetch_or(volatile a32 *a, a32 v, int mo) {
-  return AtomicImpl<OpFetchOr>(static_cast<morder>(mo), a, v);
+  ATOMIC_IMPL(FetchOr, static_cast<morder>(mo), a, v);
 }
 
 SANITIZER_INTERFACE_ATTRIBUTE
 a64 __tsan_atomic64_fetch_or(volatile a64 *a, a64 v, int mo) {
-  return AtomicImpl<OpFetchOr>(static_cast<morder>(mo), a, v);
+  ATOMIC_IMPL(FetchOr, static_cast<morder>(mo), a, v);
 }
 
 #  if __TSAN_HAS_INT128
 SANITIZER_INTERFACE_ATTRIBUTE
 a128 __tsan_atomic128_fetch_or(volatile a128 *a, a128 v, int mo) {
-  return AtomicImpl<OpFetchOr>(static_cast<morder>(mo), a, v);
+  ATOMIC_IMPL(FetchOr, static_cast<morder>(mo), a, v);
 }
 #  endif
 
 SANITIZER_INTERFACE_ATTRIBUTE
 a8 __tsan_atomic8_fetch_xor(volatile a8 *a, a8 v, int mo) {
-  return AtomicImpl<OpFetchXor>(static_cast<morder>(mo), a, v);
+  ATOMIC_IMPL(FetchXor, static_cast<morder>(mo), a, v);
 }
 
 SANITIZER_INTERFACE_ATTRIBUTE
 a16 __tsan_atomic16_fetch_xor(volatile a16 *a, a16 v, int mo) {
-  return AtomicImpl<OpFetchXor>(static_cast<morder>(mo), a, v);
+  ATOMIC_IMPL(FetchXor, static_cast<morder>(mo), a, v);
 }
 
 SANITIZER_INTERFACE_ATTRIBUTE
 a32 __tsan_atomic32_fetch_xor(volatile a32 *a, a32 v, int mo) {
-  return AtomicImpl<OpFetchXor>(static_cast<morder>(mo), a, v);
+  ATOMIC_IMPL(FetchXor, static_cast<morder>(mo), a, v);
 }
 
 SANITIZER_INTERFACE_ATTRIBUTE
 a64 __tsan_atomic64_fetch_xor(volatile a64 *a, a64 v, int mo) {
-  return AtomicImpl<OpFetchXor>(static_cast<morder>(mo), a, v);
+  ATOMIC_IMPL(FetchXor, static_cast<morder>(mo), a, v);
 }
 
 #  if __TSAN_HAS_INT128
 SANITIZER_INTERFACE_ATTRIBUTE
 a128 __tsan_atomic128_fetch_xor(volatile a128 *a, a128 v, int mo) {
-  return AtomicImpl<OpFetchXor>(static_cast<morder>(mo), a, v);
+  ATOMIC_IMPL(FetchXor, static_cast<morder>(mo), a, v);
 }
 #  endif
 
 SANITIZER_INTERFACE_ATTRIBUTE
 a8 __tsan_atomic8_fetch_nand(volatile a8 *a, a8 v, int mo) {
-  return AtomicImpl<OpFetchNand>(static_cast<morder>(mo), a, v);
+  ATOMIC_IMPL(FetchNand, static_cast<morder>(mo), a, v);
 }
 
 SANITIZER_INTERFACE_ATTRIBUTE
 a16 __tsan_atomic16_fetch_nand(volatile a16 *a, a16 v, int mo) {
-  return AtomicImpl<OpFetchNand>(static_cast<morder>(mo), a, v);
+  ATOMIC_IMPL(FetchNand, static_cast<morder>(mo), a, v);
 }
 
 SANITIZER_INTERFACE_ATTRIBUTE
 a32 __tsan_atomic32_fetch_nand(volatile a32 *a, a32 v, int mo) {
-  return AtomicImpl<OpFetchNand>(static_cast<morder>(mo), a, v);
+  ATOMIC_IMPL(FetchNand, static_cast<morder>(mo), a, v);
 }
 
 SANITIZER_INTERFACE_ATTRIBUTE
 a64 __tsan_atomic64_fetch_nand(volatile a64 *a, a64 v, int mo) {
-  return AtomicImpl<OpFetchNand>(static_cast<morder>(mo), a, v);
+  ATOMIC_IMPL(FetchNand, static_cast<morder>(mo), a, v);
 }
 
 #  if __TSAN_HAS_INT128
 SANITIZER_INTERFACE_ATTRIBUTE
 a128 __tsan_atomic128_fetch_nand(volatile a128 *a, a128 v, int mo) {
-  return AtomicImpl<OpFetchNand>(static_cast<morder>(mo), a, v);
+  ATOMIC_IMPL(FetchNand, static_cast<morder>(mo), a, v);
 }
 #  endif
 
 SANITIZER_INTERFACE_ATTRIBUTE
 int __tsan_atomic8_compare_exchange_strong(volatile a8 *a, a8 *c, a8 v, int mo,
                                            int fmo) {
-  return AtomicImpl<OpCAS>(static_cast<morder>(mo), static_cast<morder>(fmo), a,
-                           c, v);
+  ATOMIC_IMPL(CAS, static_cast<morder>(mo), static_cast<morder>(fmo), a, c, v);
 }
 
 SANITIZER_INTERFACE_ATTRIBUTE
 int __tsan_atomic16_compare_exchange_strong(volatile a16 *a, a16 *c, a16 v,
                                             int mo, int fmo) {
-  return AtomicImpl<OpCAS>(static_cast<morder>(mo), static_cast<morder>(fmo), a,
-                           c, v);
+  ATOMIC_IMPL(CAS, static_cast<morder>(mo), static_cast<morder>(fmo), a, c, v);
 }
 
 SANITIZER_INTERFACE_ATTRIBUTE
 int __tsan_atomic32_compare_exchange_strong(volatile a32 *a, a32 *c, a32 v,
                                             int mo, int fmo) {
-  return AtomicImpl<OpCAS>(static_cast<morder>(mo), static_cast<morder>(fmo), a,
-                           c, v);
+  ATOMIC_IMPL(CAS, static_cast<morder>(mo), static_cast<morder>(fmo), a, c, v);
 }
 
 SANITIZER_INTERFACE_ATTRIBUTE
 int __tsan_atomic64_compare_exchange_strong(volatile a64 *a, a64 *c, a64 v,
                                             int mo, int fmo) {
-  return AtomicImpl<OpCAS>(static_cast<morder>(mo), static_cast<morder>(fmo), a,
-                           c, v);
+  ATOMIC_IMPL(CAS, static_cast<morder>(mo), static_cast<morder>(fmo), a, c, v);
 }
 
 #  if __TSAN_HAS_INT128
 SANITIZER_INTERFACE_ATTRIBUTE
 int __tsan_atomic128_compare_exchange_strong(volatile a128 *a, a128 *c, a128 v,
                                              int mo, int fmo) {
-  return AtomicImpl<OpCAS>(static_cast<morder>(mo), static_cast<morder>(fmo), a,
-                           c, v);
+  ATOMIC_IMPL(CAS, static_cast<morder>(mo), static_cast<morder>(fmo), a, c, v);
 }
 #  endif
 
 SANITIZER_INTERFACE_ATTRIBUTE
 int __tsan_atomic8_compare_exchange_weak(volatile a8 *a, a8 *c, a8 v, int mo,
                                          int fmo) {
-  return AtomicImpl<OpCAS>(static_cast<morder>(mo), static_cast<morder>(fmo), a,
-                           c, v);
+  ATOMIC_IMPL(CAS, static_cast<morder>(mo), static_cast<morder>(fmo), a, c, v);
 }
 
 SANITIZER_INTERFACE_ATTRIBUTE
 int __tsan_atomic16_compare_exchange_weak(volatile a16 *a, a16 *c, a16 v,
                                           int mo, int fmo) {
-  return AtomicImpl<OpCAS>(static_cast<morder>(mo), static_cast<morder>(fmo), a,
-                           c, v);
+  ATOMIC_IMPL(CAS, static_cast<morder>(mo), static_cast<morder>(fmo), a, c, v);
 }
 
 SANITIZER_INTERFACE_ATTRIBUTE
 int __tsan_atomic32_compare_exchange_weak(volatile a32 *a, a32 *c, a32 v,
                                           int mo, int fmo) {
-  return AtomicImpl<OpCAS>(static_cast<morder>(mo), static_cast<morder>(fmo), a,
-                           c, v);
+  ATOMIC_IMPL(CAS, static_cast<morder>(mo), static_cast<morder>(fmo), a, c, v);
 }
 
 SANITIZER_INTERFACE_ATTRIBUTE
 int __tsan_atomic64_compare_exchange_weak(volatile a64 *a, a64 *c, a64 v,
                                           int mo, int fmo) {
-  return AtomicImpl<OpCAS>(static_cast<morder>(mo), static_cast<morder>(fmo), a,
-                           c, v);
+  ATOMIC_IMPL(CAS, static_cast<morder>(mo), static_cast<morder>(fmo), a, c, v);
 }
 
 #  if __TSAN_HAS_INT128
 SANITIZER_INTERFACE_ATTRIBUTE
 int __tsan_atomic128_compare_exchange_weak(volatile a128 *a, a128 *c, a128 v,
                                            int mo, int fmo) {
-  return AtomicImpl<OpCAS>(static_cast<morder>(mo), static_cast<morder>(fmo), a,
-                           c, v);
+  ATOMIC_IMPL(CAS, static_cast<morder>(mo), static_cast<morder>(fmo), a, c, v);
 }
 #  endif
 
 SANITIZER_INTERFACE_ATTRIBUTE
 a8 __tsan_atomic8_compare_exchange_val(volatile a8 *a, a8 c, a8 v, int mo,
                                        int fmo) {
-  return AtomicImpl<OpCAS>(static_cast<morder>(mo), static_cast<morder>(fmo), a,
-                           c, v);
+  ATOMIC_IMPL(CAS, static_cast<morder>(mo), static_cast<morder>(fmo), a, c, v);
 }
 
 SANITIZER_INTERFACE_ATTRIBUTE
 a16 __tsan_atomic16_compare_exchange_val(volatile a16 *a, a16 c, a16 v, int mo,
                                          int fmo) {
-  return AtomicImpl<OpCAS>(static_cast<morder>(mo), static_cast<morder>(fmo), a,
-                           c, v);
+  ATOMIC_IMPL(CAS, static_cast<morder>(mo), static_cast<morder>(fmo), a, c, v);
 }
 
 SANITIZER_INTERFACE_ATTRIBUTE
 a32 __tsan_atomic32_compare_exchange_val(volatile a32 *a, a32 c, a32 v, int mo,
                                          int fmo) {
-  return AtomicImpl<OpCAS>(static_cast<morder>(mo), static_cast<morder>(fmo), a,
-                           c, v);
+  ATOMIC_IMPL(CAS, static_cast<morder>(mo), static_cast<morder>(fmo), a, c, v);
 }
 
 SANITIZER_INTERFACE_ATTRIBUTE
 a64 __tsan_atomic64_compare_exchange_val(volatile a64 *a, a64 c, a64 v, int mo,
                                          int fmo) {
-  return AtomicImpl<OpCAS>(static_cast<morder>(mo), static_cast<morder>(fmo), a,
-                           c, v);
+  ATOMIC_IMPL(CAS, static_cast<morder>(mo), static_cast<morder>(fmo), a, c, v);
 }
 
 #  if __TSAN_HAS_INT128
 SANITIZER_INTERFACE_ATTRIBUTE
 a128 __tsan_atomic128_compare_exchange_val(volatile a128 *a, a128 c, a128 v,
                                            int mo, int fmo) {
-  return AtomicImpl<OpCAS>(static_cast<morder>(mo), static_cast<morder>(fmo), a,
-                           c, v);
+  ATOMIC_IMPL(CAS, static_cast<morder>(mo), static_cast<morder>(fmo), a, c, v);
 }
 #  endif
 
 SANITIZER_INTERFACE_ATTRIBUTE
 void __tsan_atomic_thread_fence(int mo) {
-  return AtomicImpl<OpFence>(static_cast<morder>(mo));
+  ATOMIC_IMPL(Fence, static_cast<morder>(mo));
 }
 
 SANITIZER_INTERFACE_ATTRIBUTE
@@ -896,115 +880,110 @@ void __tsan_atomic_signal_fence(int mo) {}
 
 // Go
 
-template <class Op, class... Types>
-void AtomicGo(ThreadState *thr, uptr cpc, uptr pc, Types... args) {
-  if (thr->ignore_sync) {
-    (void)Op::NoTsanAtomic(args...);
-  } else {
-    FuncEntry(thr, cpc);
-    (void)Op::Atomic(thr, pc, args...);
-    FuncExit(thr);
-  }
-}
+#  define ATOMIC(func, ...)                   \
+    if (thr->ignore_sync) {                   \
+      Op##func::NoTsanAtomic(__VA_ARGS__);    \
+    } else {                                  \
+      FuncEntry(thr, cpc);                    \
+      Op##func::Atomic(thr, pc, __VA_ARGS__); \
+      FuncExit(thr);                          \
+    }
 
-template <class Op, class... Types>
-auto AtomicGoRet(ThreadState *thr, uptr cpc, uptr pc, Types... args) {
-  if (thr->ignore_sync) {
-    return Op::NoTsanAtomic(args...);
-  } else {
-    FuncEntry(thr, cpc);
-    auto ret = Op::Atomic(thr, pc, args...);
-    FuncExit(thr);
-    return ret;
-  }
-}
+#  define ATOMIC_RET(func, ret, ...)                  \
+    if (thr->ignore_sync) {                           \
+      (ret) = Op##func::NoTsanAtomic(__VA_ARGS__);    \
+    } else {                                          \
+      FuncEntry(thr, cpc);                            \
+      (ret) = Op##func::Atomic(thr, pc, __VA_ARGS__); \
+      FuncExit(thr);                                  \
+    }
 
 extern "C" {
 SANITIZER_INTERFACE_ATTRIBUTE
 void __tsan_go_atomic32_load(ThreadState *thr, uptr cpc, uptr pc, u8 *a) {
-  *(a32 *)(a + 8) =
-      AtomicGoRet<OpLoad>(thr, cpc, pc, morder::acquire, *(a32 **)a);
+  ATOMIC_RET(Load, *(a32 *)(a + 8), morder::acquire, *(a32 **)a);
 }
 
 SANITIZER_INTERFACE_ATTRIBUTE
 void __tsan_go_atomic64_load(ThreadState *thr, uptr cpc, uptr pc, u8 *a) {
-  *(a64 *)(a + 8) =
-      AtomicGoRet<OpLoad>(thr, cpc, pc, morder::acquire, *(a64 **)a);
+  ATOMIC_RET(Load, *(a64 *)(a + 8), morder::acquire, *(a64 **)a);
 }
 
 SANITIZER_INTERFACE_ATTRIBUTE
 void __tsan_go_atomic32_store(ThreadState *thr, uptr cpc, uptr pc, u8 *a) {
-  AtomicGo<OpStore>(thr, cpc, pc, morder::release, *(a32 **)a, *(a32 *)(a + 8));
+  ATOMIC(Store, morder::release, *(a32 **)a, *(a32 *)(a + 8));
 }
 
 SANITIZER_INTERFACE_ATTRIBUTE
 void __tsan_go_atomic64_store(ThreadState *thr, uptr cpc, uptr pc, u8 *a) {
-  AtomicGo<OpStore>(thr, cpc, pc, morder::release, *(a64 **)a, *(a64 *)(a + 8));
+  ATOMIC(Store, morder::release, *(a64 **)a, *(a64 *)(a + 8));
 }
 
 SANITIZER_INTERFACE_ATTRIBUTE
 void __tsan_go_atomic32_fetch_add(ThreadState *thr, uptr cpc, uptr pc, u8 *a) {
-  *(a32 *)(a + 16) = AtomicGoRet<OpFetchAdd>(thr, cpc, pc, morder::acq_rel,
-                                             *(a32 **)a, *(a32 *)(a + 8));
+  ATOMIC_RET(FetchAdd, *(a32 *)(a + 16), morder::acq_rel, *(a32 **)a,
+             *(a32 *)(a + 8));
 }
 
 SANITIZER_INTERFACE_ATTRIBUTE
 void __tsan_go_atomic64_fetch_add(ThreadState *thr, uptr cpc, uptr pc, u8 *a) {
-  *(a64 *)(a + 16) = AtomicGoRet<OpFetchAdd>(thr, cpc, pc, morder::acq_rel,
-                                             *(a64 **)a, *(a64 *)(a + 8));
+...
[truncated]

``````````

</details>


https://github.com/llvm/llvm-project/pull/115028


More information about the llvm-branch-commits mailing list