Message ID | 20220505210159.522782-1-hjl.tools@gmail.com |
---|---|
State | New |
Headers | show |
Series | libsanitizer: cherry-pick commit b226894d475b from upstream | expand |
On Thu, May 5, 2022 at 2:02 PM H.J. Lu <hjl.tools@gmail.com> wrote: > > cherry-pick: > > b226894d475b [sanitizer] [sanitizer] Correct GetTls for x32 > --- > libsanitizer/sanitizer_common/sanitizer_linux_libcdep.cpp | 4 ++++ > 1 file changed, 4 insertions(+) > > diff --git a/libsanitizer/sanitizer_common/sanitizer_linux_libcdep.cpp b/libsanitizer/sanitizer_common/sanitizer_linux_libcdep.cpp > index d966d857a76..620267cdd02 100644 > --- a/libsanitizer/sanitizer_common/sanitizer_linux_libcdep.cpp > +++ b/libsanitizer/sanitizer_common/sanitizer_linux_libcdep.cpp > @@ -462,7 +462,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(); > -- > 2.35.1 > I am backporting this to GCC 12.
diff --git a/libsanitizer/sanitizer_common/sanitizer_linux_libcdep.cpp b/libsanitizer/sanitizer_common/sanitizer_linux_libcdep.cpp index d966d857a76..620267cdd02 100644 --- a/libsanitizer/sanitizer_common/sanitizer_linux_libcdep.cpp +++ b/libsanitizer/sanitizer_common/sanitizer_linux_libcdep.cpp @@ -462,7 +462,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();