[compiler-rt] cfdcdf0 - [tsan] Derive the unmangled SP in longjmp with xor key on loongarch64
via llvm-commits
llvm-commits at lists.llvm.org
Tue Mar 28 01:24:56 PDT 2023
Author: zhanglimin
Date: 2023-03-28T16:22:49+08:00
New Revision: cfdcdf05feb26418b3aef5df3ee94492da5eeacd
URL: https://github.com/llvm/llvm-project/commit/cfdcdf05feb26418b3aef5df3ee94492da5eeacd
DIFF: https://github.com/llvm/llvm-project/commit/cfdcdf05feb26418b3aef5df3ee94492da5eeacd.diff
LOG: [tsan] Derive the unmangled SP in longjmp with xor key on loongarch64
Introducing xor key to derive unmangled sp is here to follow the way
that the glibc adds support for pointer mangling on loongarch in commit
1c9bc1b6e50293a1b7037a7bfbf835868a55baed.
Reviewed By: SixWeining, wangleiat, xen0n
Differential Revision: https://reviews.llvm.org/D146716
Added:
Modified:
compiler-rt/lib/tsan/rtl/tsan_platform_linux.cpp
Removed:
################################################################################
diff --git a/compiler-rt/lib/tsan/rtl/tsan_platform_linux.cpp b/compiler-rt/lib/tsan/rtl/tsan_platform_linux.cpp
index 9094469ba4eb8..384a443c16b0b 100644
--- a/compiler-rt/lib/tsan/rtl/tsan_platform_linux.cpp
+++ b/compiler-rt/lib/tsan/rtl/tsan_platform_linux.cpp
@@ -66,7 +66,8 @@ extern "C" void *__libc_stack_end;
void *__libc_stack_end = 0;
#endif
-#if SANITIZER_LINUX && defined(__aarch64__) && !SANITIZER_GO
+#if SANITIZER_LINUX && (defined(__aarch64__) || defined(__loongarch_lp64)) && \
+ !SANITIZER_GO
# define INIT_LONGJMP_XOR_KEY 1
#else
# define INIT_LONGJMP_XOR_KEY 0
@@ -314,7 +315,7 @@ void InitializePlatform() {
}
#endif
-#if SANITIZER_LINUX && defined(__aarch64__)
+#if SANITIZER_LINUX && (defined(__aarch64__) || defined(__loongarch_lp64))
// Initialize the xor key used in {sig}{set,long}jump.
InitializeLongjmpXorKey();
#endif
@@ -387,8 +388,8 @@ static uptr UnmangleLongJmpSp(uptr mangled_sp) {
# else
return mangled_sp;
# endif
-#elif defined(__loongarch__)
- return mangled_sp;
+#elif defined(__loongarch_lp64)
+ return mangled_sp ^ longjmp_xor_key;
#elif defined(__powerpc64__)
// Reverse of:
// ld r4, -28696(r13)
@@ -452,7 +453,11 @@ static void InitializeLongjmpXorKey() {
// 2. Retrieve vanilla/mangled SP.
uptr sp;
+#ifdef __loongarch__
+ asm("move %0, $sp" : "=r" (sp));
+#else
asm("mov %0, sp" : "=r" (sp));
+#endif
uptr mangled_sp = ((uptr *)&env)[LONG_JMP_SP_ENV_SLOT];
// 3. xor SPs to obtain key.
More information about the llvm-commits
mailing list