Skip to content

Commit 0b6be3c

Browse files
committed
[compiler-rt] Add DumpAllRegister impl for arm and aarch64
1 parent f1422a8 commit 0b6be3c

File tree

1 file changed

+142
-4
lines changed

1 file changed

+142
-4
lines changed

compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp

Lines changed: 142 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2172,15 +2172,118 @@ static const char *RegNumToRegName(int reg) {
21722172
return "ebp";
21732173
case REG_ESP:
21742174
return "esp";
2175-
# endif
2175+
# elif defined(__arm__)
2176+
# define REG_STR(reg) #reg
2177+
# define MAKE_CASE(N) \
2178+
case REG_R##N: \
2179+
return REG_STR(r##N)
2180+
MAKE_CASE(0);
2181+
MAKE_CASE(1);
2182+
MAKE_CASE(2);
2183+
MAKE_CASE(3);
2184+
MAKE_CASE(4);
2185+
MAKE_CASE(5);
2186+
MAKE_CASE(6);
2187+
MAKE_CASE(7);
2188+
MAKE_CASE(8);
2189+
MAKE_CASE(9);
2190+
MAKE_CASE(10);
2191+
MAKE_CASE(11);
2192+
MAKE_CASE(12);
2193+
case REG_R13:
2194+
return "sp";
2195+
case REG_R14:
2196+
return "lr";
2197+
case REG_R15:
2198+
return "pc";
2199+
# elif defined(__aarch64__)
2200+
# define REG_STR(reg) #reg
2201+
# define MAKE_CASE(N) \
2202+
case N: \
2203+
return REG_STR(x##N)
2204+
MAKE_CASE(0);
2205+
MAKE_CASE(1);
2206+
MAKE_CASE(2);
2207+
MAKE_CASE(3);
2208+
MAKE_CASE(4);
2209+
MAKE_CASE(5);
2210+
MAKE_CASE(6);
2211+
MAKE_CASE(7);
2212+
MAKE_CASE(8);
2213+
MAKE_CASE(9);
2214+
MAKE_CASE(10);
2215+
MAKE_CASE(11);
2216+
MAKE_CASE(12);
2217+
MAKE_CASE(13);
2218+
MAKE_CASE(14);
2219+
MAKE_CASE(15);
2220+
MAKE_CASE(16);
2221+
MAKE_CASE(17);
2222+
MAKE_CASE(18);
2223+
MAKE_CASE(19);
2224+
MAKE_CASE(20);
2225+
MAKE_CASE(21);
2226+
MAKE_CASE(22);
2227+
MAKE_CASE(23);
2228+
MAKE_CASE(24);
2229+
MAKE_CASE(25);
2230+
MAKE_CASE(26);
2231+
MAKE_CASE(27);
2232+
MAKE_CASE(28);
2233+
case 29:
2234+
return "fp";
2235+
case 30:
2236+
return "lr";
2237+
case 31:
2238+
return "sp";
21762239
# endif
21772240
default:
21782241
return NULL;
21792242
}
21802243
return NULL;
21812244
}
21822245

2183-
# if SANITIZER_LINUX
2246+
# if SANITIZER_LINUX && (defined(__arm__) || defined(__aarch64__))
2247+
static unsigned long GetArmRegister(ucontext_t *ctx, int RegNum) {
2248+
switch (RegNum) {
2249+
# if defined(__arm__)
2250+
# define MAKE_CASE(N) \
2251+
case REG_R##N: \
2252+
return ctx->uc_mcontext.arm_r##N
2253+
MAKE_CASE(0);
2254+
MAKE_CASE(1);
2255+
MAKE_CASE(2);
2256+
MAKE_CASE(3);
2257+
MAKE_CASE(4);
2258+
MAKE_CASE(5);
2259+
MAKE_CASE(6);
2260+
MAKE_CASE(7);
2261+
MAKE_CASE(8);
2262+
MAKE_CASE(9);
2263+
MAKE_CASE(10);
2264+
case REG_R11:
2265+
return ctx->uc_mcontext.arm_fp;
2266+
case REG_R12:
2267+
return ctx->uc_mcontext.arm_ip;
2268+
case REG_R13:
2269+
return ctx->uc_mcontext.arm_sp;
2270+
case REG_R14:
2271+
return ctx->uc_mcontext.arm_lr;
2272+
case REG_R15:
2273+
return ctx->uc_mcontext.arm_pc;
2274+
# elif defined(__aarch64__)
2275+
case 0 ... 30:
2276+
return ctx->uc_mcontext.regs[RegNum];
2277+
case 31:
2278+
return ctx->uc_mcontext.sp;
2279+
# endif
2280+
default:
2281+
return 0UL;
2282+
}
2283+
return 0UL;
2284+
}
2285+
# endif // SANITIZER_LINUX && (defined(__arm__) || defined(__aarch64__))
2286+
21842287
UNUSED
21852288
static void DumpSingleReg(ucontext_t *ctx, int RegNum) {
21862289
const char *RegName = RegNumToRegName(RegNum);
@@ -2189,7 +2292,13 @@ static void DumpSingleReg(ucontext_t *ctx, int RegNum) {
21892292
RegName, ctx->uc_mcontext.gregs[RegNum]);
21902293
# elif defined(__i386__)
21912294
Printf("%s = 0x%08x ", RegName, ctx->uc_mcontext.gregs[RegNum]);
2192-
# else
2295+
# elif defined(__arm__)
2296+
Printf("%s%s = 0x%08lx ", internal_strlen(RegName) == 2 ? " " : "", RegName,
2297+
GetArmRegister(ctx, RegNum));
2298+
# elif defined(__aarch64__)
2299+
Printf("%s%s = 0x%016llx ", internal_strlen(RegName) == 2 ? " " : "",
2300+
RegName, GetArmRegister(ctx, RegNum));
2301+
# else
21932302
(void)RegName;
21942303
# endif
21952304
}
@@ -2236,7 +2345,36 @@ void SignalContext::DumpAllRegisters(void *context) {
22362345
DumpSingleReg(ucontext, REG_EBP);
22372346
DumpSingleReg(ucontext, REG_ESP);
22382347
Printf("\n");
2239-
# else
2348+
# elif defined(__arm__)
2349+
Report("Register values:\n");
2350+
DumpSingleReg(ucontext, REG_R0);
2351+
DumpSingleReg(ucontext, REG_R1);
2352+
DumpSingleReg(ucontext, REG_R2);
2353+
DumpSingleReg(ucontext, REG_R3);
2354+
Printf("\n");
2355+
DumpSingleReg(ucontext, REG_R4);
2356+
DumpSingleReg(ucontext, REG_R5);
2357+
DumpSingleReg(ucontext, REG_R6);
2358+
DumpSingleReg(ucontext, REG_R7);
2359+
Printf("\n");
2360+
DumpSingleReg(ucontext, REG_R8);
2361+
DumpSingleReg(ucontext, REG_R9);
2362+
DumpSingleReg(ucontext, REG_R10);
2363+
DumpSingleReg(ucontext, REG_R11);
2364+
Printf("\n");
2365+
DumpSingleReg(ucontext, REG_R12);
2366+
DumpSingleReg(ucontext, REG_R13);
2367+
DumpSingleReg(ucontext, REG_R14);
2368+
DumpSingleReg(ucontext, REG_R15);
2369+
Printf("\n");
2370+
# elif defined(__aarch64__)
2371+
Report("Register values:\n");
2372+
for (int i = 0; i <= 31; ++i) {
2373+
DumpSingleReg(ucontext, i);
2374+
if (i % 4 == 3)
2375+
Printf("\n");
2376+
}
2377+
# endif
22402378
(void)ucontext;
22412379
# endif
22422380
# elif SANITIZER_FREEBSD

0 commit comments

Comments
 (0)