Skip to content

Commit 60cc1d3

Browse files
committed
Handle NetBSD specific indirection of libpthread functions
Summary: Correct handling of libpthread(3) functions in TSan/NetBSD: - pthread_cond_init(3), - pthread_cond_signal(3), - pthread_cond_broadcast(3), - pthread_cond_wait(3), - pthread_cond_destroy(3), - pthread_mutex_init(3), - pthread_mutex_destroy(3), - pthread_mutex_trylock(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). Code out of the libpthread(3) context uses the libc symbols that are prefixed with __libc_, for example: __libc_cond_init. This caused that these functions were invisible to sanitizers on NetBSD. Intercept the libc-specific ones and add them as NetBSD-specific aliases for the common pthread(3) ones. NetBSD needs to intercept both functions, as the regularly named ones are used internally in libpthread(3). Sponsored by <The NetBSD Foundation> Reviewers: joerg, dvyukov, vitalybuka Reviewed By: dvyukov Subscribers: kubamracek, llvm-commits, #sanitizers Tags: #sanitizers Differential Revision: https://reviews.llvm.org/D40243 llvm-svn: 318673
1 parent 1641866 commit 60cc1d3

File tree

2 files changed

+57
-1
lines changed

2 files changed

+57
-1
lines changed

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

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -284,10 +284,20 @@ void ScopedInterceptor::DisableIgnores() {
284284
}
285285

286286
#define TSAN_INTERCEPT(func) INTERCEPT_FUNCTION(func)
287-
#if SANITIZER_FREEBSD || SANITIZER_NETBSD
287+
#if SANITIZER_FREEBSD
288288
# define TSAN_INTERCEPT_VER(func, ver) INTERCEPT_FUNCTION(func)
289+
# define TSAN_MAYBE_INTERCEPT_NETBSD_ALIAS(func)
290+
# define TSAN_MAYBE_INTERCEPT_NETBSD_ALIAS_THR(func)
291+
#elif SANITIZER_NETBSD
292+
# define TSAN_INTERCEPT_VER(func, ver) INTERCEPT_FUNCTION(func)
293+
# define TSAN_MAYBE_INTERCEPT_NETBSD_ALIAS(func) \
294+
INTERCEPT_FUNCTION(__libc_##func)
295+
# define TSAN_MAYBE_INTERCEPT_NETBSD_ALIAS_THR(func) \
296+
INTERCEPT_FUNCTION(__libc_thr_##func)
289297
#else
290298
# define TSAN_INTERCEPT_VER(func, ver) INTERCEPT_FUNCTION_VER(func, ver)
299+
# define TSAN_MAYBE_INTERCEPT_NETBSD_ALIAS(func)
300+
# define TSAN_MAYBE_INTERCEPT_NETBSD_ALIAS_THR(func)
291301
#endif
292302

293303
#define READ_STRING_OF_LEN(thr, pc, s, len, n) \
@@ -2475,6 +2485,23 @@ TSAN_INTERCEPTOR(void, _lwp_exit) {
24752485
#define TSAN_MAYBE_INTERCEPT__LWP_EXIT
24762486
#endif
24772487

2488+
TSAN_INTERCEPTOR_NETBSD_ALIAS(int, cond_init, void *c, void *a);
2489+
TSAN_INTERCEPTOR_NETBSD_ALIAS(int, cond_signal, void *c);
2490+
TSAN_INTERCEPTOR_NETBSD_ALIAS(int, cond_broadcast, void *c);
2491+
TSAN_INTERCEPTOR_NETBSD_ALIAS(int, cond_wait, void *c, void *m);
2492+
TSAN_INTERCEPTOR_NETBSD_ALIAS(int, cond_destroy, void *c);
2493+
TSAN_INTERCEPTOR_NETBSD_ALIAS(int, mutex_init, void *m, void *a);
2494+
TSAN_INTERCEPTOR_NETBSD_ALIAS(int, mutex_destroy, void *m);
2495+
TSAN_INTERCEPTOR_NETBSD_ALIAS(int, mutex_trylock, void *m);
2496+
TSAN_INTERCEPTOR_NETBSD_ALIAS(int, rwlock_init, void *m, void *a);
2497+
TSAN_INTERCEPTOR_NETBSD_ALIAS(int, rwlock_destroy, void *m);
2498+
TSAN_INTERCEPTOR_NETBSD_ALIAS(int, rwlock_rdlock, void *m);
2499+
TSAN_INTERCEPTOR_NETBSD_ALIAS(int, rwlock_tryrdlock, void *m);
2500+
TSAN_INTERCEPTOR_NETBSD_ALIAS(int, rwlock_wrlock, void *m);
2501+
TSAN_INTERCEPTOR_NETBSD_ALIAS(int, rwlock_trywrlock, void *m);
2502+
TSAN_INTERCEPTOR_NETBSD_ALIAS(int, rwlock_unlock, void *m);
2503+
TSAN_INTERCEPTOR_NETBSD_ALIAS_THR(int, once, void *o, void (*f)());
2504+
24782505
namespace __tsan {
24792506

24802507
static void finalize(void *arg) {
@@ -2664,6 +2691,23 @@ void InitializeInterceptors() {
26642691
}
26652692
#endif
26662693

2694+
TSAN_MAYBE_INTERCEPT_NETBSD_ALIAS(cond_init);
2695+
TSAN_MAYBE_INTERCEPT_NETBSD_ALIAS(cond_signal);
2696+
TSAN_MAYBE_INTERCEPT_NETBSD_ALIAS(cond_broadcast);
2697+
TSAN_MAYBE_INTERCEPT_NETBSD_ALIAS(cond_wait);
2698+
TSAN_MAYBE_INTERCEPT_NETBSD_ALIAS(cond_destroy);
2699+
TSAN_MAYBE_INTERCEPT_NETBSD_ALIAS(mutex_init);
2700+
TSAN_MAYBE_INTERCEPT_NETBSD_ALIAS(mutex_destroy);
2701+
TSAN_MAYBE_INTERCEPT_NETBSD_ALIAS(mutex_trylock);
2702+
TSAN_MAYBE_INTERCEPT_NETBSD_ALIAS(rwlock_init);
2703+
TSAN_MAYBE_INTERCEPT_NETBSD_ALIAS(rwlock_destroy);
2704+
TSAN_MAYBE_INTERCEPT_NETBSD_ALIAS(rwlock_rdlock);
2705+
TSAN_MAYBE_INTERCEPT_NETBSD_ALIAS(rwlock_tryrdlock);
2706+
TSAN_MAYBE_INTERCEPT_NETBSD_ALIAS(rwlock_wrlock);
2707+
TSAN_MAYBE_INTERCEPT_NETBSD_ALIAS(rwlock_trywrlock);
2708+
TSAN_MAYBE_INTERCEPT_NETBSD_ALIAS(rwlock_unlock);
2709+
TSAN_MAYBE_INTERCEPT_NETBSD_ALIAS_THR(once);
2710+
26672711
FdInit();
26682712
}
26692713

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,4 +49,16 @@ LibIgnore *libignore();
4949

5050
#define TSAN_INTERCEPTOR(ret, func, ...) INTERCEPTOR(ret, func, __VA_ARGS__)
5151

52+
#if SANITIZER_NETBSD
53+
# define TSAN_INTERCEPTOR_NETBSD_ALIAS(ret, func, ...) \
54+
TSAN_INTERCEPTOR(ret, __libc_##func, __VA_ARGS__) \
55+
ALIAS(WRAPPER_NAME(pthread_##func));
56+
# define TSAN_INTERCEPTOR_NETBSD_ALIAS_THR(ret, func, ...) \
57+
TSAN_INTERCEPTOR(ret, __libc_thr_##func, __VA_ARGS__) \
58+
ALIAS(WRAPPER_NAME(pthread_##func));
59+
#else
60+
# define TSAN_INTERCEPTOR_NETBSD_ALIAS(func)
61+
# define TSAN_INTERCEPTOR_NETBSD_ALIAS_THR(func)
62+
#endif
63+
5264
#endif // TSAN_INTERCEPTORS_H

0 commit comments

Comments
 (0)