more ppc64le sanitizer fixes From 01de315ff348fec5b7c17a6ae94ce517d23a2f0c Mon Sep 17 00:00:00 2001 From: Daniel Kolesa Date: Sat, 5 Nov 2022 23:39:29 +0100 Subject: [PATCH] rudimentary lsan musl fixes on some archs (ppc64le) --- .../sanitizer_common/sanitizer_linux_libcdep.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_linux_libcdep.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_linux_libcdep.cpp index d74851c43..f13fc84be 100644 --- a/compiler-rt-19.1.7.src/lib/sanitizer_common/sanitizer_linux_libcdep.cpp +++ b/compiler-rt-19.1.7.src/lib/sanitizer_common/sanitizer_linux_libcdep.cpp @@ -28,6 +28,14 @@ # include "sanitizer_procmaps.h" # include "sanitizer_solaris.h" +#if defined(__powerpc__) +#define DTP_OFFSET 0x8000 +#elif SANITIZER_RISCV64 +#define DTP_OFFSET 0x800 +#else +#define DTP_OFFSET 0 +#endif + # if SANITIZER_NETBSD # define _RTLD_SOURCE // for __lwp_gettcb_fast() / __lwp_getprivate_fast() # endif @@ -319,6 +327,7 @@ static uptr ThreadDescriptorSizeFallback() { return val; } +#if SANITIZER_GLIBC uptr ThreadDescriptorSize() { uptr val = atomic_load_relaxed(&thread_descriptor_size); if (val) @@ -333,6 +342,9 @@ uptr ThreadDescriptorSize() { atomic_store_relaxed(&thread_descriptor_size, val); return val; } +#else +uptr ThreadDescriptorSize() { return 0; } +#endif # if defined(__mips__) || defined(__powerpc64__) || SANITIZER_RISCV64 || \ SANITIZER_LOONGARCH64 @@ -424,6 +436,7 @@ static int CollectStaticTlsBlocks(struct dl_phdr_info *info, size_t size, begin = (uptr)__tls_get_addr(mod_and_off); # endif } + begin -= DTP_OFFSET; for (unsigned i = 0; i != info->dlpi_phnum; ++i) if (info->dlpi_phdr[i].p_type == PT_TLS) { static_cast *>(data)->push_back( @@ -581,9 +594,11 @@ static void GetTls(uptr *addr, uptr *size) { else if (SANITIZER_FREEBSD) *size += 128; // RTLD_STATIC_TLS_EXTRA # if defined(__mips__) || defined(__powerpc64__) || SANITIZER_RISCV64 +#if SANITIZER_GLIBC const uptr pre_tcb_size = TlsPreTcbSize(); *addr -= pre_tcb_size; *size += pre_tcb_size; +#endif # else // arm and aarch64 reserve two words at TP, so this underestimates the range. // However, this is sufficient for the purpose of finding the pointers to -- 2.38.1