diff options
author | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2006-02-27 17:26:26 +0000 |
---|---|---|
committer | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2006-02-27 17:26:26 +0000 |
commit | 15c73eb7f6ae9d0be39182f797df10d573be4199 (patch) | |
tree | 6984337363ffe60556818a17e48ceaa2283110bb /gcc/config/s390 | |
parent | 5f506404644a3986acc8986f3c980a488c2c27b7 (diff) | |
download | gcc-15c73eb7f6ae9d0be39182f797df10d573be4199.tar.gz |
PR other/26208
* unwind-dw2.c (struct _Unwind_Context): Add signal_frame field.
(extract_cie_info): Handle S flag in augmentation string.
(execute_cfa_program): If context->signal_frame, execute also
fs->pc == context->ra instructions.
(uw_frame_state_for): If context->signal_frame, don't subtract one
from context->ra to find FDE.
(uw_update_context_1): Set context->signal_frame to
fs->signal_frame.
(_Unwind_GetIPInfo): New function.
* unwind-dw2.h (_Unwind_FrameState): Add signal_frame field.
* unwind-c.c (PERSONALITY_FUNCTION): Use _Unwind_GetIPInfo instead
of _Unwind_GetIP.
* unwind-sjlj.c (_Unwind_GetIPInfo): New function.
* unwind-generic.h (_Unwind_GetIPInfo): New prototype.
* unwind-compat.c (_Unwind_GetIPInfo): New function.
* libgcc-std.ver (_Unwind_GetIPInfo): Export @@GCC_4.2.0.
* config/ia64/unwind-ia64.c (_Unwind_GetIPInfo): New function.
* config/arm/unwind-arm.h (_Unwind_GetIPInfo): Define.
* config/i386/linux-unwind.h (x86_fallback_frame_state,
x86_64_fallback_frame_state): Set fs->signal_frame.
* config/rs6000/linux-unwind.h (ppc_fallback_frame_state): Likewise.
(MD_FROB_UPDATE_CONTEXT): Define unconditionally.
(frob_update_context): Likewise. Workaround missing S flag in
Linux 2.6.12 - 2.6.16 kernel vDSOs.
* config/s390/linux-unwind.h (s390_fallback_frame_state): Likewise.
Remove the psw_addr + 1 hack.
libjava/
* exception.cc (PERSONALITY_FUNCTION): Use _Unwind_GetIPInfo instead
of _Unwind_GetIP.
* include/i386-signal.h (MAKE_THROW_FRAME): Change into empty macro.
(HANDLE_DIVIDE_OVERFLOW): Don't adjust _res->eip if falling through
to throw.
* include/x86_64-signal.h (MAKE_THROW_FRAME): Change into empty
macro.
* include/powerpc-signal.h (MAKE_THROW_FRAME): Change into empty
macro.
libstdc++-v3/
* libsupc++/eh_personality.cc (PERSONALITY_FUNCTION): Use
_Unwind_GetIPInfo instead of _Unwind_GetIP.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@111488 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/config/s390')
-rw-r--r-- | gcc/config/s390/linux-unwind.h | 28 |
1 files changed, 6 insertions, 22 deletions
diff --git a/gcc/config/s390/linux-unwind.h b/gcc/config/s390/linux-unwind.h index 5f22dfc1bff..d1e9b735edb 100644 --- a/gcc/config/s390/linux-unwind.h +++ b/gcc/config/s390/linux-unwind.h @@ -1,5 +1,5 @@ /* DWARF2 EH unwinding support for S/390 Linux. - Copyright (C) 2004, 2005 Free Software Foundation, Inc. + Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc. This file is part of GCC. @@ -113,27 +113,11 @@ s390_fallback_frame_state (struct _Unwind_Context *context, fs->regs.reg[32].how = REG_SAVED_OFFSET; fs->regs.reg[32].loc.offset = (long)®s->psw_addr - new_cfa; fs->retaddr_column = 32; - - /* If we got a SIGSEGV or a SIGBUS, the PSW address points *to* - the faulting instruction, not after it. This causes the logic - in unwind-dw2.c that decrements the RA to determine the correct - CFI region to get confused. To fix that, we *increment* the RA - here in that case. Note that we cannot modify the RA in place, - and the frame state wants a *pointer*, not a value; thus we put - the modified RA value into the unused register 33 slot of FS and - have the register 32 save address point to that slot. - - Unfortunately, for regular signals on old kernels, we don't know - the signal number. We default to not fiddling with the RA; - that can fail in rare cases. Upgrade your kernel. */ - - if (signo && (*signo == 11 || *signo == 7)) - { - fs->regs.reg[33].loc.exp = - (unsigned char *)regs->psw_addr + 1; - fs->regs.reg[32].loc.offset = - (long)&fs->regs.reg[33].loc.exp - new_cfa; - } + /* SIGILL, SIGFPE and SIGTRAP are delivered with psw_addr + after the faulting instruction rather than before it. + Don't set FS->signal_frame in that case. */ + if (!signo || (*signo != 4 && *signo != 5 && *signo != 8)) + fs->signal_frame = 1; return _URC_NO_REASON; } |