Skip to content

Commit a34159f

Browse files
authored
[TSan][Apple] Fix interceptor build error (#124351)
In certain cases, the SDK headers declare `OSSpinLock*` APIs as macros (instead of functions), so users can be transparently forwarded to non-deprecated APIs. When enabled, building of TSan interceptors failed because these macros interfere with the interceptor machinery, i.e., they prevent proper forward declaration of intercepted APIs. In a previous change [1], we misattributed this to the deprecation of `OSSpinLock*` APIs. [1] ae484c2 rdar://143193907
1 parent 934532d commit a34159f

File tree

2 files changed

+18
-51
lines changed

2 files changed

+18
-51
lines changed

compiler-rt/lib/tsan/rtl/tsan_interceptors_mac.cpp

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
# include "tsan_interceptors.h"
2626
# include "tsan_interface.h"
2727
# include "tsan_interface_ann.h"
28-
# include "tsan_spinlock_defs_mac.h"
2928

3029
# if defined(__has_include) && __has_include(<xpc/xpc.h>)
3130
# include <xpc/xpc.h>
@@ -96,8 +95,7 @@ static constexpr morder kMacFailureOrder = mo_relaxed;
9695
m_orig(int32_t, uint32_t, a32, f##32##OrigBarrier, \
9796
__tsan_atomic32_##tsan_atomic_f, kMacOrderBarrier)
9897

99-
# pragma clang diagnostic push
100-
// OSAtomic* functions are deprecated.
98+
# pragma clang diagnostic push // OSAtomic* deprecation
10199
# pragma clang diagnostic ignored "-Wdeprecated-declarations"
102100
OSATOMIC_INTERCEPTORS_ARITHMETIC(OSAtomicAdd, fetch_add,
103101
OSATOMIC_INTERCEPTOR_PLUS_X)
@@ -111,6 +109,7 @@ OSATOMIC_INTERCEPTORS_BITWISE(OSAtomicAnd, fetch_and,
111109
OSATOMIC_INTERCEPTOR_PLUS_X, OSATOMIC_INTERCEPTOR)
112110
OSATOMIC_INTERCEPTORS_BITWISE(OSAtomicXor, fetch_xor,
113111
OSATOMIC_INTERCEPTOR_PLUS_X, OSATOMIC_INTERCEPTOR)
112+
# pragma clang diagnostic pop // OSAtomic* deprecation
114113

115114
# define OSATOMIC_INTERCEPTORS_CAS(f, tsan_atomic_f, tsan_t, t) \
116115
TSAN_INTERCEPTOR(bool, f, t old_value, t new_value, t volatile *ptr) { \
@@ -128,8 +127,7 @@ OSATOMIC_INTERCEPTORS_BITWISE(OSAtomicXor, fetch_xor,
128127
kMacOrderBarrier, kMacFailureOrder); \
129128
}
130129

131-
# pragma clang diagnostic push
132-
// OSAtomicCompareAndSwap* functions are deprecated.
130+
# pragma clang diagnostic push // OSAtomicCompareAndSwap* deprecation
133131
# pragma clang diagnostic ignored "-Wdeprecated-declarations"
134132
OSATOMIC_INTERCEPTORS_CAS(OSAtomicCompareAndSwapInt, __tsan_atomic32, a32, int)
135133
OSATOMIC_INTERCEPTORS_CAS(OSAtomicCompareAndSwapLong, __tsan_atomic64, a64,
@@ -140,7 +138,7 @@ OSATOMIC_INTERCEPTORS_CAS(OSAtomicCompareAndSwap32, __tsan_atomic32, a32,
140138
int32_t)
141139
OSATOMIC_INTERCEPTORS_CAS(OSAtomicCompareAndSwap64, __tsan_atomic64, a64,
142140
int64_t)
143-
# pragma clang diagnostic pop
141+
# pragma clang diagnostic pop // OSAtomicCompareAndSwap* deprecation
144142

145143
# define OSATOMIC_INTERCEPTOR_BITOP(f, op, clear, mo) \
146144
TSAN_INTERCEPTOR(bool, f, uint32_t n, volatile void *ptr) { \
@@ -156,9 +154,12 @@ OSATOMIC_INTERCEPTORS_CAS(OSAtomicCompareAndSwap64, __tsan_atomic64, a64,
156154
OSATOMIC_INTERCEPTOR_BITOP(f, op, clear, kMacOrderNonBarrier) \
157155
OSATOMIC_INTERCEPTOR_BITOP(f##Barrier, op, clear, kMacOrderBarrier)
158156

157+
# pragma clang diagnostic push // OSAtomicTestAnd* deprecation
158+
# pragma clang diagnostic ignored "-Wdeprecated-declarations"
159159
OSATOMIC_INTERCEPTORS_BITOP(OSAtomicTestAndSet, __tsan_atomic8_fetch_or, false)
160160
OSATOMIC_INTERCEPTORS_BITOP(OSAtomicTestAndClear, __tsan_atomic8_fetch_and,
161161
true)
162+
# pragma clang diagnostic pop // OSAtomicTestAnd* deprecation
162163

163164
TSAN_INTERCEPTOR(void, OSAtomicEnqueue, OSQueueHead *list, void *item,
164165
size_t offset) {
@@ -196,6 +197,16 @@ TSAN_INTERCEPTOR(void *, OSAtomicFifoDequeue, OSFifoQueueHead *list,
196197

197198
# endif
198199

200+
// If `OSSPINLOCK_USE_INLINED=1` is set, then SDK headers don't declare these
201+
// as functions, but macros that call non-deprecated APIs. Undefine these
202+
// macros so they don't interfere with the interceptor machinery.
203+
# undef OSSpinLockLock
204+
# undef OSSpinLockTry
205+
# undef OSSpinLockUnlock
206+
207+
# pragma clang diagnostic push // OSSpinLock* deprecation
208+
# pragma clang diagnostic ignored "-Wdeprecated-declarations"
209+
199210
TSAN_INTERCEPTOR(void, OSSpinLockLock, volatile OSSpinLock *lock) {
200211
CHECK(!cur_thread()->is_dead);
201212
if (!cur_thread()->is_inited) {
@@ -227,6 +238,7 @@ TSAN_INTERCEPTOR(void, OSSpinLockUnlock, volatile OSSpinLock *lock) {
227238
Release(thr, pc, (uptr)lock);
228239
REAL(OSSpinLockUnlock)(lock);
229240
}
241+
# pragma clang diagnostic pop // OSSpinLock* deprecation
230242

231243
TSAN_INTERCEPTOR(void, os_lock_lock, void *lock) {
232244
CHECK(!cur_thread()->is_dead);

compiler-rt/lib/tsan/rtl/tsan_spinlock_defs_mac.h

Lines changed: 0 additions & 45 deletions
This file was deleted.

0 commit comments

Comments
 (0)