[compiler-rt] [compiler-rt] DumpAllRegisters implementation for netbsd i386/x86_64. (PR #99743)

via llvm-commits llvm-commits at lists.llvm.org
Fri Jul 19 23:05:43 PDT 2024


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-compiler-rt-sanitizer

Author: David CARLIER (devnexen)

<details>
<summary>Changes</summary>



---
Full diff: https://github.com/llvm/llvm-project/pull/99743.diff


3 Files Affected:

- (modified) compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp (+38) 
- (added) compiler-rt/test/sanitizer_common/TestCases/NetBSD/dump_registers_i386.cpp (+17) 
- (added) compiler-rt/test/sanitizer_common/TestCases/NetBSD/dump_registers_x86_64.cpp (+19) 


``````````diff
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp
index 483a1042a6238..caf0a598c6aaa 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp
@@ -2277,6 +2277,44 @@ void SignalContext::DumpAllRegisters(void *context) {
 #    else
   (void)ucontext;
 #    endif
+#  elif SANITIZER_NETBSD
+#    if defined(__x86_64__)
+  Report("Register values:\n");
+  Printf("rax = 0x%016llx  ", ucontext->uc_mcontext.__gregs[_REG_RAX]);
+  Printf("rbx = 0x%016llx  ", ucontext->uc_mcontext.__gregs[_REG_RBX]);
+  Printf("rcx = 0x%016llx  ", ucontext->uc_mcontext.__gregs[_REG_RCX]);
+  Printf("rdx = 0x%016llx  ", ucontext->uc_mcontext.__gregs[_REG_RDX]);
+  Printf("\n");
+  Printf("rdi = 0x%016llx  ", ucontext->uc_mcontext.__gregs[_REG_RDI]);
+  Printf("rsi = 0x%016llx  ", ucontext->uc_mcontext.__gregs[_REG_RSI]);
+  Printf("rbp = 0x%016llx  ", ucontext->uc_mcontext.__gregs[_REG_RBP]);
+  Printf("rsp = 0x%016llx  ", ucontext->uc_mcontext.__gregs[_REG_RSP]);
+  Printf("\n");
+  Printf(" r8 = 0x%016llx  ", ucontext->uc_mcontext.__gregs[_REG_R8]);
+  Printf(" r9 = 0x%016llx  ", ucontext->uc_mcontext.__gregs[_REG_R9]);
+  Printf("r10 = 0x%016llx  ", ucontext->uc_mcontext.__gregs[_REG_R10]);
+  Printf("r11 = 0x%016llx  ", ucontext->uc_mcontext.__gregs[_REG_R11]);
+  Printf("\n");
+  Printf("r12 = 0x%016llx  ", ucontext->uc_mcontext.__gregs[_REG_R12]);
+  Printf("r13 = 0x%016llx  ", ucontext->uc_mcontext.__gregs[_REG_R13]);
+  Printf("r14 = 0x%016llx  ", ucontext->uc_mcontext.__gregs[_REG_R14]);
+  Printf("r15 = 0x%016llx  ", ucontext->uc_mcontext.__gregs[_REG_R15]);
+  Printf("\n");
+#    elif defined(__i386__)
+  Report("Register values:\n");
+  Printf("eax = 0x%08x  ", ucontext->uc_mcontext.__gregs[_REG_EAX]);
+  Printf("ebx = 0x%08x  ", ucontext->uc_mcontext.__gregs[_REG_EBX]);
+  Printf("ecx = 0x%08x  ", ucontext->uc_mcontext.__gregs[_REG_ECX]);
+  Printf("edx = 0x%08x  ", ucontext->uc_mcontext.__gregs[_REG_EDX]);
+  Printf("\n");
+  Printf("edi = 0x%08x  ", ucontext->uc_mcontext.__gregs[_REG_EDI]);
+  Printf("esi = 0x%08x  ", ucontext->uc_mcontext.__gregs[_REG_ESI]);
+  Printf("ebp = 0x%08x  ", ucontext->uc_mcontext.__gregs[_REG_EBP]);
+  Printf("esp = 0x%08x  ", ucontext->uc_mcontext.__gregs[_REG_ESP]);
+  Printf("\n");
+#    else
+  (void)ucontext;
+#    endif
 #  endif
   // FIXME: Implement this for other OSes and architectures.
 }
diff --git a/compiler-rt/test/sanitizer_common/TestCases/NetBSD/dump_registers_i386.cpp b/compiler-rt/test/sanitizer_common/TestCases/NetBSD/dump_registers_i386.cpp
new file mode 100644
index 0000000000000..74aea4d8b360a
--- /dev/null
+++ b/compiler-rt/test/sanitizer_common/TestCases/NetBSD/dump_registers_i386.cpp
@@ -0,0 +1,17 @@
+// 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: i386-target-arch
+
+#include <signal.h>
+
+int main() {
+  raise(SIGSEGV);
+  // CHECK-DUMP: Register values
+  // CHECK-DUMP-NEXT: eax = {{0x[0-9a-f]+}}  ebx = {{0x[0-9a-f]+}}  ecx = {{0x[0-9a-f]+}}  edx = {{0x[0-9a-f]+}}
+  // CHECK-DUMP-NEXT: edi = {{0x[0-9a-f]+}}  esi = {{0x[0-9a-f]+}}  ebp = {{0x[0-9a-f]+}}  esp = {{0x[0-9a-f]+}}
+  // CHECK-NODUMP-NOT: Register values
+  return 0;
+}
diff --git a/compiler-rt/test/sanitizer_common/TestCases/NetBSD/dump_registers_x86_64.cpp b/compiler-rt/test/sanitizer_common/TestCases/NetBSD/dump_registers_x86_64.cpp
new file mode 100644
index 0000000000000..3d11ef0e098f1
--- /dev/null
+++ b/compiler-rt/test/sanitizer_common/TestCases/NetBSD/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;
+}

``````````

</details>


https://github.com/llvm/llvm-project/pull/99743


More information about the llvm-commits mailing list