@@ -2172,15 +2172,118 @@ static const char *RegNumToRegName(int reg) {
21722172 return " ebp" ;
21732173 case REG_ESP:
21742174 return " esp" ;
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" ;
21752239# endif
2176- # 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 uptr 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 0 ;
2282+ }
2283+ return 0 ;
2284+ }
2285+ # endif // SANITIZER_LINUX && (defined(__arm__) || defined(__aarch64__))
2286+
21842287UNUSED
21852288static void DumpSingleReg (ucontext_t *ctx, int RegNum) {
21862289 const char *RegName = RegNumToRegName (RegNum);
@@ -2189,6 +2292,12 @@ 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]);
2295+ # elif defined(__arm__)
2296+ Printf (" %s%s = 0x%08zx " , internal_strlen (RegName) == 2 ? " " : " " , RegName,
2297+ GetArmRegister (ctx, RegNum));
2298+ # elif defined(__aarch64__)
2299+ Printf (" %s%s = 0x%016zx " , internal_strlen (RegName) == 2 ? " " : " " , RegName,
2300+ GetArmRegister (ctx, RegNum));
21922301# else
21932302 (void )RegName;
21942303# endif
@@ -2236,6 +2345,35 @@ void SignalContext::DumpAllRegisters(void *context) {
22362345 DumpSingleReg (ucontext, REG_EBP);
22372346 DumpSingleReg (ucontext, REG_ESP);
22382347 Printf (" \n " );
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+ }
22392377# else
22402378 (void )ucontext;
22412379# endif
0 commit comments