diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_linux_libcdep.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_linux_libcdep.cpp index e17f23efbd0b3a..10627549704a22 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_linux_libcdep.cpp +++ b/compiler-rt/lib/sanitizer_common/sanitizer_linux_libcdep.cpp @@ -375,12 +375,9 @@ uptr ThreadSelf() { descr_addr = reinterpret_cast(__builtin_thread_pointer()) - ThreadDescriptorSize(); #elif SANITIZER_RISCV64 - uptr tcb_end; - asm volatile("mv %0, tp;\n" : "=r"(tcb_end)); // https://github.com/riscv/riscv-elf-psabi-doc/issues/53 - const uptr kTlsTcbOffset = 0x800; - descr_addr = - reinterpret_cast(tcb_end - kTlsTcbOffset - TlsPreTcbSize()); + uptr thread_pointer = reinterpret_cast(__builtin_thread_pointer()); + descr_addr = thread_pointer - TlsPreTcbSize(); #elif defined(__s390__) descr_addr = reinterpret_cast(__builtin_thread_pointer()); #elif defined(__powerpc64__) diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_tls_get_addr.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_tls_get_addr.cpp index 9ca898a306a88b..10748f96420a5d 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_tls_get_addr.cpp +++ b/compiler-rt/lib/sanitizer_common/sanitizer_tls_get_addr.cpp @@ -80,8 +80,13 @@ void DTLS_Destroy() { #if defined(__powerpc64__) || defined(__mips__) // This is glibc's TLS_DTV_OFFSET: // "Dynamic thread vector pointers point 0x8000 past the start of each -// TLS block." +// TLS block." (sysdeps//dl-tls.h) static const uptr kDtvOffset = 0x8000; +#elif defined(__riscv) +// This is glibc's TLS_DTV_OFFSET: +// "Dynamic thread vector pointers point 0x800 past the start of each +// TLS block." (sysdeps/riscv/dl-tls.h) +static const uptr kDtvOffset = 0x800; #else static const uptr kDtvOffset = 0; #endif