@@ -793,6 +793,56 @@ uptr FindAvailableMemoryRange(uptr shadow_size,
793793// FIXME implement on this platform.
794794void GetMemoryProfile (fill_profile_f cb, uptr *stats, uptr stats_size) { }
795795
796+ void SignalContext::DumpAllRegisters (void *context) {
797+ Report (" Register values:\n " );
798+
799+ ucontext_t *ucontext = (ucontext_t *)context;
800+ # define DUMPREG64 (r ) \
801+ Printf (" %s = 0x%016llx " , #r, ucontext->uc_mcontext ->__ss .__ ## r);
802+ # define DUMPREG32 (r ) \
803+ Printf (" %s = 0x%08x " , #r, ucontext->uc_mcontext ->__ss .__ ## r);
804+ # define DUMPREG_ (r ) Printf(" " ); DUMPREG(r);
805+ # define DUMPREG__ (r ) Printf(" " ); DUMPREG(r);
806+ # define DUMPREG___ (r ) Printf(" " ); DUMPREG(r);
807+
808+ # if defined(__x86_64__)
809+ # define DUMPREG (r ) DUMPREG64(r)
810+ DUMPREG (rax); DUMPREG (rbx); DUMPREG (rcx); DUMPREG (rdx); Printf (" \n " );
811+ DUMPREG (rdi); DUMPREG (rsi); DUMPREG (rbp); DUMPREG (rsp); Printf (" \n " );
812+ DUMPREG_ (r8); DUMPREG_ (r9); DUMPREG (r10); DUMPREG (r11); Printf (" \n " );
813+ DUMPREG (r12); DUMPREG (r13); DUMPREG (r14); DUMPREG (r15); Printf (" \n " );
814+ # elif defined(__i386__)
815+ # define DUMPREG (r ) DUMPREG32(r)
816+ DUMPREG (eax); DUMPREG (ebx); DUMPREG (ecx); DUMPREG (edx); Printf (" \n " );
817+ DUMPREG (edi); DUMPREG (esi); DUMPREG (ebp); DUMPREG (esp); Printf (" \n " );
818+ # elif defined(__aarch64__)
819+ # define DUMPREG (r ) DUMPREG64(r)
820+ DUMPREG_ (x[0 ]); DUMPREG_ (x[1 ]); DUMPREG_ (x[2 ]); DUMPREG_ (x[3 ]); Printf (" \n " );
821+ DUMPREG_ (x[4 ]); DUMPREG_ (x[5 ]); DUMPREG_ (x[6 ]); DUMPREG_ (x[7 ]); Printf (" \n " );
822+ DUMPREG_ (x[8 ]); DUMPREG_ (x[9 ]); DUMPREG (x[10 ]); DUMPREG (x[11 ]); Printf (" \n " );
823+ DUMPREG (x[12 ]); DUMPREG (x[13 ]); DUMPREG (x[14 ]); DUMPREG (x[15 ]); Printf (" \n " );
824+ DUMPREG (x[16 ]); DUMPREG (x[17 ]); DUMPREG (x[18 ]); DUMPREG (x[19 ]); Printf (" \n " );
825+ DUMPREG (x[20 ]); DUMPREG (x[21 ]); DUMPREG (x[22 ]); DUMPREG (x[23 ]); Printf (" \n " );
826+ DUMPREG (x[24 ]); DUMPREG (x[25 ]); DUMPREG (x[26 ]); DUMPREG (x[27 ]); Printf (" \n " );
827+ DUMPREG (x[28 ]); DUMPREG___ (fp); DUMPREG___ (lr); DUMPREG___ (sp); Printf (" \n " );
828+ # elif defined(__arm__)
829+ # define DUMPREG (r ) DUMPREG32(r)
830+ DUMPREG_ (r[0 ]); DUMPREG_ (r[1 ]); DUMPREG_ (r[2 ]); DUMPREG_ (r[3 ]); Printf (" \n " );
831+ DUMPREG_ (r[4 ]); DUMPREG_ (r[5 ]); DUMPREG_ (r[6 ]); DUMPREG_ (r[7 ]); Printf (" \n " );
832+ DUMPREG_ (r[8 ]); DUMPREG_ (r[9 ]); DUMPREG (r[10 ]); DUMPREG (r[11 ]); Printf (" \n " );
833+ DUMPREG (r[12 ]); DUMPREG___ (sp); DUMPREG___ (lr); DUMPREG___ (pc); Printf (" \n " );
834+ # else
835+ # error "Unknown architecture"
836+ # endif
837+
838+ # undef DUMPREG64
839+ # undef DUMPREG32
840+ # undef DUMPREG_
841+ # undef DUMPREG__
842+ # undef DUMPREG___
843+ # undef DUMPREG
844+ }
845+
796846} // namespace __sanitizer
797847
798848#endif // SANITIZER_MAC
0 commit comments