diff --git a/configure.ac b/configure.ac index 07a6d82314..8dc7fa4aef 100644 --- a/configure.ac +++ b/configure.ac @@ -1372,6 +1372,7 @@ AC_CHECK_HEADERS(process.h) AC_CHECK_HEADERS(pwd.h) AC_CHECK_HEADERS(sanitizer/asan_interface.h) AC_CHECK_HEADERS(sanitizer/msan_interface.h) +AC_CHECK_HEADERS(sanitizer/tsan_interface.h) AC_CHECK_HEADERS(setjmpex.h) AC_CHECK_HEADERS(stdalign.h) AC_CHECK_HEADERS(stdio.h) diff --git a/internal/sanitizers.h b/internal/sanitizers.h index 8e6e87ddc8..feafb4e616 100644 --- a/internal/sanitizers.h +++ b/internal/sanitizers.h @@ -29,6 +29,13 @@ # endif #endif +#ifdef HAVE_SANITIZER_TSAN_INTERFACE_H +# if __has_feature(thread_sanitizer) || defined(__SANITIZE_THREAD__) +# define RUBY_TSAN_ENABLED +# include +# endif +#endif + #include "ruby/internal/stdbool.h" /* for bool */ #include "ruby/ruby.h" /* for VALUE */ @@ -42,6 +49,9 @@ #elif defined(RUBY_MSAN_ENABLED) # define ATTRIBUTE_NO_ADDRESS_SAFETY_ANALYSIS(x) \ __attribute__((__no_sanitize__("memory"), __noinline__)) x +#elif defined(RUBY_TSAN_ENABLED) +# define ATTRIBUTE_NO_ADDRESS_SAFETY_ANALYSIS(x) \ + __attribute__((__no_sanitize__("thread"), __noinline__)) x #elif defined(NO_SANITIZE_ADDRESS) # define ATTRIBUTE_NO_ADDRESS_SAFETY_ANALYSIS(x) \ NO_SANITIZE_ADDRESS(NOINLINE(x)) diff --git a/misc/tsan_suppressions.txt b/misc/tsan_suppressions.txt index 692c1be388..5492500e7f 100644 --- a/misc/tsan_suppressions.txt +++ b/misc/tsan_suppressions.txt @@ -104,10 +104,6 @@ race_top:encoded_iseq_trace_instrument race:rb_iseq_trace_set_all race:rb_tracepoint_enable -# We walk the machine stack looking for markable objects, a thread with the GVL -# released could by mutating the stack with non-Ruby-objects -race:rb_gc_mark_machine_context - # GC enable/disable flag modifications race with object allocation flag reads race_top:rb_gc_impl_gc_disable race_top:rb_gc_impl_gc_enable