Skip to content

Commit 3a8f3b3

Browse files
DimitryAndricllvmbot
authored andcommitted
[TSan] Handle FreeBSD specific indirection of libpthread functions
Similar to 60cc1d3 for NetBSD, add aliases and interceptors for the following pthread related functions: - pthread_cond_init(3) - pthread_cond_destroy(3) - pthread_cond_signal(3) - pthread_cond_broadcast(3) - pthread_cond_wait(3) - pthread_mutex_init(3) - pthread_mutex_destroy(3) - pthread_mutex_lock(3) - pthread_mutex_trylock(3) - pthread_mutex_unlock(3) - pthread_rwlock_init(3) - pthread_rwlock_destroy(3) - pthread_rwlock_rdlock(3) - pthread_rwlock_tryrdlock(3) - pthread_rwlock_wrlock(3) - pthread_rwlock_trywrlock(3) - pthread_rwlock_unlock(3) - pthread_once(3) - pthread_sigmask(3) In FreeBSD's libc, a number of internal aliases of the pthread functions are invoked, typically with an additional prefixed underscore, e.g. _pthread_cond_init() and so on. ThreadSanitizer needs to intercept these aliases too, otherwise some false positive reports about data races might be produced. Reviewed By: dvyukov Differential Revision: https://reviews.llvm.org/D119034 (cherry picked from commit 28fb22c)
1 parent 52557b9 commit 3a8f3b3

File tree

2 files changed

+65
-12
lines changed

2 files changed

+65
-12
lines changed

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,14 @@ inline bool MustIgnoreInterceptor(ThreadState *thr) {
7878

7979
#define TSAN_INTERCEPTOR(ret, func, ...) INTERCEPTOR(ret, func, __VA_ARGS__)
8080

81+
#if SANITIZER_FREEBSD
82+
# define TSAN_INTERCEPTOR_FREEBSD_ALIAS(ret, func, ...) \
83+
TSAN_INTERCEPTOR(ret, _pthread_##func, __VA_ARGS__) \
84+
ALIAS(WRAPPER_NAME(pthread_##func));
85+
#else
86+
# define TSAN_INTERCEPTOR_FREEBSD_ALIAS(ret, func, ...)
87+
#endif
88+
8189
#if SANITIZER_NETBSD
8290
# define TSAN_INTERCEPTOR_NETBSD_ALIAS(ret, func, ...) \
8391
TSAN_INTERCEPTOR(ret, __libc_##func, __VA_ARGS__) \

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

Lines changed: 57 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -289,20 +289,25 @@ void ScopedInterceptor::DisableIgnoresImpl() {
289289
}
290290

291291
#define TSAN_INTERCEPT(func) INTERCEPT_FUNCTION(func)
292+
#if SANITIZER_FREEBSD || SANITIZER_NETBSD
293+
# define TSAN_INTERCEPT_VER(func, ver) INTERCEPT_FUNCTION(func)
294+
#else
295+
# define TSAN_INTERCEPT_VER(func, ver) INTERCEPT_FUNCTION_VER(func, ver)
296+
#endif
292297
#if SANITIZER_FREEBSD
293-
# define TSAN_INTERCEPT_VER(func, ver) INTERCEPT_FUNCTION(func)
294-
# define TSAN_MAYBE_INTERCEPT_NETBSD_ALIAS(func)
295-
# define TSAN_MAYBE_INTERCEPT_NETBSD_ALIAS_THR(func)
296-
#elif SANITIZER_NETBSD
297-
# define TSAN_INTERCEPT_VER(func, ver) INTERCEPT_FUNCTION(func)
298-
# define TSAN_MAYBE_INTERCEPT_NETBSD_ALIAS(func) \
299-
INTERCEPT_FUNCTION(__libc_##func)
300-
# define TSAN_MAYBE_INTERCEPT_NETBSD_ALIAS_THR(func) \
301-
INTERCEPT_FUNCTION(__libc_thr_##func)
298+
# define TSAN_MAYBE_INTERCEPT_FREEBSD_ALIAS(func) \
299+
INTERCEPT_FUNCTION(_pthread_##func)
302300
#else
303-
# define TSAN_INTERCEPT_VER(func, ver) INTERCEPT_FUNCTION_VER(func, ver)
304-
# define TSAN_MAYBE_INTERCEPT_NETBSD_ALIAS(func)
305-
# define TSAN_MAYBE_INTERCEPT_NETBSD_ALIAS_THR(func)
301+
# define TSAN_MAYBE_INTERCEPT_FREEBSD_ALIAS(func)
302+
#endif
303+
#if SANITIZER_NETBSD
304+
# define TSAN_MAYBE_INTERCEPT_NETBSD_ALIAS(func) \
305+
INTERCEPT_FUNCTION(__libc_##func)
306+
# define TSAN_MAYBE_INTERCEPT_NETBSD_ALIAS_THR(func) \
307+
INTERCEPT_FUNCTION(__libc_thr_##func)
308+
#else
309+
# define TSAN_MAYBE_INTERCEPT_NETBSD_ALIAS(func)
310+
# define TSAN_MAYBE_INTERCEPT_NETBSD_ALIAS_THR(func)
306311
#endif
307312

308313
#define READ_STRING_OF_LEN(thr, pc, s, len, n) \
@@ -2713,6 +2718,26 @@ TSAN_INTERCEPTOR(void, thr_exit, tid_t *state) {
27132718
#define TSAN_MAYBE_INTERCEPT_THR_EXIT
27142719
#endif
27152720

2721+
TSAN_INTERCEPTOR_FREEBSD_ALIAS(int, cond_init, void *c, void *a)
2722+
TSAN_INTERCEPTOR_FREEBSD_ALIAS(int, cond_destroy, void *c)
2723+
TSAN_INTERCEPTOR_FREEBSD_ALIAS(int, cond_signal, void *c)
2724+
TSAN_INTERCEPTOR_FREEBSD_ALIAS(int, cond_broadcast, void *c)
2725+
TSAN_INTERCEPTOR_FREEBSD_ALIAS(int, cond_wait, void *c, void *m)
2726+
TSAN_INTERCEPTOR_FREEBSD_ALIAS(int, mutex_init, void *m, void *a)
2727+
TSAN_INTERCEPTOR_FREEBSD_ALIAS(int, mutex_destroy, void *m)
2728+
TSAN_INTERCEPTOR_FREEBSD_ALIAS(int, mutex_lock, void *m)
2729+
TSAN_INTERCEPTOR_FREEBSD_ALIAS(int, mutex_trylock, void *m)
2730+
TSAN_INTERCEPTOR_FREEBSD_ALIAS(int, mutex_unlock, void *m)
2731+
TSAN_INTERCEPTOR_FREEBSD_ALIAS(int, rwlock_init, void *l, void *a)
2732+
TSAN_INTERCEPTOR_FREEBSD_ALIAS(int, rwlock_destroy, void *l)
2733+
TSAN_INTERCEPTOR_FREEBSD_ALIAS(int, rwlock_rdlock, void *l)
2734+
TSAN_INTERCEPTOR_FREEBSD_ALIAS(int, rwlock_tryrdlock, void *l)
2735+
TSAN_INTERCEPTOR_FREEBSD_ALIAS(int, rwlock_wrlock, void *l)
2736+
TSAN_INTERCEPTOR_FREEBSD_ALIAS(int, rwlock_trywrlock, void *l)
2737+
TSAN_INTERCEPTOR_FREEBSD_ALIAS(int, rwlock_unlock, void *l)
2738+
TSAN_INTERCEPTOR_FREEBSD_ALIAS(int, once, void *o, void (*i)())
2739+
TSAN_INTERCEPTOR_FREEBSD_ALIAS(int, sigmask, int f, void *n, void *o)
2740+
27162741
TSAN_INTERCEPTOR_NETBSD_ALIAS(int, cond_init, void *c, void *a)
27172742
TSAN_INTERCEPTOR_NETBSD_ALIAS(int, cond_signal, void *c)
27182743
TSAN_INTERCEPTOR_NETBSD_ALIAS(int, cond_broadcast, void *c)
@@ -2941,6 +2966,26 @@ void InitializeInterceptors() {
29412966
}
29422967
#endif
29432968

2969+
TSAN_MAYBE_INTERCEPT_FREEBSD_ALIAS(cond_init);
2970+
TSAN_MAYBE_INTERCEPT_FREEBSD_ALIAS(cond_destroy);
2971+
TSAN_MAYBE_INTERCEPT_FREEBSD_ALIAS(cond_signal);
2972+
TSAN_MAYBE_INTERCEPT_FREEBSD_ALIAS(cond_broadcast);
2973+
TSAN_MAYBE_INTERCEPT_FREEBSD_ALIAS(cond_wait);
2974+
TSAN_MAYBE_INTERCEPT_FREEBSD_ALIAS(mutex_init);
2975+
TSAN_MAYBE_INTERCEPT_FREEBSD_ALIAS(mutex_destroy);
2976+
TSAN_MAYBE_INTERCEPT_FREEBSD_ALIAS(mutex_lock);
2977+
TSAN_MAYBE_INTERCEPT_FREEBSD_ALIAS(mutex_trylock);
2978+
TSAN_MAYBE_INTERCEPT_FREEBSD_ALIAS(mutex_unlock);
2979+
TSAN_MAYBE_INTERCEPT_FREEBSD_ALIAS(rwlock_init);
2980+
TSAN_MAYBE_INTERCEPT_FREEBSD_ALIAS(rwlock_destroy);
2981+
TSAN_MAYBE_INTERCEPT_FREEBSD_ALIAS(rwlock_rdlock);
2982+
TSAN_MAYBE_INTERCEPT_FREEBSD_ALIAS(rwlock_tryrdlock);
2983+
TSAN_MAYBE_INTERCEPT_FREEBSD_ALIAS(rwlock_wrlock);
2984+
TSAN_MAYBE_INTERCEPT_FREEBSD_ALIAS(rwlock_trywrlock);
2985+
TSAN_MAYBE_INTERCEPT_FREEBSD_ALIAS(rwlock_unlock);
2986+
TSAN_MAYBE_INTERCEPT_FREEBSD_ALIAS(once);
2987+
TSAN_MAYBE_INTERCEPT_FREEBSD_ALIAS(sigmask);
2988+
29442989
TSAN_MAYBE_INTERCEPT_NETBSD_ALIAS(cond_init);
29452990
TSAN_MAYBE_INTERCEPT_NETBSD_ALIAS(cond_signal);
29462991
TSAN_MAYBE_INTERCEPT_NETBSD_ALIAS(cond_broadcast);

0 commit comments

Comments
 (0)