aboutsummaryrefslogtreecommitdiff
path: root/libsanitizer/tsan
diff options
context:
space:
mode:
authorMarkus Trippelsdorf <markus@trippelsdorf.de>2016-11-16 11:21:42 +0000
committerMarkus Trippelsdorf <trippels@gcc.gnu.org>2016-11-16 11:21:42 +0000
commit8c32ae0e6df1c4dbd2eea98bc56b401d492e8f54 (patch)
treec9e26a39979be67a36918635a65bd47730002ee0 /libsanitizer/tsan
parent949cc52d0c99dd5fde0c48d9853e25ca55a73193 (diff)
downloadgcc-8c32ae0e6df1c4dbd2eea98bc56b401d492e8f54.zip
gcc-8c32ae0e6df1c4dbd2eea98bc56b401d492e8f54.tar.gz
gcc-8c32ae0e6df1c4dbd2eea98bc56b401d492e8f54.tar.bz2
Fix PR78294 - thread sanitizer broken when using ld.gold
When one uses ld.gold to build gcc, the thread sanitizer doesn't work, because gold is more conservative when applying TLS relaxations than ld.bfd. In this case a missing initial-exec attribute on a declaration causes gcc to assume the general dynamic model. With ld.bfd this gets relaxed to initial exec when linking the shared library, so the missing attribute doesn't matter. But ld.gold doesn't perform this optimization and this leads to crashes on tsan instrumented binaries. See: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78294 and: https://sourceware.org/bugzilla/show_bug.cgi?id=20805 The fix is easy, just add the missing attribute. PR sanitizer/78294 * tsan/tsan_rtl.cc: Add missing attribute. From-SVN: r242480
Diffstat (limited to 'libsanitizer/tsan')
-rw-r--r--libsanitizer/tsan/tsan_rtl.cc1
1 files changed, 1 insertions, 0 deletions
diff --git a/libsanitizer/tsan/tsan_rtl.cc b/libsanitizer/tsan/tsan_rtl.cc
index 07fa165..5be28ce 100644
--- a/libsanitizer/tsan/tsan_rtl.cc
+++ b/libsanitizer/tsan/tsan_rtl.cc
@@ -43,6 +43,7 @@ extern "C" void __tsan_resume() {
namespace __tsan {
#if !SANITIZER_GO && !SANITIZER_MAC
+ __attribute__((tls_model("initial-exec")))
THREADLOCAL char cur_thread_placeholder[sizeof(ThreadState)] ALIGNED(64);
#endif
static char ctx_placeholder[sizeof(Context)] ALIGNED(64);