diff options
| author | Jay Foad <jay.foad@gmail.com> | 2015-11-11 15:37:47 +0000 |
|---|---|---|
| committer | Jay Foad <jay.foad@gmail.com> | 2015-11-11 15:37:47 +0000 |
| commit | 305586257c28f5ed3556852a02623bca3eeacf2e (patch) | |
| tree | 79383e5bc3a989136dcd86881e0245c01d312e9f /compiler-rt/lib/sanitizer_common/sanitizer_tls_get_addr.cc | |
| parent | a0fa8480a6908465ac7d87434c2548cd8accb04a (diff) | |
| download | bcm5719-llvm-305586257c28f5ed3556852a02623bca3eeacf2e.tar.gz bcm5719-llvm-305586257c28f5ed3556852a02623bca3eeacf2e.zip | |
Implement some TLS support for PowerPC64.
Summary: This is enough to get the asan static_tls.cc test case working.
Reviewers: eugenis, samsonov
Subscribers: llvm-commits
Differential Revision: http://reviews.llvm.org/D14574
llvm-svn: 252738
Diffstat (limited to 'compiler-rt/lib/sanitizer_common/sanitizer_tls_get_addr.cc')
| -rw-r--r-- | compiler-rt/lib/sanitizer_common/sanitizer_tls_get_addr.cc | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_tls_get_addr.cc b/compiler-rt/lib/sanitizer_common/sanitizer_tls_get_addr.cc index ea037159d00..213aced89da 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_tls_get_addr.cc +++ b/compiler-rt/lib/sanitizer_common/sanitizer_tls_get_addr.cc @@ -78,6 +78,15 @@ void DTLS_Destroy() { DTLS_Deallocate(dtls.dtv, s); } +#if defined(__powerpc64__) +// This is glibc's TLS_DTV_OFFSET: +// "Dynamic thread vector pointers point 0x8000 past the start of each +// TLS block." +static const uptr kDtvOffset = 0x8000; +#else +static const uptr kDtvOffset = 0; +#endif + DTLS::DTV *DTLS_on_tls_get_addr(void *arg_void, void *res, uptr static_tls_begin, uptr static_tls_end) { if (!common_flags()->intercept_tls_get_addr) return 0; @@ -87,7 +96,7 @@ DTLS::DTV *DTLS_on_tls_get_addr(void *arg_void, void *res, DTLS_Resize(dso_id + 1); if (dtls.dtv[dso_id].beg) return 0; uptr tls_size = 0; - uptr tls_beg = reinterpret_cast<uptr>(res) - arg->offset; + uptr tls_beg = reinterpret_cast<uptr>(res) - arg->offset - kDtvOffset; VPrintf(2, "__tls_get_addr: %p {%p,%p} => %p; tls_beg: %p; sp: %p " "num_live_dtls %zd\n", arg, arg->dso_id, arg->offset, res, tls_beg, &tls_beg, |

