diff options
author | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2013-03-13 08:19:53 +0000 |
---|---|---|
committer | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2013-03-13 08:19:53 +0000 |
commit | 5697b58ec4f8d23b04906aa547a80c093abe6bf2 (patch) | |
tree | 9fe83616ce888625b85cd8864ff4d988ec8e9748 /compiler-rt/lib/sanitizer_common/sanitizer_linux.cc | |
parent | 24aad9c0cbb10d676f3be4fde4a0a856943c5945 (diff) | |
download | bcm5719-llvm-5697b58ec4f8d23b04906aa547a80c093abe6bf2.tar.gz bcm5719-llvm-5697b58ec4f8d23b04906aa547a80c093abe6bf2.zip |
[sanitizer] Move GetTlsSize code from TSan to sanitizer_common.
llvm-svn: 176938
Diffstat (limited to 'compiler-rt/lib/sanitizer_common/sanitizer_linux.cc')
-rw-r--r-- | compiler-rt/lib/sanitizer_common/sanitizer_linux.cc | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_linux.cc b/compiler-rt/lib/sanitizer_common/sanitizer_linux.cc index cd6adc7aecb..7384ef3d200 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_linux.cc +++ b/compiler-rt/lib/sanitizer_common/sanitizer_linux.cc @@ -22,6 +22,7 @@ #include "sanitizer_procmaps.h" #include "sanitizer_stacktrace.h" +#include <dlfcn.h> #include <errno.h> #include <fcntl.h> #include <pthread.h> @@ -673,6 +674,34 @@ bool ThreadLister::GetDirectoryEntries() { return true; } +static uptr g_tls_size; + +#ifdef __i386__ +# define DL_INTERNAL_FUNCTION __attribute__((regparm(3), stdcall)) +#else +# define DL_INTERNAL_FUNCTION +#endif + +void InitTlsSize() { +#ifndef SANITIZER_GO + typedef void (*get_tls_func)(size_t*, size_t*) DL_INTERNAL_FUNCTION; + get_tls_func get_tls; + void *get_tls_static_info_ptr = dlsym(RTLD_NEXT, "_dl_get_tls_static_info"); + CHECK_EQ(sizeof(get_tls), sizeof(get_tls_static_info_ptr)); + internal_memcpy(&get_tls, &get_tls_static_info_ptr, + sizeof(get_tls_static_info_ptr)); + CHECK_NE(get_tls, 0); + size_t tls_size = 0; + size_t tls_align = 0; + get_tls(&tls_size, &tls_align); + g_tls_size = tls_size; +#endif +} + +uptr GetTlsSize() { + return g_tls_size; +} + } // namespace __sanitizer #endif // __linux__ |