[llvm-branch-commits] [compiler-rt] 708cb9c - [sanitizer_common] Don't use syscall(SYS_clone) on Linux/sparc64 (#100534)
Tobias Hieta via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Sat Aug 10 02:49:29 PDT 2024
Author: Rainer Orth
Date: 2024-08-10T11:49:18+02:00
New Revision: 708cb9cd3a4b7ca182e35a5b3c17f10f18215084
URL: https://github.com/llvm/llvm-project/commit/708cb9cd3a4b7ca182e35a5b3c17f10f18215084
DIFF: https://github.com/llvm/llvm-project/commit/708cb9cd3a4b7ca182e35a5b3c17f10f18215084.diff
LOG: [sanitizer_common] Don't use syscall(SYS_clone) on Linux/sparc64 (#100534)
```
SanitizerCommon-Unit :: ./Sanitizer-sparc-Test/SanitizerCommon/StartSubprocessTest
```
and every single test using the `llvm-symbolizer` `FAIL` on
Linux/sparc64 in a very weird way: when using `StartSubprocess`, there's
a call to `internal_fork`, but we never reach `internal_execve`.
`internal_fork` is implemented using `syscall(SYS_clone)`. The calling
convention of that syscall already varies considerably between targets,
but as documented in `clone(2)`, SPARC again is widely different.
Instead of trying to match `glibc` here, this patch just calls `__fork`.
Tested on `sparc64-unknown-linux-gnu` and `x86_64-pc-linux-gnu`.
(cherry picked from commit 1c53b907bd6348138a59da270836fc9b4c161a07)
Added:
Modified:
compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp
Removed:
################################################################################
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp
index 1d6a55bdb7f385..50e41da68d959a 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp
@@ -826,10 +826,16 @@ uptr internal_sigaltstack(const void *ss, void *oss) {
return internal_syscall(SYSCALL(sigaltstack), (uptr)ss, (uptr)oss);
}
+extern "C" pid_t __fork(void);
+
int internal_fork() {
# if SANITIZER_LINUX
# if SANITIZER_S390
return internal_syscall(SYSCALL(clone), 0, SIGCHLD);
+# elif SANITIZER_SPARC
+ // The clone syscall interface on SPARC
diff ers massively from the rest,
+ // so fall back to __fork.
+ return __fork();
# else
return internal_syscall(SYSCALL(clone), SIGCHLD, 0);
# endif
More information about the llvm-branch-commits
mailing list