summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorIvan Maidanski <ivmai@mail.ru>2023-03-30 23:12:32 +0300
committerIvan Maidanski <ivmai@mail.ru>2023-03-30 23:12:32 +0300
commit5f16c0ab09760910e8995317ebc51b4fae198101 (patch)
tree836911de9724565198cdcd65ab82c22b5edb0366 /include
parent266165237251b520d566e9c0fbd4257952a70b86 (diff)
downloadbdwgc-5f16c0ab09760910e8995317ebc51b4fae198101.tar.gz
Eliminate 'atomic_thread_fence is unsupported with tsan' gcc-11 warning
The workaround is to use __atomic_test_and_set instead of __atomic_thread_fence in case of option -fsanitize=thread is passed to gcc (or clang). The old behavior could be turned on by defining AO_USE_ATOMIC_THREAD_FENCE macro. * include/private/gc_atomic_ops.h [GC_BUILTIN_ATOMIC && !GC_PRIVATE_H && !THREAD_SANITIZER && (__has_feature(thread_sanitizer) || __SANITIZE_THREAD__)] (THREAD_SANITIZER): Define. * include/private/gc_atomic_ops.h [GC_BUILTIN_ATOMIC && THREAD_SANITIZER && !AO_USE_ATOMIC_THREAD_FENCE] (AO_nop_full): Define as inline function using __atomic_test_and_set() on a dummy local variable (instead of __atomic_thread_fence usage).
Diffstat (limited to 'include')
-rw-r--r--include/private/gc_atomic_ops.h25
1 files changed, 24 insertions, 1 deletions
diff --git a/include/private/gc_atomic_ops.h b/include/private/gc_atomic_ops.h
index 1f39095e..01d79d21 100644
--- a/include/private/gc_atomic_ops.h
+++ b/include/private/gc_atomic_ops.h
@@ -36,6 +36,17 @@
# define AO_INLINE static __inline
# endif
+# if !defined(THREAD_SANITIZER) && !defined(GC_PRIVATE_H)
+ /* Similar to that in gcconfig.h. */
+# if defined(__has_feature)
+# if __has_feature(thread_sanitizer)
+# define THREAD_SANITIZER
+# endif
+# elif defined(__SANITIZE_THREAD__)
+# define THREAD_SANITIZER
+# endif
+# endif /* !THREAD_SANITIZER && !GC_PRIVATE_H */
+
typedef unsigned char AO_TS_t;
# define AO_TS_CLEAR 0
# define AO_TS_INITIALIZER (AO_TS_t)AO_TS_CLEAR
@@ -50,7 +61,19 @@
# define AO_HAVE_test_and_set_acquire
# define AO_compiler_barrier() __atomic_signal_fence(__ATOMIC_SEQ_CST)
-# define AO_nop_full() __atomic_thread_fence(__ATOMIC_SEQ_CST)
+
+# if defined(THREAD_SANITIZER) && !defined(AO_USE_ATOMIC_THREAD_FENCE)
+ /* Workaround a compiler warning (reported by gcc-11, at least) */
+ /* that atomic_thread_fence is unsupported with thread sanitizer. */
+ AO_INLINE void
+ AO_nop_full(void)
+ {
+ volatile AO_TS_t dummy = AO_TS_INITIALIZER;
+ (void)__atomic_test_and_set(&dummy, __ATOMIC_SEQ_CST);
+ }
+# else
+# define AO_nop_full() __atomic_thread_fence(__ATOMIC_SEQ_CST)
+# endif
# define AO_HAVE_nop_full
# define AO_fetch_and_add(p, v) __atomic_fetch_add(p, v, __ATOMIC_RELAXED)