summaryrefslogtreecommitdiffstats
path: root/compiler-rt/lib/sanitizer_common/sanitizer_linux.cc
diff options
context:
space:
mode:
authorEvgeniy Stepanov <eugeni.stepanov@gmail.com>2013-03-13 08:19:53 +0000
committerEvgeniy Stepanov <eugeni.stepanov@gmail.com>2013-03-13 08:19:53 +0000
commit5697b58ec4f8d23b04906aa547a80c093abe6bf2 (patch)
tree9fe83616ce888625b85cd8864ff4d988ec8e9748 /compiler-rt/lib/sanitizer_common/sanitizer_linux.cc
parent24aad9c0cbb10d676f3be4fde4a0a856943c5945 (diff)
downloadbcm5719-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.cc29
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__
OpenPOWER on IntegriCloud