Skip to content

Commit 85ebd8a

Browse files
devnexenyuxuanchen1997
authored andcommitted
Dump regs fbsd fix (#99676)
Summary: Test Plan: Reviewers: Subscribers: Tasks: Tags: Differential Revision: https://phabricator.intern.facebook.com/D60251374
1 parent 8cc22ea commit 85ebd8a

File tree

3 files changed

+59
-7
lines changed

3 files changed

+59
-7
lines changed

compiler-rt/lib/safestack/safestack_platform.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,8 @@ inline void *Mmap(void *addr, size_t length, int prot, int flags, int fd,
143143
return __mmap(addr, length, prot, flags, fd, 0, offset);
144144
#elif SANITIZER_FREEBSD && (defined(__aarch64__) || defined(__x86_64__))
145145
return (void *)__syscall(SYS_mmap, addr, length, prot, flags, fd, offset);
146+
#elif SANITIZER_FREEBSD && (defined(__i386__))
147+
return (void *)syscall(SYS_mmap, addr, length, prot, flags, fd, offset);
146148
#elif SANITIZER_SOLARIS
147149
return _REAL64(mmap)(addr, length, prot, flags, fd, offset);
148150
#elif SANITIZER_LINUX_USES_64BIT_SYSCALLS

compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp

Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2121,7 +2121,8 @@ bool SignalContext::IsTrueFaultingAddress() const {
21212121
UNUSED
21222122
static const char *RegNumToRegName(int reg) {
21232123
switch (reg) {
2124-
# if defined(__x86_64__)
2124+
# if SANITIZER_LINUX
2125+
# if defined(__x86_64__)
21252126
case REG_RAX:
21262127
return "rax";
21272128
case REG_RBX:
@@ -2154,7 +2155,7 @@ static const char *RegNumToRegName(int reg) {
21542155
return "r14";
21552156
case REG_R15:
21562157
return "r15";
2157-
# elif defined(__i386__)
2158+
# elif defined(__i386__)
21582159
case REG_EAX:
21592160
return "eax";
21602161
case REG_EBX:
@@ -2171,29 +2172,32 @@ static const char *RegNumToRegName(int reg) {
21712172
return "ebp";
21722173
case REG_ESP:
21732174
return "esp";
2175+
# endif
21742176
# endif
21752177
default:
21762178
return NULL;
21772179
}
21782180
return NULL;
21792181
}
21802182

2183+
# if SANITIZER_LINUX
21812184
UNUSED
21822185
static void DumpSingleReg(ucontext_t *ctx, int RegNum) {
21832186
const char *RegName = RegNumToRegName(RegNum);
2184-
# if defined(__x86_64__)
2187+
# if defined(__x86_64__)
21852188
Printf("%s%s = 0x%016llx ", internal_strlen(RegName) == 2 ? " " : "",
21862189
RegName, ctx->uc_mcontext.gregs[RegNum]);
2187-
# elif defined(__i386__)
2190+
# elif defined(__i386__)
21882191
Printf("%s = 0x%08x ", RegName, ctx->uc_mcontext.gregs[RegNum]);
2189-
# else
2192+
# else
21902193
(void)RegName;
2191-
# endif
2194+
# endif
21922195
}
2196+
# endif
21932197

21942198
void SignalContext::DumpAllRegisters(void *context) {
2195-
# if SANITIZER_LINUX
21962199
ucontext_t *ucontext = (ucontext_t *)context;
2200+
# if SANITIZER_LINUX
21972201
# if defined(__x86_64__)
21982202
Report("Register values:\n");
21992203
DumpSingleReg(ucontext, REG_RAX);
@@ -2232,8 +2236,35 @@ void SignalContext::DumpAllRegisters(void *context) {
22322236
DumpSingleReg(ucontext, REG_EBP);
22332237
DumpSingleReg(ucontext, REG_ESP);
22342238
Printf("\n");
2239+
# else
2240+
(void)ucontext;
22352241
# endif
2242+
# elif SANITIZER_FREEBSD
2243+
# if defined(__x86_64__)
2244+
Report("Register values:\n");
2245+
Printf("rax = 0x%016llx ", ucontext->uc_mcontext.mc_rax);
2246+
Printf("rbx = 0x%016llx ", ucontext->uc_mcontext.mc_rbx);
2247+
Printf("rcx = 0x%016llx ", ucontext->uc_mcontext.mc_rcx);
2248+
Printf("rdx = 0x%016llx ", ucontext->uc_mcontext.mc_rdx);
2249+
Printf("\n");
2250+
Printf("rdi = 0x%016llx ", ucontext->uc_mcontext.mc_rdi);
2251+
Printf("rsi = 0x%016llx ", ucontext->uc_mcontext.mc_rsi);
2252+
Printf("rbp = 0x%016llx ", ucontext->uc_mcontext.mc_rbp);
2253+
Printf("rsp = 0x%016llx ", ucontext->uc_mcontext.mc_rsp);
2254+
Printf("\n");
2255+
Printf(" r8 = 0x%016llx ", ucontext->uc_mcontext.mc_r8);
2256+
Printf(" r9 = 0x%016llx ", ucontext->uc_mcontext.mc_r9);
2257+
Printf("r10 = 0x%016llx ", ucontext->uc_mcontext.mc_r10);
2258+
Printf("r11 = 0x%016llx ", ucontext->uc_mcontext.mc_r11);
2259+
Printf("\n");
2260+
Printf("r12 = 0x%016llx ", ucontext->uc_mcontext.mc_r12);
2261+
Printf("r13 = 0x%016llx ", ucontext->uc_mcontext.mc_r13);
2262+
Printf("r14 = 0x%016llx ", ucontext->uc_mcontext.mc_r14);
2263+
Printf("r15 = 0x%016llx ", ucontext->uc_mcontext.mc_r15);
2264+
Printf("\n");
2265+
# else
22362266
(void)ucontext;
2267+
# endif
22372268
# endif
22382269
// FIXME: Implement this for other OSes and architectures.
22392270
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// Check that sanitizer prints registers dump_registers on dump_registers=1
2+
// RUN: %clangxx %s -o %t
3+
// RUN: %env_tool_opts=dump_registers=0 not %run %t 2>&1 | FileCheck %s --check-prefixes=CHECK-NODUMP --strict-whitespace
4+
// RUN: not %run %t 2>&1 | FileCheck %s --check-prefixes=CHECK-DUMP --strict-whitespace
5+
//
6+
// REQUIRES: x86_64-target-arch
7+
8+
#include <signal.h>
9+
10+
int main() {
11+
raise(SIGSEGV);
12+
// CHECK-DUMP: Register values
13+
// CHECK-DUMP-NEXT: rax = {{0x[0-9a-f]+}} rbx = {{0x[0-9a-f]+}} rcx = {{0x[0-9a-f]+}} rdx = {{0x[0-9a-f]+}}
14+
// CHECK-DUMP-NEXT: rdi = {{0x[0-9a-f]+}} rsi = {{0x[0-9a-f]+}} rbp = {{0x[0-9a-f]+}} rsp = {{0x[0-9a-f]+}}
15+
// CHECK-DUMP-NEXT: r8 = {{0x[0-9a-f]+}} r9 = {{0x[0-9a-f]+}} r10 = {{0x[0-9a-f]+}} r11 = {{0x[0-9a-f]+}}
16+
// CHECK-DUMP-NEXT: r12 = {{0x[0-9a-f]+}} r13 = {{0x[0-9a-f]+}} r14 = {{0x[0-9a-f]+}} r15 = {{0x[0-9a-f]+}}
17+
// CHECK-NODUMP-NOT: Register values
18+
return 0;
19+
}

0 commit comments

Comments
 (0)