[compiler-rt] 31e541e - [sanitizer] Temporarily switch ppc64 to the _dl_get_tls_static_info implementation

Fangrui Song via llvm-commits llvm-commits at lists.llvm.org
Fri Mar 26 23:21:56 PDT 2021


Author: Fangrui Song
Date: 2021-03-26T23:21:47-07:00
New Revision: 31e541e37587100a5b21378380f54c028fda2d04

URL: https://github.com/llvm/llvm-project/commit/31e541e37587100a5b21378380f54c028fda2d04
DIFF: https://github.com/llvm/llvm-project/commit/31e541e37587100a5b21378380f54c028fda2d04.diff

LOG: [sanitizer] Temporarily switch ppc64 to the _dl_get_tls_static_info implementation

sanitizer-ppc64le-linux is good while clang-ppc64le-linux has test
failures due to GetStaticTlsRange(addr, size) set *addr is 0.

Added: 
    

Modified: 
    compiler-rt/lib/sanitizer_common/sanitizer_linux_libcdep.cpp

Removed: 
    


################################################################################
diff  --git a/compiler-rt/lib/sanitizer_common/sanitizer_linux_libcdep.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_linux_libcdep.cpp
index 1177a1ceb14f5..9dfdaf963f572 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_linux_libcdep.cpp
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_linux_libcdep.cpp
@@ -420,7 +420,15 @@ static void GetTls(uptr *addr, uptr *size) {
 #else
   if (SANITIZER_GLIBC)
     *size += 1664;
-#if defined(__mips__) || defined(__powerpc64__) || SANITIZER_RISCV64
+#if defined(__powerpc64__)
+  // TODO Figure out why *addr may be zero and use TlsPreTcbSize.
+  void *ptr = dlsym(RTLD_NEXT, "_dl_get_tls_static_info");
+  uptr tls_size, tls_align;
+  ((void (*)(size_t *, size_t *))ptr)(&tls_size, &tls_align);
+  asm("addi %0,13,-0x7000" : "=r"(*addr));
+  *addr -= TlsPreTcbSize();
+  *size = RoundUpTo(tls_size + TlsPreTcbSize(), 16);
+#elif defined(__mips__) || SANITIZER_RISCV64
   const uptr pre_tcb_size = TlsPreTcbSize();
   *addr -= pre_tcb_size;
   *size += pre_tcb_size;


        


More information about the llvm-commits mailing list