diff options
author | Sergey Matveev <earthdok@google.com> | 2013-05-07 14:41:43 +0000 |
---|---|---|
committer | Sergey Matveev <earthdok@google.com> | 2013-05-07 14:41:43 +0000 |
commit | 24323de08fa8850712d56621bff29dbbbd0285a9 (patch) | |
tree | 2ac35bf2be079d42730993b97616e163d5ab4b84 /lib/tsan/rtl/tsan_platform_linux.cc | |
parent | 2be3a283939d4fc14ad86f6cd8be34b1468f22ba (diff) | |
download | compiler-rt-24323de08fa8850712d56621bff29dbbbd0285a9.tar.gz |
[sanitizer] Move GetThreadStackAndTls from TSan to sanitizer_common.
Move this function to sanitizer_common because LSan uses it too. Also, fix a bug
where the TLS range reported for main thread was off by the size of the thread
descriptor from libc (TSan doesn't care much, but for LSan it's critical).
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@181322 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/tsan/rtl/tsan_platform_linux.cc')
-rw-r--r-- | lib/tsan/rtl/tsan_platform_linux.cc | 31 |
1 files changed, 0 insertions, 31 deletions
diff --git a/lib/tsan/rtl/tsan_platform_linux.cc b/lib/tsan/rtl/tsan_platform_linux.cc index 00b862104..df07ac638 100644 --- a/lib/tsan/rtl/tsan_platform_linux.cc +++ b/lib/tsan/rtl/tsan_platform_linux.cc @@ -23,7 +23,6 @@ #include "tsan_rtl.h" #include "tsan_flags.h" -#include <asm/prctl.h> #include <fcntl.h> #include <pthread.h> #include <signal.h> @@ -46,7 +45,6 @@ #include <resolv.h> #include <malloc.h> -extern "C" int arch_prctl(int code, __sanitizer::uptr *addr); extern "C" struct mallinfo __libc_mallinfo(); namespace __tsan { @@ -358,35 +356,6 @@ const char *InitializePlatform() { return GetEnv(kTsanOptionsEnv); } -void GetThreadStackAndTls(bool main, uptr *stk_addr, uptr *stk_size, - uptr *tls_addr, uptr *tls_size) { -#ifndef TSAN_GO - arch_prctl(ARCH_GET_FS, tls_addr); - *tls_size = GetTlsSize(); - *tls_addr -= *tls_size; - - uptr stack_top, stack_bottom; - GetThreadStackTopAndBottom(main, &stack_top, &stack_bottom); - *stk_addr = stack_bottom; - *stk_size = stack_top - stack_bottom; - - if (!main) { - // If stack and tls intersect, make them non-intersecting. - if (*tls_addr > *stk_addr && *tls_addr < *stk_addr + *stk_size) { - CHECK_GT(*tls_addr + *tls_size, *stk_addr); - CHECK_LE(*tls_addr + *tls_size, *stk_addr + *stk_size); - *stk_size -= *tls_size; - *tls_addr = *stk_addr + *stk_size; - } - } -#else - *stk_addr = 0; - *stk_size = 0; - *tls_addr = 0; - *tls_size = 0; -#endif -} - bool IsGlobalVar(uptr addr) { return g_data_start && addr >= g_data_start && addr < g_data_end; } |