@@ -2172,15 +2172,118 @@ static const char *RegNumToRegName(int reg) {
2172
2172
return " ebp" ;
2173
2173
case REG_ESP:
2174
2174
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" ;
2175
2239
# endif
2176
- # endif
2177
2240
default :
2178
2241
return NULL ;
2179
2242
}
2180
2243
return NULL ;
2181
2244
}
2182
2245
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
+
2184
2287
UNUSED
2185
2288
static void DumpSingleReg (ucontext_t *ctx, int RegNum) {
2186
2289
const char *RegName = RegNumToRegName (RegNum);
@@ -2189,6 +2292,12 @@ static void DumpSingleReg(ucontext_t *ctx, int RegNum) {
2189
2292
RegName, ctx->uc_mcontext .gregs [RegNum]);
2190
2293
# elif defined(__i386__)
2191
2294
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));
2192
2301
# else
2193
2302
(void )RegName;
2194
2303
# endif
@@ -2236,6 +2345,35 @@ void SignalContext::DumpAllRegisters(void *context) {
2236
2345
DumpSingleReg (ucontext, REG_EBP);
2237
2346
DumpSingleReg (ucontext, REG_ESP);
2238
2347
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
+ }
2239
2377
# else
2240
2378
(void )ucontext;
2241
2379
# endif
0 commit comments