diff mbox series

libsanitizer: cherry-pick commit b226894d475b from upstream

Message ID 20220505210159.522782-1-hjl.tools@gmail.com
State New
Headers show
Series libsanitizer: cherry-pick commit b226894d475b from upstream | expand

Commit Message

H.J. Lu May 5, 2022, 9:01 p.m. UTC
cherry-pick:

b226894d475b [sanitizer] [sanitizer] Correct GetTls for x32
---
 libsanitizer/sanitizer_common/sanitizer_linux_libcdep.cpp | 4 ++++
 1 file changed, 4 insertions(+)

Comments

H.J. Lu May 6, 2022, 2:37 p.m. UTC | #1
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 mbox series

Patch

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();