From a7978cd72277e1ae974c00dd42336698889b6156 Mon Sep 17 00:00:00 2001 From: Kamil Rytarowski Date: Wed, 6 Dec 2017 22:50:12 +0000 Subject: Revert SVN r, 319967 "Correct atexit(3) support in MSan/NetBSD" This causes failures on Linux. git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@319981 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/msan/msan_interceptors.cc | 66 ++----------------------------------------- 1 file changed, 3 insertions(+), 63 deletions(-) (limited to 'lib') diff --git a/lib/msan/msan_interceptors.cc b/lib/msan/msan_interceptors.cc index 69c1aeb73..ae9c89494 100644 --- a/lib/msan/msan_interceptors.cc +++ b/lib/msan/msan_interceptors.cc @@ -33,7 +33,6 @@ #include "sanitizer_common/sanitizer_libc.h" #include "sanitizer_common/sanitizer_linux.h" #include "sanitizer_common/sanitizer_tls_get_addr.h" -#include "sanitizer_common/sanitizer_vector.h" #if SANITIZER_NETBSD #define gettimeofday __gettimeofday50 @@ -1122,78 +1121,23 @@ struct MSanAtExitRecord { void *arg; }; -struct InterceptorContext { - BlockingMutex atexit_mu; - Vector AtExitStack; - - InterceptorContext() - : AtExitStack() { - } -}; - -static ALIGNED(64) char interceptor_placeholder[sizeof(InterceptorContext)]; -InterceptorContext *interceptor_ctx() { - return reinterpret_cast(&interceptor_placeholder[0]); -} - -void MSanAtExitWrapper() { - MSanAtExitRecord *r; - { - BlockingMutexLock l(&interceptor_ctx()->atexit_mu); - - uptr element = interceptor_ctx()->AtExitStack.Size() - 1; - r = interceptor_ctx()->AtExitStack[element]; - interceptor_ctx()->AtExitStack.PopBack(); - } - - UnpoisonParam(1); - ((void(*)())r->func)(); - InternalFree(r); -} - -void MSanCxaAtExitWrapper(void *arg) { +void MSanAtExitWrapper(void *arg) { UnpoisonParam(1); MSanAtExitRecord *r = (MSanAtExitRecord *)arg; r->func(r->arg); InternalFree(r); } -static int setup_at_exit_wrapper(void(*f)(), void *arg, void *dso); - -// Unpoison argument shadow for C++ module destructors. -INTERCEPTOR(int, atexit, void (*func)()) { - if (msan_init_is_running) return REAL(atexit)(func); - return setup_at_exit_wrapper((void(*)())func, 0, 0); -} - // Unpoison argument shadow for C++ module destructors. INTERCEPTOR(int, __cxa_atexit, void (*func)(void *), void *arg, void *dso_handle) { if (msan_init_is_running) return REAL(__cxa_atexit)(func, arg, dso_handle); - return setup_at_exit_wrapper((void(*)())func, arg, dso_handle); -} - -static int setup_at_exit_wrapper(void(*f)(), void *arg, void *dso) { ENSURE_MSAN_INITED(); MSanAtExitRecord *r = (MSanAtExitRecord *)InternalAlloc(sizeof(MSanAtExitRecord)); - r->func = (void(*)(void *a))f; + r->func = func; r->arg = arg; - int res; - if (!dso) { - // NetBSD does not preserve the 2nd argument if dso is equal to 0 - // Store ctx in a local stack-like structure - - BlockingMutexLock l(&interceptor_ctx()->atexit_mu); - - res = REAL(__cxa_atexit)((void (*)(void *a))MSanAtExitWrapper, 0, 0); - if (!res) { - interceptor_ctx()->AtExitStack.PushBack(r); - } - } else { - res = REAL(__cxa_atexit)(MSanCxaAtExitWrapper, r, dso); - } - return res; + return REAL(__cxa_atexit)(MSanAtExitWrapper, r, dso_handle); } static void BeforeFork() { @@ -1591,9 +1535,6 @@ namespace __msan { void InitializeInterceptors() { static int inited = 0; CHECK_EQ(inited, 0); - - new(interceptor_ctx()) InterceptorContext(); - InitializeCommonInterceptors(); InitializeSignalInterceptors(); @@ -1709,7 +1650,6 @@ void InitializeInterceptors() { INTERCEPT_FUNCTION(pthread_join); INTERCEPT_FUNCTION(tzset); - INTERCEPT_FUNCTION(atexit); INTERCEPT_FUNCTION(__cxa_atexit); INTERCEPT_FUNCTION(shmat); INTERCEPT_FUNCTION(fork); -- cgit v1.2.3