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
This commit is contained in:
parent
6df11ca1be
commit
754e45a867
20 changed files with 185 additions and 102 deletions
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue