[compiler-rt] 0ca98af - Dump regs fbsd fix (#99676)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Jul 19 13:22:36 PDT 2024
Author: David CARLIER
Date: 2024-07-19T21:22:33+01:00
New Revision: 0ca98af7f96fcc5a1e16c314b3da8eb76c510207
URL: https://github.com/llvm/llvm-project/commit/0ca98af7f96fcc5a1e16c314b3da8eb76c510207
DIFF: https://github.com/llvm/llvm-project/commit/0ca98af7f96fcc5a1e16c314b3da8eb76c510207.diff
LOG: Dump regs fbsd fix (#99676)
Added:
compiler-rt/test/sanitizer_common/TestCases/FreeBSD/dump_registers_x86_64.cpp
Modified:
compiler-rt/lib/safestack/safestack_platform.h
compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp
Removed:
################################################################################
diff --git a/compiler-rt/lib/safestack/safestack_platform.h b/compiler-rt/lib/safestack/safestack_platform.h
index 68d26813bef4a..41c7c25fdaf4d 100644
--- a/compiler-rt/lib/safestack/safestack_platform.h
+++ b/compiler-rt/lib/safestack/safestack_platform.h
@@ -143,6 +143,8 @@ inline void *Mmap(void *addr, size_t length, int prot, int flags, int fd,
return __mmap(addr, length, prot, flags, fd, 0, offset);
#elif SANITIZER_FREEBSD && (defined(__aarch64__) || defined(__x86_64__))
return (void *)__syscall(SYS_mmap, addr, length, prot, flags, fd, offset);
+#elif SANITIZER_FREEBSD && (defined(__i386__))
+ return (void *)syscall(SYS_mmap, addr, length, prot, flags, fd, offset);
#elif SANITIZER_SOLARIS
return _REAL64(mmap)(addr, length, prot, flags, fd, offset);
#elif SANITIZER_LINUX_USES_64BIT_SYSCALLS
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp
index 47f9f0c4590fb..40c46a8949636 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp
@@ -2121,7 +2121,8 @@ bool SignalContext::IsTrueFaultingAddress() const {
UNUSED
static const char *RegNumToRegName(int reg) {
switch (reg) {
-# if defined(__x86_64__)
+# if SANITIZER_LINUX
+# if defined(__x86_64__)
case REG_RAX:
return "rax";
case REG_RBX:
@@ -2154,7 +2155,7 @@ static const char *RegNumToRegName(int reg) {
return "r14";
case REG_R15:
return "r15";
-# elif defined(__i386__)
+# elif defined(__i386__)
case REG_EAX:
return "eax";
case REG_EBX:
@@ -2171,6 +2172,7 @@ static const char *RegNumToRegName(int reg) {
return "ebp";
case REG_ESP:
return "esp";
+# endif
# endif
default:
return NULL;
@@ -2178,22 +2180,24 @@ static const char *RegNumToRegName(int reg) {
return NULL;
}
+# if SANITIZER_LINUX
UNUSED
static void DumpSingleReg(ucontext_t *ctx, int RegNum) {
const char *RegName = RegNumToRegName(RegNum);
-# if defined(__x86_64__)
+# if defined(__x86_64__)
Printf("%s%s = 0x%016llx ", internal_strlen(RegName) == 2 ? " " : "",
RegName, ctx->uc_mcontext.gregs[RegNum]);
-# elif defined(__i386__)
+# elif defined(__i386__)
Printf("%s = 0x%08x ", RegName, ctx->uc_mcontext.gregs[RegNum]);
-# else
+# else
(void)RegName;
-# endif
+# endif
}
+# endif
void SignalContext::DumpAllRegisters(void *context) {
-# if SANITIZER_LINUX
ucontext_t *ucontext = (ucontext_t *)context;
+# if SANITIZER_LINUX
# if defined(__x86_64__)
Report("Register values:\n");
DumpSingleReg(ucontext, REG_RAX);
@@ -2232,8 +2236,35 @@ void SignalContext::DumpAllRegisters(void *context) {
DumpSingleReg(ucontext, REG_EBP);
DumpSingleReg(ucontext, REG_ESP);
Printf("\n");
+# else
+ (void)ucontext;
# endif
+# elif SANITIZER_FREEBSD
+# if defined(__x86_64__)
+ Report("Register values:\n");
+ Printf("rax = 0x%016llx ", ucontext->uc_mcontext.mc_rax);
+ Printf("rbx = 0x%016llx ", ucontext->uc_mcontext.mc_rbx);
+ Printf("rcx = 0x%016llx ", ucontext->uc_mcontext.mc_rcx);
+ Printf("rdx = 0x%016llx ", ucontext->uc_mcontext.mc_rdx);
+ Printf("\n");
+ Printf("rdi = 0x%016llx ", ucontext->uc_mcontext.mc_rdi);
+ Printf("rsi = 0x%016llx ", ucontext->uc_mcontext.mc_rsi);
+ Printf("rbp = 0x%016llx ", ucontext->uc_mcontext.mc_rbp);
+ Printf("rsp = 0x%016llx ", ucontext->uc_mcontext.mc_rsp);
+ Printf("\n");
+ Printf(" r8 = 0x%016llx ", ucontext->uc_mcontext.mc_r8);
+ Printf(" r9 = 0x%016llx ", ucontext->uc_mcontext.mc_r9);
+ Printf("r10 = 0x%016llx ", ucontext->uc_mcontext.mc_r10);
+ Printf("r11 = 0x%016llx ", ucontext->uc_mcontext.mc_r11);
+ Printf("\n");
+ Printf("r12 = 0x%016llx ", ucontext->uc_mcontext.mc_r12);
+ Printf("r13 = 0x%016llx ", ucontext->uc_mcontext.mc_r13);
+ Printf("r14 = 0x%016llx ", ucontext->uc_mcontext.mc_r14);
+ Printf("r15 = 0x%016llx ", ucontext->uc_mcontext.mc_r15);
+ Printf("\n");
+# else
(void)ucontext;
+# endif
# endif
// FIXME: Implement this for other OSes and architectures.
}
diff --git a/compiler-rt/test/sanitizer_common/TestCases/FreeBSD/dump_registers_x86_64.cpp b/compiler-rt/test/sanitizer_common/TestCases/FreeBSD/dump_registers_x86_64.cpp
new file mode 100644
index 0000000000000..3d11ef0e098f1
--- /dev/null
+++ b/compiler-rt/test/sanitizer_common/TestCases/FreeBSD/dump_registers_x86_64.cpp
@@ -0,0 +1,19 @@
+// Check that sanitizer prints registers dump_registers on dump_registers=1
+// RUN: %clangxx %s -o %t
+// RUN: %env_tool_opts=dump_registers=0 not %run %t 2>&1 | FileCheck %s --check-prefixes=CHECK-NODUMP --strict-whitespace
+// RUN: not %run %t 2>&1 | FileCheck %s --check-prefixes=CHECK-DUMP --strict-whitespace
+//
+// REQUIRES: x86_64-target-arch
+
+#include <signal.h>
+
+int main() {
+ raise(SIGSEGV);
+ // CHECK-DUMP: Register values
+ // CHECK-DUMP-NEXT: rax = {{0x[0-9a-f]+}} rbx = {{0x[0-9a-f]+}} rcx = {{0x[0-9a-f]+}} rdx = {{0x[0-9a-f]+}}
+ // CHECK-DUMP-NEXT: rdi = {{0x[0-9a-f]+}} rsi = {{0x[0-9a-f]+}} rbp = {{0x[0-9a-f]+}} rsp = {{0x[0-9a-f]+}}
+ // CHECK-DUMP-NEXT: r8 = {{0x[0-9a-f]+}} r9 = {{0x[0-9a-f]+}} r10 = {{0x[0-9a-f]+}} r11 = {{0x[0-9a-f]+}}
+ // CHECK-DUMP-NEXT: r12 = {{0x[0-9a-f]+}} r13 = {{0x[0-9a-f]+}} r14 = {{0x[0-9a-f]+}} r15 = {{0x[0-9a-f]+}}
+ // CHECK-NODUMP-NOT: Register values
+ return 0;
+}
More information about the llvm-commits
mailing list