summaryrefslogtreecommitdiffstats
path: root/compiler-rt/lib/tsan/rtl
diff options
context:
space:
mode:
authorJulian Lettner <jlettner@apple.com>2019-08-16 22:41:25 +0000
committerJulian Lettner <jlettner@apple.com>2019-08-16 22:41:25 +0000
commit4a9b747bfb5579f69514a13b643684714343d4e7 (patch)
tree2b3b685ff49b875d635645181ae4860e0dd68f31 /compiler-rt/lib/tsan/rtl
parent97176bd2bce003353b23e554e95a52780cb0f87c (diff)
downloadbcm5719-llvm-4a9b747bfb5579f69514a13b643684714343d4e7.tar.gz
bcm5719-llvm-4a9b747bfb5579f69514a13b643684714343d4e7.zip
[TSan] Add interceptors for os_unfair_lock
llvm-svn: 369164
Diffstat (limited to 'compiler-rt/lib/tsan/rtl')
-rw-r--r--compiler-rt/lib/tsan/rtl/tsan_interceptors_mac.cpp53
1 files changed, 53 insertions, 0 deletions
diff --git a/compiler-rt/lib/tsan/rtl/tsan_interceptors_mac.cpp b/compiler-rt/lib/tsan/rtl/tsan_interceptors_mac.cpp
index 332e1392e75..7b9173650ef 100644
--- a/compiler-rt/lib/tsan/rtl/tsan_interceptors_mac.cpp
+++ b/compiler-rt/lib/tsan/rtl/tsan_interceptors_mac.cpp
@@ -243,6 +243,59 @@ TSAN_INTERCEPTOR(void, os_lock_unlock, void *lock) {
REAL(os_lock_unlock)(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);
+ }
+ SCOPED_TSAN_INTERCEPTOR(os_unfair_lock_lock, lock);
+ REAL(os_unfair_lock_lock)(lock);
+ Acquire(thr, pc, (uptr)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);
+ }
+ SCOPED_TSAN_INTERCEPTOR(os_unfair_lock_lock_with_options, lock, options);
+ REAL(os_unfair_lock_lock_with_options)(lock, options);
+ Acquire(thr, pc, (uptr)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);
+ }
+ SCOPED_TSAN_INTERCEPTOR(os_unfair_lock_trylock, lock);
+ bool result = REAL(os_unfair_lock_trylock)(lock);
+ if (result)
+ Acquire(thr, pc, (uptr)lock);
+ return result;
+}
+
+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);
+ }
+ SCOPED_TSAN_INTERCEPTOR(os_unfair_lock_unlock, lock);
+ Release(thr, pc, (uptr)lock);
+ REAL(os_unfair_lock_unlock)(lock);
+}
+
TSAN_INTERCEPTOR(void, xpc_connection_set_event_handler,
xpc_connection_t connection, xpc_handler_t handler) {
SCOPED_TSAN_INTERCEPTOR(xpc_connection_set_event_handler, connection,
OpenPOWER on IntegriCloud