summaryrefslogtreecommitdiff
path: root/libsanitizer
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2022-05-05 13:59:16 -0700
committerH.J. Lu <hjl.tools@gmail.com>2022-05-06 07:38:35 -0700
commitc3b582a444ef15c7142117667b00e467961b6416 (patch)
tree75013bc757ef289bceaffbd64abdf93bf3af95e7 /libsanitizer
parent8f2b7c13567250d86367c0274859f6c2fe162082 (diff)
libsanitizer: cherry-pick commit b226894d475b from upstream
cherry-pick: b226894d475b [sanitizer] [sanitizer] Correct GetTls for x32 (cherry picked from commit a48be2e513d9ddb2fa8800a158f18502a0923aec)
Diffstat (limited to 'libsanitizer')
-rw-r--r--libsanitizer/sanitizer_common/sanitizer_linux_libcdep.cpp4
1 files changed, 4 insertions, 0 deletions
diff --git a/libsanitizer/sanitizer_common/sanitizer_linux_libcdep.cpp b/libsanitizer/sanitizer_common/sanitizer_linux_libcdep.cpp
index 0c260b6b516..4f22c78a183 100644
--- a/libsanitizer/sanitizer_common/sanitizer_linux_libcdep.cpp
+++ b/libsanitizer/sanitizer_common/sanitizer_linux_libcdep.cpp
@@ -463,7 +463,11 @@ static void GetTls(uptr *addr, uptr *size) {
#elif SANITIZER_GLIBC && defined(__x86_64__)
// For aarch64 and x86-64, use an O(1) approach which requires relatively
// precise ThreadDescriptorSize. g_tls_size was initialized in InitTlsSize.
+# if SANITIZER_X32
+ asm("mov %%fs:8,%0" : "=r"(*addr));
+# else
asm("mov %%fs:16,%0" : "=r"(*addr));
+# endif
*size = g_tls_size;
*addr -= *size;
*addr += ThreadDescriptorSize();