From aebd6cb6ec855cc4f9a07a694847b4a19fe5759a Mon Sep 17 00:00:00 2001 From: amodra Date: Wed, 8 Sep 2004 00:17:19 +0000 Subject: * doc/tm.texi (MD_UNWIND_SUPPORT): Document. (MD_FALLBACK_FRAME_STATE_FOR): Update. * unwind-dw2.c (MD_UNWIND_SUPPORT): #include if defined. (uw_frame_state_for): Adjust MD_FALLBACK_FRAME_STATE_FOR invocation. (MD_FROB_UPDATE_CONTEXT): Remove default. (uw_update_context_1): Instead #ifdef invocation. * config/ia64/unwind-ia64.c (MD_UNWIND_SUPPORT): #include if defined. (uw_frame_state_for): Adjust MD_FALLBACK_FRAME_STATE_FOR invocation. * config/alpha/gnu.h (MD_FALLBACK_FRAME_STATE_FOR): Don't undef. (MD_UNWIND_SUPPORT): Undefine this instead. * config/i386/gnu.h: Likewise. * config/alpha/linux-unwind.h: New file, macro converted to function, extracted from.. * config/alpha/linux.h (MD_FALLBACK_FRAME_STATE_FOR): ..this. (MD_UNWIND_SUPPORT): Define. * config/alpha/vms-unwind.h, config/alpha/vms.h: Likewise. * config/i386/linux-unwind.h, config/i386/linux.h, config/i386/linux64.h: Likewise. * config/ia64/linux-unwind.h, config/ia64/linux.h: Likewise. MD_HANDLE_UNWABI too. * config/mips/linux-unwind.h, config/mips/linux.h: Likewise. * config/pa/linux-unwind.h, config/pa/pa32-linux.h: Likewise. * config/rs6000/darwin-unwind.h, config/rs6000/darwin.h: Likewise. * config/s390/linux-unwind.h, config/s390/linux.h: Likewise. * config/sparc/linux-unwind.h, config/sparc/linux.h, config/sparc/linux64.h: Likewise. * config/sh/linux-unwind.h, config/sh/linux.h: Likewise, but merge SH_FALLBACK_FRAME_FLOAT_STATE into sh_fallback_frame_state. * config/rs6000/linux-unwind.h, config/rs6000/linux.h, config/rs6000/linux64.h: Likewise. Split out get_sigcontext function. Use ARG_POINTER_REGNUM for 32-bit temp reg too. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@87167 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/config/pa/pa32-linux.h | 94 +--------------------------------------------- 1 file changed, 1 insertion(+), 93 deletions(-) (limited to 'gcc/config/pa/pa32-linux.h') diff --git a/gcc/config/pa/pa32-linux.h b/gcc/config/pa/pa32-linux.h index 14cc2cf9159..07b680de88a 100644 --- a/gcc/config/pa/pa32-linux.h +++ b/gcc/config/pa/pa32-linux.h @@ -36,96 +36,4 @@ Boston, MA 02111-1307, USA. */ aligned(sizeof(func_ptr)))) \ = { (func_ptr) (-1) } -/* Do code reading to identify a signal frame, and set the frame - state data appropriately. See unwind-dw2.c for the structs. */ - -#ifdef IN_LIBGCC2 -#include -#include - -/* Unfortunately, because of various bugs and changes to the kernel, - we have several cases to deal with. - - In 2.4, the signal trampoline is 4 words, and (CONTEXT)->ra should - point directly at the beginning of the trampoline and struct rt_sigframe. - - In <= 2.6.5-rc2-pa3, the signal trampoline is 9 words, and - (CONTEXT)->ra points at the 4th word in the trampoline structure. This - is wrong, it should point at the 5th word. This is fixed in 2.6.5-rc2-pa4. - - To detect these cases, we first take (CONTEXT)->ra, align it to 64-bytes - to get the beginning of the signal frame, and then check offsets 0, 4 - and 5 to see if we found the beginning of the trampoline. This will - tell us how to locate the sigcontext structure. - - Note that with a 2.4 64-bit kernel, the signal context is not properly - passed back to userspace so the unwind will not work correctly. */ -#define MD_FALLBACK_FRAME_STATE_FOR(CONTEXT, FS, SUCCESS) \ - do { \ - unsigned long sp = (unsigned long)(CONTEXT)->ra & ~63; \ - unsigned int *pc = (unsigned int *)sp; \ - unsigned long off; \ - _Unwind_Ptr new_cfa; \ - int i; \ - struct sigcontext *sc; \ - struct rt_sigframe { \ - struct siginfo info; \ - struct ucontext uc; \ - } *frame; \ - \ - /* rt_sigreturn trampoline: \ - 3419000x ldi 0, %r25 or ldi 1, %r25 (x = 0 or 2) \ - 3414015a ldi __NR_rt_sigreturn, %r20 \ - e4008200 be,l 0x100(%sr2, %r0), %sr0, %r31 \ - 08000240 nop */ \ - \ - if (pc[0] == 0x34190000 || pc[0] == 0x34190002) \ - off = 4*4; \ - else if (pc[4] == 0x34190000 || pc[4] == 0x34190002) \ - { \ - pc += 4; \ - off = 10 * 4; \ - } \ - else if (pc[5] == 0x34190000 || pc[5] == 0x34190002) \ - { \ - pc += 5; \ - off = 10 * 4; \ - } \ - else \ - break; \ - if (pc[1] != 0x3414015a \ - || pc[2] != 0xe4008200 \ - || pc[3] != 0x08000240) \ - break; \ - \ - frame = (struct rt_sigframe *)(sp + off); \ - sc = &frame->uc.uc_mcontext; \ - \ - new_cfa = sc->sc_gr[30]; \ - (FS)->cfa_how = CFA_REG_OFFSET; \ - (FS)->cfa_reg = 30; \ - (FS)->cfa_offset = new_cfa - (long) (CONTEXT)->cfa; \ - for (i = 1; i <= 31; i++) \ - { \ - (FS)->regs.reg[i].how = REG_SAVED_OFFSET; \ - (FS)->regs.reg[i].loc.offset = (long)&sc->sc_gr[i] - new_cfa; \ - } \ - for (i = 4; i <= 31; i++) \ - { \ - /* FP regs have left and right halves */ \ - (FS)->regs.reg[2*i+24].how = REG_SAVED_OFFSET; \ - (FS)->regs.reg[2*i+24].loc.offset \ - = (long)&sc->sc_fr[i] - new_cfa; \ - (FS)->regs.reg[2*i+24+1].how = REG_SAVED_OFFSET; \ - (FS)->regs.reg[2*i+24+1].loc.offset \ - = (long)&sc->sc_fr[i] + 4 - new_cfa; \ - } \ - (FS)->regs.reg[88].how = REG_SAVED_OFFSET; \ - (FS)->regs.reg[88].loc.offset = (long) &sc->sc_sar - new_cfa; \ - (FS)->regs.reg[2].how = REG_SAVED_OFFSET; \ - (FS)->regs.reg[2].loc.offset = (long) &sc->sc_iaoq[0] - new_cfa; \ - (FS)->retaddr_column = 2; \ - goto SUCCESS; \ - } while (0) - -#endif /* IN_LIBGCC2 */ +#define MD_UNWIND_SUPPORT "config/pa/linux-unwind.h" -- cgit v1.2.1