diff options
author | Vitaly Buka <vitalybuka@google.com> | 2018-05-14 18:03:34 +0000 |
---|---|---|
committer | Vitaly Buka <vitalybuka@google.com> | 2018-05-14 18:03:34 +0000 |
commit | 0a425a4b904f244b2b34edf971e405cbc5c7203a (patch) | |
tree | cd46e872419f0f88f590f9a16f16eb7d4c1c50ac | |
parent | 7bb5a5d2e5f6c07afefd5fde2d7f858663b3da08 (diff) |
[sanitizer] Intercept __pthread_mutex_lock and __pthread_mutex_unlock
Reviewers: eugenis, dvyukov
Subscribers: srhines, kubamracek, llvm-commits
Differential Revision: https://reviews.llvm.org/D46793
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@332268 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/sanitizer_common/sanitizer_common_interceptors.inc | 18 | ||||
-rw-r--r-- | lib/sanitizer_common/sanitizer_platform_interceptors.h | 1 | ||||
-rw-r--r-- | test/sanitizer_common/TestCases/Linux/pthread_mutex.cc | 34 |
3 files changed, 53 insertions, 0 deletions
diff --git a/lib/sanitizer_common/sanitizer_common_interceptors.inc b/lib/sanitizer_common/sanitizer_common_interceptors.inc index 9285ce071..2729f3438 100644 --- a/lib/sanitizer_common/sanitizer_common_interceptors.inc +++ b/lib/sanitizer_common/sanitizer_common_interceptors.inc @@ -4054,6 +4054,22 @@ INTERCEPTOR(int, pthread_mutex_unlock, void *m) { #define INIT_PTHREAD_MUTEX_UNLOCK #endif +#if SANITIZER_INTERCEPT___PTHREAD_MUTEX +INTERCEPTOR(int, __pthread_mutex_lock, void *m) +ALIAS(WRAPPER_NAME(pthread_mutex_lock)); + +INTERCEPTOR(int, __pthread_mutex_unlock, void *m) +ALIAS(WRAPPER_NAME(pthread_mutex_unlock)); + +#define INIT___PTHREAD_MUTEX_LOCK \ + COMMON_INTERCEPT_FUNCTION(__pthread_mutex_lock) +#define INIT___PTHREAD_MUTEX_UNLOCK \ + COMMON_INTERCEPT_FUNCTION(__pthread_mutex_unlock) +#else +#define INIT___PTHREAD_MUTEX_LOCK +#define INIT___PTHREAD_MUTEX_UNLOCK +#endif + #if SANITIZER_INTERCEPT___LIBC_MUTEX INTERCEPTOR(int, __libc_mutex_lock, void *m) ALIAS(WRAPPER_NAME(pthread_mutex_lock)); @@ -7302,6 +7318,8 @@ static void InitializeCommonInterceptors() { INIT__EXIT; INIT_PTHREAD_MUTEX_LOCK; INIT_PTHREAD_MUTEX_UNLOCK; + INIT___PTHREAD_MUTEX_LOCK; + INIT___PTHREAD_MUTEX_UNLOCK; INIT___LIBC_MUTEX_LOCK; INIT___LIBC_MUTEX_UNLOCK; INIT___LIBC_THR_SETCANCELSTATE; diff --git a/lib/sanitizer_common/sanitizer_platform_interceptors.h b/lib/sanitizer_common/sanitizer_platform_interceptors.h index 4bb70b630..cb0a8c344 100644 --- a/lib/sanitizer_common/sanitizer_platform_interceptors.h +++ b/lib/sanitizer_common/sanitizer_platform_interceptors.h @@ -365,6 +365,7 @@ (SI_LINUX || SI_FREEBSD || SI_NETBSD || SI_OPENBSD || SI_MAC || SI_SOLARIS) #define SANITIZER_INTERCEPT_PTHREAD_MUTEX SI_POSIX +#define SANITIZER_INTERCEPT___PTHREAD_MUTEX SI_LINUX_NOT_ANDROID #define SANITIZER_INTERCEPT___LIBC_MUTEX SI_NETBSD #define SANITIZER_INTERCEPT_PTHREAD_SETNAME_NP \ (SI_FREEBSD || SI_NETBSD || SI_OPENBSD || SI_LINUX_NOT_ANDROID || SI_SOLARIS) diff --git a/test/sanitizer_common/TestCases/Linux/pthread_mutex.cc b/test/sanitizer_common/TestCases/Linux/pthread_mutex.cc new file mode 100644 index 000000000..610958143 --- /dev/null +++ b/test/sanitizer_common/TestCases/Linux/pthread_mutex.cc @@ -0,0 +1,34 @@ +// RUN: %clangxx -O1 %s -o %t && %run %t +// RUN: %clangxx -O1 -DUSE_GLIBC %s -o %t && %run %t +// UNSUPPORTED: android + +#include <pthread.h> + +#ifdef USE_GLIBC +extern "C" int __pthread_mutex_lock(pthread_mutex_t *__mutex); +extern "C" int __pthread_mutex_unlock(pthread_mutex_t *__mutex); +#define LOCK __pthread_mutex_lock +#define UNLOCK __pthread_mutex_unlock +#else +#define LOCK pthread_mutex_lock +#define UNLOCK pthread_mutex_unlock +#endif + +pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER; +int x; + +static void *Start(void *arg) { + LOCK(&m); + ++x; + UNLOCK(&m); + return nullptr; +} + +int main() { + pthread_t threads[2] = {}; + for (pthread_t &t : threads) + pthread_create(&t, 0, &Start, 0); + for (pthread_t &t : threads) + pthread_join(t, 0); + return 0; +} |