diff --git a/compiler-rt/lib/tsan/rtl/tsan_interceptors_mac.cpp b/compiler-rt/lib/tsan/rtl/tsan_interceptors_mac.cpp --- a/compiler-rt/lib/tsan/rtl/tsan_interceptors_mac.cpp +++ b/compiler-rt/lib/tsan/rtl/tsan_interceptors_mac.cpp @@ -23,7 +23,6 @@ #include #include #include -#include #include #if defined(__has_include) && __has_include() @@ -247,7 +246,21 @@ REAL(os_lock_unlock)(lock); } -TSAN_INTERCEPTOR(void, os_unfair_lock_lock, os_unfair_lock_t lock) { +extern "C" { + #define _LOCK_AVAILABILITY \ + __OSX_AVAILABLE(10.12) __IOS_AVAILABLE(10.0) \ + __TVOS_AVAILABLE(10.0) __WATCHOS_AVAILABLE(3.0) + + _LOCK_AVAILABILITY void os_unfair_lock_lock(void *lock); + // NOTE: `options` actually has type `os_unfair_lock_options_t` but this + // should be ABI compatible. + _LOCK_AVAILABILITY void os_unfair_lock_lock_with_options(void *lock, + u32 options); + _LOCK_AVAILABILITY bool os_unfair_lock_trylock(void *lock); + _LOCK_AVAILABILITY void os_unfair_lock_unlock(void *lock); +} + +TSAN_INTERCEPTOR(void, os_unfair_lock_lock, void *lock) { if (!cur_thread()->is_inited || cur_thread()->is_dead) { return REAL(os_unfair_lock_lock)(lock); } @@ -256,7 +269,7 @@ Acquire(thr, pc, (uptr)lock); } -TSAN_INTERCEPTOR(void, os_unfair_lock_lock_with_options, os_unfair_lock_t lock, +TSAN_INTERCEPTOR(void, os_unfair_lock_lock_with_options, void *lock, u32 options) { if (!cur_thread()->is_inited || cur_thread()->is_dead) { return REAL(os_unfair_lock_lock_with_options)(lock, options); @@ -266,7 +279,7 @@ Acquire(thr, pc, (uptr)lock); } -TSAN_INTERCEPTOR(bool, os_unfair_lock_trylock, os_unfair_lock_t lock) { +TSAN_INTERCEPTOR(bool, os_unfair_lock_trylock, void *lock) { if (!cur_thread()->is_inited || cur_thread()->is_dead) { return REAL(os_unfair_lock_trylock)(lock); } @@ -277,7 +290,7 @@ return result; } -TSAN_INTERCEPTOR(void, os_unfair_lock_unlock, os_unfair_lock_t lock) { +TSAN_INTERCEPTOR(void, os_unfair_lock_unlock, void *lock) { if (!cur_thread()->is_inited || cur_thread()->is_dead) { return REAL(os_unfair_lock_unlock)(lock); }