From 90a460c0cc0f7e1cca7931dd15e07fafb58c3663 Mon Sep 17 00:00:00 2001 From: Dmitry Vyukov Date: Tue, 4 Mar 2014 10:17:40 +0000 Subject: [PATCH] tsan: move all pthread_cond interceptors into sanitizer_common git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@202813 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../sanitizer_common_interceptors.inc | 56 +++++++++++++--------- lib/tsan/rtl/tsan_interceptors.cc | 20 -------- 2 files changed, 33 insertions(+), 43 deletions(-) diff --git a/lib/sanitizer_common/sanitizer_common_interceptors.inc b/lib/sanitizer_common/sanitizer_common_interceptors.inc index 87862d874..094c0ee55 100644 --- a/lib/sanitizer_common/sanitizer_common_interceptors.inc +++ b/lib/sanitizer_common/sanitizer_common_interceptors.inc @@ -2431,50 +2431,63 @@ INTERCEPTOR(int, pthread_mutex_unlock, void *m) { #endif #if SANITIZER_INTERCEPT_PTHREAD_COND +INTERCEPTOR(int, pthread_cond_init, void *c, void *a) { + void *ctx; + COMMON_INTERCEPTOR_ENTER(ctx, pthread_cond_init, c, a); + COMMON_INTERCEPTOR_WRITE_RANGE(ctx, c, 1); + return REAL(pthread_cond_init)(c, a); +} + INTERCEPTOR(int, pthread_cond_wait, void *c, void *m) { void *ctx; COMMON_INTERCEPTOR_ENTER(ctx, pthread_cond_wait, c, m); COMMON_INTERCEPTOR_MUTEX_UNLOCK(ctx, m); - COMMON_INTERCEPTOR_READ_RANGE(ctx, c, pthread_cond_t_sz); + COMMON_INTERCEPTOR_READ_RANGE(ctx, c, 1); int res = REAL(pthread_cond_wait)(c, m); COMMON_INTERCEPTOR_MUTEX_LOCK(ctx, m); return res; } -INTERCEPTOR(int, pthread_cond_init, void *c, void *a) { +INTERCEPTOR(int, pthread_cond_timedwait, void *c, void *m, void *abstime) { void *ctx; - COMMON_INTERCEPTOR_ENTER(ctx, pthread_cond_init, c, a); - COMMON_INTERCEPTOR_WRITE_RANGE(ctx, c, pthread_cond_t_sz); - return REAL(pthread_cond_init)(c, a); + COMMON_INTERCEPTOR_ENTER(ctx, pthread_cond_timedwait, c, m, abstime); + COMMON_INTERCEPTOR_MUTEX_UNLOCK(ctx, m); + COMMON_INTERCEPTOR_READ_RANGE(ctx, c, 1); + int res = REAL(pthread_cond_timedwait)(c, m, abstime); + COMMON_INTERCEPTOR_MUTEX_LOCK(ctx, m); + return res; } INTERCEPTOR(int, pthread_cond_signal, void *c) { void *ctx; COMMON_INTERCEPTOR_ENTER(ctx, pthread_cond_signal, c); - COMMON_INTERCEPTOR_READ_RANGE(ctx, c, pthread_cond_t_sz); + COMMON_INTERCEPTOR_READ_RANGE(ctx, c, 1); return REAL(pthread_cond_signal)(c); } INTERCEPTOR(int, pthread_cond_broadcast, void *c) { void *ctx; COMMON_INTERCEPTOR_ENTER(ctx, pthread_cond_broadcast, c); - COMMON_INTERCEPTOR_READ_RANGE(ctx, c, pthread_cond_t_sz); + COMMON_INTERCEPTOR_READ_RANGE(ctx, c, 1); return REAL(pthread_cond_broadcast)(c); } -#define INIT_PTHREAD_COND_WAIT \ - INTERCEPT_FUNCTION_VER(pthread_cond_wait, "GLIBC_2.3.2") -#define INIT_PTHREAD_COND_INIT \ - INTERCEPT_FUNCTION_VER(pthread_cond_init, "GLIBC_2.3.2") -#define INIT_PTHREAD_COND_SIGNAL \ - INTERCEPT_FUNCTION_VER(pthread_cond_signal, "GLIBC_2.3.2") -#define INIT_PTHREAD_COND_BROADCAST \ - INTERCEPT_FUNCTION_VER(pthread_cond_broadcast, "GLIBC_2.3.2") +INTERCEPTOR(int, pthread_cond_destroy, void *c) { + void *ctx; + COMMON_INTERCEPTOR_ENTER(ctx, pthread_cond_destroy, c); + COMMON_INTERCEPTOR_WRITE_RANGE(ctx, c, 1); + return REAL(pthread_cond_destroy)(c); +} + +#define INIT_PTHREAD_COND \ + INTERCEPT_FUNCTION_VER(pthread_cond_init, "GLIBC_2.3.2"); \ + INTERCEPT_FUNCTION_VER(pthread_cond_signal, "GLIBC_2.3.2"); \ + INTERCEPT_FUNCTION_VER(pthread_cond_broadcast, "GLIBC_2.3.2"); \ + INTERCEPT_FUNCTION_VER(pthread_cond_wait, "GLIBC_2.3.2"); \ + INTERCEPT_FUNCTION_VER(pthread_cond_timedwait, "GLIBC_2.3.2"); \ + INTERCEPT_FUNCTION_VER(pthread_cond_destroy, "GLIBC_2.3.2") #else -#define INIT_PTHREAD_COND_WAIT -#define INIT_PTHREAD_COND_INIT -#define INIT_PTHREAD_COND_SIGNAL -#define INIT_PTHREAD_COND_BROADCAST +#define INIT_PTHREAD_COND #endif #if SANITIZER_INTERCEPT_GETMNTENT || SANITIZER_INTERCEPT_GETMNTENT_R @@ -3385,10 +3398,7 @@ INTERCEPTOR(int, capset, void *hdrp, const void *datap) { INIT__EXIT; \ INIT_PTHREAD_MUTEX_LOCK; \ INIT_PTHREAD_MUTEX_UNLOCK; \ - INIT_PTHREAD_COND_WAIT; \ - INIT_PTHREAD_COND_INIT; \ - INIT_PTHREAD_COND_SIGNAL; \ - INIT_PTHREAD_COND_BROADCAST; \ + INIT_PTHREAD_COND; \ INIT_GETMNTENT; \ INIT_GETMNTENT_R; \ INIT_STATFS; \ diff --git a/lib/tsan/rtl/tsan_interceptors.cc b/lib/tsan/rtl/tsan_interceptors.cc index 1d35003e2..892393322 100644 --- a/lib/tsan/rtl/tsan_interceptors.cc +++ b/lib/tsan/rtl/tsan_interceptors.cc @@ -1095,23 +1095,6 @@ TSAN_INTERCEPTOR(int, pthread_rwlock_unlock, void *m) { return res; } -TSAN_INTERCEPTOR(int, pthread_cond_destroy, void *c) { - SCOPED_TSAN_INTERCEPTOR(pthread_cond_destroy, c); - MemoryWrite(thr, pc, (uptr)c, kSizeLog1); - int res = REAL(pthread_cond_destroy)(c); - return res; -} - -TSAN_INTERCEPTOR(int, pthread_cond_timedwait, void *c, void *m, - void *abstime) { - SCOPED_TSAN_INTERCEPTOR(pthread_cond_timedwait, c, m, abstime); - MutexUnlock(thr, pc, (uptr)m); - MemoryRead(thr, pc, (uptr)c, kSizeLog1); - int res = REAL(pthread_cond_timedwait)(c, m, abstime); - MutexLock(thr, pc, (uptr)m); - return res; -} - TSAN_INTERCEPTOR(int, pthread_barrier_init, void *b, void *a, unsigned count) { SCOPED_TSAN_INTERCEPTOR(pthread_barrier_init, b, a, count); MemoryWrite(thr, pc, (uptr)b, kSizeLog1); @@ -2216,9 +2199,6 @@ void InitializeInterceptors() { TSAN_INTERCEPT(pthread_rwlock_timedwrlock); TSAN_INTERCEPT(pthread_rwlock_unlock); - INTERCEPT_FUNCTION_VER(pthread_cond_destroy, "GLIBC_2.3.2"); - INTERCEPT_FUNCTION_VER(pthread_cond_timedwait, "GLIBC_2.3.2"); - TSAN_INTERCEPT(pthread_barrier_init); TSAN_INTERCEPT(pthread_barrier_destroy); TSAN_INTERCEPT(pthread_barrier_wait); -- 2.11.4.GIT