@@ -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  " uc_mcontext .gregs [RegNum]);
2295+ #    elif  defined(__arm__)
2296+   Printf (" %s%s = 0x%08zx  " internal_strlen (RegName) == 2  ? "  " " " 
2297+          GetArmRegister (ctx, RegNum));
2298+ #    elif  defined(__aarch64__)
2299+   Printf (" %s%s = 0x%016zx  " internal_strlen (RegName) == 2  ? "  " " " 
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