diff options
author | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2014-04-04 09:47:41 +0000 |
---|---|---|
committer | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2014-04-04 09:47:41 +0000 |
commit | ba4ad34df1af1c321da0981e1aaff9d35c45d37f (patch) | |
tree | e1d8ac67bf297961c9cf31724f7709c2380d507c /lib/msan/msan_interceptors.cc | |
parent | 8dc0d7f875b37003ce805dfe04c88bee3f02a6b8 (diff) |
[msan] Introduce MsanThread. Move thread-local allocator cache out of TLS.
This reduces .tbss from 109K down to almost nothing.
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@205618 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/msan/msan_interceptors.cc')
-rw-r--r-- | lib/msan/msan_interceptors.cc | 69 |
1 files changed, 13 insertions, 56 deletions
diff --git a/lib/msan/msan_interceptors.cc b/lib/msan/msan_interceptors.cc index 6f7f4e6f8..580a7f881 100644 --- a/lib/msan/msan_interceptors.cc +++ b/lib/msan/msan_interceptors.cc @@ -16,6 +16,7 @@ //===----------------------------------------------------------------------===// #include "msan.h" +#include "msan_thread.h" #include "sanitizer_common/sanitizer_platform_limits_posix.h" #include "sanitizer_common/sanitizer_allocator.h" #include "sanitizer_common/sanitizer_allocator_internal.h" @@ -37,8 +38,6 @@ using __sanitizer::atomic_load; using __sanitizer::atomic_store; using __sanitizer::atomic_uintptr_t; -static unsigned g_thread_finalize_key; - // True if this is a nested interceptor. static THREADLOCAL int in_interceptor_scope; @@ -1038,48 +1037,11 @@ INTERCEPTOR(int, signal, int signo, uptr cb) { extern "C" int pthread_attr_init(void *attr); extern "C" int pthread_attr_destroy(void *attr); -extern "C" int pthread_setspecific(unsigned key, const void *v); -extern "C" int pthread_yield(); - -static void thread_finalize(void *v) { - uptr iter = (uptr)v; - if (iter > 1) { - if (pthread_setspecific(g_thread_finalize_key, (void*)(iter - 1))) { - Printf("MemorySanitizer: failed to set thread key\n"); - Die(); - } - return; - } - MsanAllocatorThreadFinish(); - __msan_unpoison((void *)msan_stack_bounds.stack_addr, - msan_stack_bounds.stack_size); - if (msan_stack_bounds.tls_size) - __msan_unpoison((void *)msan_stack_bounds.tls_addr, - msan_stack_bounds.tls_size); -} - -struct ThreadParam { - void* (*callback)(void *arg); - void *param; - atomic_uintptr_t done; -}; static void *MsanThreadStartFunc(void *arg) { - ThreadParam *p = (ThreadParam *)arg; - void* (*callback)(void *arg) = p->callback; - void *param = p->param; - if (pthread_setspecific(g_thread_finalize_key, - (void *)kPthreadDestructorIterations)) { - Printf("MemorySanitizer: failed to set thread key\n"); - Die(); - } - atomic_store(&p->done, 1, memory_order_release); - - GetThreadStackAndTls(/* main */ false, &msan_stack_bounds.stack_addr, - &msan_stack_bounds.stack_size, - &msan_stack_bounds.tls_addr, - &msan_stack_bounds.tls_size); - return IndirectExternCall(callback)(param); + MsanThread *t = (MsanThread *)arg; + SetCurrentThread(t); + return t->ThreadStart(); } INTERCEPTOR(int, pthread_create, void *th, void *attr, void *(*callback)(void*), @@ -1093,16 +1055,9 @@ INTERCEPTOR(int, pthread_create, void *th, void *attr, void *(*callback)(void*), AdjustStackSize(attr); - ThreadParam p; - p.callback = callback; - p.param = param; - atomic_store(&p.done, 0, memory_order_relaxed); + MsanThread *t = MsanThread::Create(callback, param); - int res = REAL(pthread_create)(th, attr, MsanThreadStartFunc, (void *)&p); - if (res == 0) { - while (atomic_load(&p.done, memory_order_acquire) != 1) - pthread_yield(); - } + int res = REAL(pthread_create)(th, attr, MsanThreadStartFunc, t); if (attr == &myattr) pthread_attr_destroy(&myattr); @@ -1114,6 +1069,7 @@ INTERCEPTOR(int, pthread_create, void *th, void *attr, void *(*callback)(void*), INTERCEPTOR(int, pthread_key_create, __sanitizer_pthread_key_t *key, void (*dtor)(void *value)) { + if (msan_init_is_running) return REAL(pthread_key_create)(key, dtor); ENSURE_MSAN_INITED(); int res = REAL(pthread_key_create)(key, dtor); if (!res && key) @@ -1368,6 +1324,8 @@ void __msan_clear_and_unpoison(void *a, uptr size) { } void *__msan_memcpy(void *dest, const void *src, SIZE_T n) { + if (!msan_inited) return internal_memcpy(dest, src, n); + if (msan_init_is_running) return REAL(memcpy)(dest, src, n); ENSURE_MSAN_INITED(); GET_STORE_STACK_TRACE; void *res = fast_memcpy(dest, src, n); @@ -1376,6 +1334,8 @@ void *__msan_memcpy(void *dest, const void *src, SIZE_T n) { } void *__msan_memset(void *s, int c, SIZE_T n) { + if (!msan_inited) return internal_memset(s, c, n); + if (msan_init_is_running) return REAL(memset)(s, c, n); ENSURE_MSAN_INITED(); void *res = fast_memset(s, c, n); __msan_unpoison(s, n); @@ -1383,6 +1343,8 @@ void *__msan_memset(void *s, int c, SIZE_T n) { } void *__msan_memmove(void *dest, const void *src, SIZE_T n) { + if (!msan_inited) return internal_memmove(dest, src, n); + if (msan_init_is_running) return REAL(memmove)(dest, src, n); ENSURE_MSAN_INITED(); GET_STORE_STACK_TRACE; void *res = REAL(memmove)(dest, src, n); @@ -1603,11 +1565,6 @@ void InitializeInterceptors() { INTERCEPT_FUNCTION(__cxa_atexit); INTERCEPT_FUNCTION(shmat); - if (REAL(pthread_key_create)(&g_thread_finalize_key, &thread_finalize)) { - Printf("MemorySanitizer: failed to create thread key\n"); - Die(); - } - inited = 1; } } // namespace __msan |