[compiler-rt] [sanitizer_common] Don't use syscall(SYS_clone) on Linux/sparc64 (PR #100534)

Rainer Orth via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 25 01:59:32 PDT 2024


https://github.com/rorth created https://github.com/llvm/llvm-project/pull/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`.

>From 16c66122e9df18ca7e6f8944ddce50b7ac42729f Mon Sep 17 00:00:00 2001
From: Rainer Orth <ro at gcc.gnu.org>
Date: Thu, 25 Jul 2024 10:56:57 +0200
Subject: [PATCH] [sanitizer_common] Don't use syscall(SYS_clone) on
 Linux/sparc64

```
  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`.
---
 compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp
index 483a1042a6238..49f57b3404fbc 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 differs 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-commits mailing list