From 31e541e37587100a5b21378380f54c028fda2d04 Mon Sep 17 00:00:00 2001 From: Fangrui Song Date: Fri, 26 Mar 2021 23:21:47 -0700 Subject: [PATCH] [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. --- .../lib/sanitizer_common/sanitizer_linux_libcdep.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_linux_libcdep.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_linux_libcdep.cpp index 1177a1ceb14f..9dfdaf963f57 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; -- GitLab