diff options
author | Jakub Jelinek <jakub@redhat.com> | 2006-02-27 18:26:26 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2006-02-27 18:26:26 +0100 |
commit | 754e45a8679ad25d2f622919749497c16dc2ea4c (patch) | |
tree | 6984337363ffe60556818a17e48ceaa2283110bb /libjava | |
parent | 6df11ca1befd286661b26a6a2a6774f4d4aa483c (diff) | |
download | gcc-754e45a8679ad25d2f622919749497c16dc2ea4c.zip gcc-754e45a8679ad25d2f622919749497c16dc2ea4c.tar.gz gcc-754e45a8679ad25d2f622919749497c16dc2ea4c.tar.bz2 |
re PR other/26208 (Serious problem with unwinding through signal frames)
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.
From-SVN: r111488
Diffstat (limited to 'libjava')
-rw-r--r-- | libjava/ChangeLog | 13 | ||||
-rw-r--r-- | libjava/exception.cc | 11 | ||||
-rw-r--r-- | libjava/include/i386-signal.h | 24 | ||||
-rw-r--r-- | libjava/include/powerpc-signal.h | 18 | ||||
-rw-r--r-- | libjava/include/x86_64-signal.h | 13 |
5 files changed, 30 insertions, 49 deletions
diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 6804217..ba8b42b 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,16 @@ +2006-02-27 Jakub Jelinek <jakub@redhat.com> + + PR other/26208 + * 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. + 2006-02-23 Scott Gilbertson <scottg@mantatest.com> * gnu/awt/j2d/IntegerGraphicsState.java (getClip): Clone clip diff --git a/libjava/exception.cc b/libjava/exception.cc index 367df36..65bc4ed 100644 --- a/libjava/exception.cc +++ b/libjava/exception.cc @@ -1,6 +1,6 @@ // Functions for Exception Support for Java. -/* Copyright (C) 1998, 1999, 2001, 2002 Free Software Foundation +/* Copyright (C) 1998, 1999, 2001, 2002, 2006 Free Software Foundation This file is part of libgcj. @@ -197,6 +197,7 @@ PERSONALITY_FUNCTION (int version, int handler_switch_value; bool saw_cleanup; bool saw_handler; + int ip_before_insn = 0; // Interface version check. @@ -212,10 +213,10 @@ PERSONALITY_FUNCTION (int version, goto install_context; } - // FIXME: In Phase 1, record _Unwind_GetIP in xh->obj as a part of + // FIXME: In Phase 1, record _Unwind_GetIPInfo in xh->obj as a part of // the stack trace for this exception. This will only collect Java // frames, but perhaps that is acceptable. - // FIXME2: _Unwind_GetIP is nonsensical for SJLJ, being a call-site + // FIXME2: _Unwind_GetIPInfo is nonsensical for SJLJ, being a call-site // index instead of a PC value. We could perhaps arrange for // _Unwind_GetRegionStart to return context->fc->jbuf[1], which // is the address of the handler label for __builtin_longjmp, but @@ -230,7 +231,9 @@ PERSONALITY_FUNCTION (int version, // Parse the LSDA header. p = parse_lsda_header (context, language_specific_data, &info); - ip = _Unwind_GetIP (context) - 1; + ip = _Unwind_GetIPInfo (context, &ip_before_insn); + if (! ip_before_insn) + --ip; landing_pad = 0; action_record = 0; handler_switch_value = 0; diff --git a/libjava/include/i386-signal.h b/libjava/include/i386-signal.h index a5c8ae4..a30ceeb 100644 --- a/libjava/include/i386-signal.h +++ b/libjava/include/i386-signal.h @@ -1,7 +1,7 @@ // i386-signal.h - Catch runtime signals and turn them into exceptions // on an i386 based Linux system. -/* Copyright (C) 1998, 1999, 2001, 2002 Free Software Foundation +/* Copyright (C) 1998, 1999, 2001, 2002, 2006 Free Software Foundation This file is part of libgcj. @@ -22,19 +22,7 @@ details. */ #define SIGNAL_HANDLER(_name) \ static void _name (int _dummy __attribute__ ((__unused__))) -#define MAKE_THROW_FRAME(_exception) \ -do \ -{ \ - void **_p = (void **)&_dummy; \ - volatile struct sigcontext_struct *_regs = (struct sigcontext_struct *)++_p; \ - \ - /* Advance the program counter so that it is after the start of the \ - instruction: the x86 exception handler expects \ - the PC to point to the instruction after a call. */ \ - _regs->eip += 2; \ - \ -} \ -while (0) +#define MAKE_THROW_FRAME(_exception) #define HANDLE_DIVIDE_OVERFLOW \ do \ @@ -91,14 +79,6 @@ do \ _regs->eip = (unsigned long)_eip; \ return; \ } \ - else \ - { \ - /* Advance the program counter so that it is after the start \ - of the instruction: this is because the x86 exception \ - handler expects the PC to point to the instruction after a \ - call. */ \ - _regs->eip += 2; \ - } \ } \ } \ while (0) diff --git a/libjava/include/powerpc-signal.h b/libjava/include/powerpc-signal.h index 0d5a662..66133e9 100644 --- a/libjava/include/powerpc-signal.h +++ b/libjava/include/powerpc-signal.h @@ -1,7 +1,7 @@ // powerpc-signal.h - Catch runtime signals and turn them into exceptions // on a powerpc based Linux system. -/* Copyright (C) 2003 Free Software Foundation +/* Copyright (C) 2003, 2006 Free Software Foundation This file is part of libgcj. @@ -22,18 +22,12 @@ details. */ #define SIGNAL_HANDLER(_name) \ static void _name (int /* _signal */, struct sigcontext *_sc) -/* PPC either leaves PC pointing at a faulting instruction or the - following instruction, depending on the signal. SEGV always does - the former, so we adjust the saved PC to point to the following - instruction. This is what the handler in libgcc expects. */ +/* MD_FALBACK_FRAME_STATE_FOR takes care of special casing PC + before the faulting instruction, so we don't need to do anything + here. */ + +#define MAKE_THROW_FRAME(_exception) -#define MAKE_THROW_FRAME(_exception) \ -do \ - { \ - _sc->regs->nip += 4; \ - } \ -while (0) - /* For an explanation why we cannot simply use sigaction to install the handlers, see i386-signal.h. */ diff --git a/libjava/include/x86_64-signal.h b/libjava/include/x86_64-signal.h index f6df7d7..b4b4c2b 100644 --- a/libjava/include/x86_64-signal.h +++ b/libjava/include/x86_64-signal.h @@ -1,7 +1,7 @@ // x86_64-signal.h - Catch runtime signals and turn them into exceptions // on an x86_64 based GNU/Linux system. -/* Copyright (C) 2003 Free Software Foundation +/* Copyright (C) 2003, 2006 Free Software Foundation This file is part of libgcj. @@ -34,16 +34,7 @@ extern "C" }; } -#define MAKE_THROW_FRAME(_exception) \ -do \ -{ \ - /* Advance the program counter so that it is after the start of the \ - instruction: the x86_64 exception handler expects \ - the PC to point to the instruction after a call. */ \ - struct ucontext *_uc = (struct ucontext *)_p; \ - _uc->uc_mcontext.gregs[REG_RIP] += 2; \ -} \ -while (0) +#define MAKE_THROW_FRAME(_exception) #define RESTORE(name, syscall) RESTORE2 (name, syscall) #define RESTORE2(name, syscall) \ |