This patch by Tony Reix fixes dumpregs on i386 to use the right type, implements dumpregs for PPC Linux/AIX, and retrieves the PC value on AIX. Bootstrapped and ran Go testsuite on x86_64-pc-linux-gnu. Committed to mainline.
Ian
Index: gcc/go/gofrontend/MERGE =================================================================== --- gcc/go/gofrontend/MERGE (revision 251006) +++ gcc/go/gofrontend/MERGE (working copy) @@ -1,4 +1,4 @@ -480fdfa9dd416bd17115a94fa6021c4dd805fc39 +f02183eb66f5718769f3f6541dcc6744ae1771c0 The first line of this file holds the git revision number of the last merge done from the gofrontend repository. Index: libgo/runtime/go-signal.c =================================================================== --- libgo/runtime/go-signal.c (revision 250873) +++ libgo/runtime/go-signal.c (working copy) @@ -224,6 +224,9 @@ getSiginfo(siginfo_t *info, void *contex #ifdef __linux__ ret.sigpc = ((ucontext_t*)(context))->uc_mcontext.regs->nip; #endif + #ifdef _AIX + ret.sigpc = ((ucontext_t*)(context))->uc_mcontext.jmp_context.iar; + #endif #endif if (ret.sigpc == 0) { @@ -282,19 +285,19 @@ dumpregs(siginfo_t *info __attribute__(( { mcontext_t *m = &((ucontext_t*)(context))->uc_mcontext; - runtime_printf("eax %X\n", m->gregs[REG_EAX]); - runtime_printf("ebx %X\n", m->gregs[REG_EBX]); - runtime_printf("ecx %X\n", m->gregs[REG_ECX]); - runtime_printf("edx %X\n", m->gregs[REG_EDX]); - runtime_printf("edi %X\n", m->gregs[REG_EDI]); - runtime_printf("esi %X\n", m->gregs[REG_ESI]); - runtime_printf("ebp %X\n", m->gregs[REG_EBP]); - runtime_printf("esp %X\n", m->gregs[REG_ESP]); - runtime_printf("eip %X\n", m->gregs[REG_EIP]); - runtime_printf("eflags %X\n", m->gregs[REG_EFL]); - runtime_printf("cs %X\n", m->gregs[REG_CS]); - runtime_printf("fs %X\n", m->gregs[REG_FS]); - runtime_printf("gs %X\n", m->gregs[REG_GS]); + runtime_printf("eax %x\n", m->gregs[REG_EAX]); + runtime_printf("ebx %x\n", m->gregs[REG_EBX]); + runtime_printf("ecx %x\n", m->gregs[REG_ECX]); + runtime_printf("edx %x\n", m->gregs[REG_EDX]); + runtime_printf("edi %x\n", m->gregs[REG_EDI]); + runtime_printf("esi %x\n", m->gregs[REG_ESI]); + runtime_printf("ebp %x\n", m->gregs[REG_EBP]); + runtime_printf("esp %x\n", m->gregs[REG_ESP]); + runtime_printf("eip %x\n", m->gregs[REG_EIP]); + runtime_printf("eflags %x\n", m->gregs[REG_EFL]); + runtime_printf("cs %x\n", m->gregs[REG_CS]); + runtime_printf("fs %x\n", m->gregs[REG_FS]); + runtime_printf("gs %x\n", m->gregs[REG_GS]); } #endif #endif @@ -339,4 +342,37 @@ dumpregs(siginfo_t *info __attribute__(( } #endif #endif + +#ifdef __PPC__ + #ifdef __linux__ + { + mcontext_t *m = &((ucontext_t*)(context))->uc_mcontext; + int i; + + for (i = 0; i < 32; i++) + runtime_printf("r%d %X\n", i, m->regs->gpr[i]); + runtime_printf("pc %X\n", m->regs->nip); + runtime_printf("msr %X\n", m->regs->msr); + runtime_printf("cr %X\n", m->regs->ccr); + runtime_printf("lr %X\n", m->regs->link); + runtime_printf("ctr %X\n", m->regs->ctr); + runtime_printf("xer %X\n", m->regs->xer); + } + #endif + #ifdef _AIX + { + mcontext_t *m = &((ucontext_t*)(context))->uc_mcontext; + int i; + + for (i = 0; i < 32; i++) + runtime_printf("r%d %p\n", i, m->jmp_context.gpr[i]); + runtime_printf("pc %p\n", m->jmp_context.iar); + runtime_printf("msr %p\n", m->jmp_context.msr); + runtime_printf("cr %x\n", m->jmp_context.cr); + runtime_printf("lr %p\n", m->jmp_context.lr); + runtime_printf("ctr %p\n", m->jmp_context.ctr); + runtime_printf("xer %x\n", m->jmp_context.xer); + } + #endif +#endif }