[compiler-rt] 71f7f8a - [TSan] Add interceptor for os_unfair_lock_lock_with_flags (#153815)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Sep 11 03:28:09 PDT 2025
Author: Dan Blackwell
Date: 2025-09-11T11:28:05+01:00
New Revision: 71f7f8afaca759706c46de8c7612d47739890c0c
URL: https://github.com/llvm/llvm-project/commit/71f7f8afaca759706c46de8c7612d47739890c0c
DIFF: https://github.com/llvm/llvm-project/commit/71f7f8afaca759706c46de8c7612d47739890c0c.diff
LOG: [TSan] Add interceptor for os_unfair_lock_lock_with_flags (#153815)
Also update os_unfair_lock tsan test to check this function on platforms
where it is available.
rdar://158294950
Added:
Modified:
compiler-rt/lib/tsan/rtl/tsan_interceptors_mac.cpp
compiler-rt/test/tsan/Darwin/os_unfair_lock.c
Removed:
################################################################################
diff --git a/compiler-rt/lib/tsan/rtl/tsan_interceptors_mac.cpp b/compiler-rt/lib/tsan/rtl/tsan_interceptors_mac.cpp
index 978664411fff4..c5e12b472aacc 100644
--- a/compiler-rt/lib/tsan/rtl/tsan_interceptors_mac.cpp
+++ b/compiler-rt/lib/tsan/rtl/tsan_interceptors_mac.cpp
@@ -281,6 +281,25 @@ TSAN_INTERCEPTOR(void, os_unfair_lock_lock, os_unfair_lock_t lock) {
Acquire(thr, pc, (uptr)lock);
}
+// os_unfair_lock_lock_with_flags was introduced in macOS 15
+# if defined(__MAC_15_0) || defined(__IPHONE_18_0) || defined(__TVOS_18_0) || \
+ defined(__VISIONOS_2_0) || defined(__WATCHOS_11_0)
+# pragma clang diagnostic push
+# pragma clang diagnostic ignored "-Wunguarded-availability-new"
+// We're just intercepting this - if it doesn't exist on the platform, then the
+// process shouldn't have called it in the first place.
+TSAN_INTERCEPTOR(void, os_unfair_lock_lock_with_flags, os_unfair_lock_t lock,
+ os_unfair_lock_flags_t flags) {
+ if (!cur_thread()->is_inited || cur_thread()->is_dead) {
+ return REAL(os_unfair_lock_lock_with_flags)(lock, flags);
+ }
+ SCOPED_TSAN_INTERCEPTOR(os_unfair_lock_lock_with_flags, lock, flags);
+ REAL(os_unfair_lock_lock_with_flags)(lock, flags);
+ Acquire(thr, pc, (uptr)lock);
+}
+# pragma clang diagnostic pop
+# endif
+
TSAN_INTERCEPTOR(void, os_unfair_lock_lock_with_options, os_unfair_lock_t lock,
u32 options) {
if (!cur_thread()->is_inited || cur_thread()->is_dead) {
diff --git a/compiler-rt/test/tsan/Darwin/os_unfair_lock.c b/compiler-rt/test/tsan/Darwin/os_unfair_lock.c
index 320e7f5e56d1d..e2a491aa98d6d 100644
--- a/compiler-rt/test/tsan/Darwin/os_unfair_lock.c
+++ b/compiler-rt/test/tsan/Darwin/os_unfair_lock.c
@@ -1,12 +1,14 @@
// RUN: %clang_tsan %s -o %t
// RUN: %run %t 2>&1 | FileCheck %s --implicit-check-not='ThreadSanitizer'
+#include <Availability.h>
#include <os/lock.h>
#include <pthread.h>
#include <stdio.h>
long global_variable;
os_unfair_lock lock = OS_UNFAIR_LOCK_INIT;
+char flags_available = 0;
void *Thread(void *a) {
os_unfair_lock_lock(&lock);
@@ -15,6 +17,22 @@ void *Thread(void *a) {
return NULL;
}
+void *ThreadWithFlags(void *a) {
+#if defined(__MAC_15_0) || defined(__IPHONE_18_0) || defined(__TVOS_18_0) || \
+ defined(__VISIONOS_2_0) || defined(__WATCHOS_11_0)
+# pragma clang diagnostic push
+# pragma clang diagnostic ignored "-Wunguarded-availability-new"
+ os_unfair_lock_lock_with_flags(&lock, OS_UNFAIR_LOCK_FLAG_ADAPTIVE_SPIN);
+ flags_available = 1;
+# pragma clang diagnostic pop
+#else
+ os_unfair_lock_lock(&lock);
+#endif
+ global_variable++;
+ os_unfair_lock_unlock(&lock);
+ return NULL;
+}
+
int main() {
pthread_t t1, t2;
global_variable = 0;
@@ -23,6 +41,16 @@ int main() {
pthread_join(t1, NULL);
pthread_join(t2, NULL);
fprintf(stderr, "global_variable = %ld\n", global_variable);
+
+ // CHECK: global_variable = 2
+
+ pthread_create(&t1, NULL, ThreadWithFlags, NULL);
+ pthread_create(&t2, NULL, ThreadWithFlags, NULL);
+ pthread_join(t1, NULL);
+ pthread_join(t2, NULL);
+ fprintf(stderr,
+ "global_variable = %ld, os_unfair_lock_lock_with_flags %savailable\n",
+ global_variable, flags_available ? "" : "un");
}
-// CHECK: global_variable = 2
+// CHECK: global_variable = 4
More information about the llvm-commits
mailing list