2001-05-19 01:37:25 +02:00
|
|
|
/* Exception handling and frame unwind runtime interface routines. -*- C -*-
|
2019-01-01 13:31:55 +01:00
|
|
|
Copyright (C) 2001-2019 Free Software Foundation, Inc.
|
2001-03-28 13:04:51 +02:00
|
|
|
|
Makefile.in, [...]: replace "GNU CC" with "GCC".
* Makefile.in, alias.c, basic-block.h, bb-reorder.c, bitmap.c,
bitmap.h, builtin-types.def, builtins.c, builtins.def,
c-aux-info.c, c-common.c, c-common.def, c-common.h,
c-convert.c, c-decl.c, c-dump.c, c-dump.h, c-errors.c,
c-format.c, c-lang.c, c-lex.c, c-lex.h, c-parse.in,
c-pragma.c, c-pragma.h, c-semantics.c, c-tree.h, c-typeck.c,
caller-save.c, calls.c, collect2.c, collect2.h, combine.c,
conditions.h, config.gcc, configure.frag, configure.in,
conflict.c, convert.c, convert.h, cppspec.c, crtstuff.c,
cse.c, cselib.c, cselib.h, dbxout.c, dbxout.h, defaults.h,
dependence.c, df.c, df.h, diagnostic.c, diagnostic.h,
doloop.c, dominance.c, dwarf.h, dwarf2.h, dwarf2asm.c,
dwarf2asm.h, dwarf2out.c, dwarf2out.h, dwarfout.c,
emit-rtl.c, errors.c, errors.h, except.c, except.h,
exgettext, explow.c, expmed.c, expr.c, expr.h, final.c,
fixproto, flags.h, flow.c, fold-const.c, fp-test.c,
function.c, function.h, gbl-ctors.h, gcc.c, gcc.h, gcc.hlp,
gccspec.c, gcov-io.h, gcse.c, genattr.c, genattrtab.c,
gencheck.c, gencodes.c, genconfig.c, genemit.c,
genextract.c, genflags.c, gengenrtl.c, genmultilib,
genopinit.c, genoutput.c, genpeep.c, genrecog.c,
gensupport.c, gensupport.h, ggc-callbacks.c, ggc-common.c,
ggc-none.c, ggc-page.c, ggc-simple.c, ggc.h, global.c,
graph.c, graph.h, gthr-aix.h, gthr-dce.h, gthr-posix.h,
gthr-rtems.h, gthr-single.h, gthr-solaris.h, gthr-vxworks.h,
gthr-win32.h, gthr.h, haifa-sched.c, halfpic.c, halfpic.h,
hard-reg-set.h, hwint.h, ifcvt.c, input.h, insn-addr.h,
integrate.c, integrate.h, jump.c, lcm.c, libgcc2.c,
libgcc2.h, lists.c, local-alloc.c, loop.c, loop.h,
machmode.def, machmode.h, main.c, mbchar.c, mbchar.h,
mips-tdump.c, mips-tfile.c, mklibgcc.in, mkmap-flat.awk,
mkmap-symver.awk, optabs.c, output.h, params.c, params.def,
params.h, predict.c, predict.def, predict.h, prefix.c,
prefix.h, print-rtl.c, print-tree.c, profile.c, protoize.c,
read-rtl.c, real.c, real.h, recog.c, recog.h, reg-stack.c,
regclass.c, regmove.c, regrename.c, regs.h, reload.c,
reload.h, reload1.c, reorg.c, resource.c, resource.h, rtl.c,
rtl.def, rtl.h, rtlanal.c, sbitmap.c, sbitmap.h,
sched-deps.c, sched-ebb.c, sched-int.h, sched-rgn.c,
sched-vis.c, sdbout.c, sdbout.h, sibcall.c, simplify-rtx.c,
ssa-ccp.c, ssa-dce.c, ssa.c, ssa.h, stmt.c, stor-layout.c,
stringpool.c, system.h, timevar.c, timevar.def, timevar.h,
tlink.c, toplev.c, toplev.h, tree.c, tree.def, tree.h,
tsystem.h, unroll.c, unwind-dw2-fde.c, unwind-dw2-fde.h,
unwind-dw2.c, unwind-pe.h, unwind-sjlj.c, unwind.h,
unwind.inc, varasm.c, varray.c, varray.h, xcoffout.c,
xcoffout.h: replace "GNU CC" with "GCC".
From-SVN: r45105
2001-08-22 16:35:51 +02:00
|
|
|
This file is part of GCC.
|
2001-03-28 13:04:51 +02:00
|
|
|
|
Makefile.in, [...]: replace "GNU CC" with "GCC".
* Makefile.in, alias.c, basic-block.h, bb-reorder.c, bitmap.c,
bitmap.h, builtin-types.def, builtins.c, builtins.def,
c-aux-info.c, c-common.c, c-common.def, c-common.h,
c-convert.c, c-decl.c, c-dump.c, c-dump.h, c-errors.c,
c-format.c, c-lang.c, c-lex.c, c-lex.h, c-parse.in,
c-pragma.c, c-pragma.h, c-semantics.c, c-tree.h, c-typeck.c,
caller-save.c, calls.c, collect2.c, collect2.h, combine.c,
conditions.h, config.gcc, configure.frag, configure.in,
conflict.c, convert.c, convert.h, cppspec.c, crtstuff.c,
cse.c, cselib.c, cselib.h, dbxout.c, dbxout.h, defaults.h,
dependence.c, df.c, df.h, diagnostic.c, diagnostic.h,
doloop.c, dominance.c, dwarf.h, dwarf2.h, dwarf2asm.c,
dwarf2asm.h, dwarf2out.c, dwarf2out.h, dwarfout.c,
emit-rtl.c, errors.c, errors.h, except.c, except.h,
exgettext, explow.c, expmed.c, expr.c, expr.h, final.c,
fixproto, flags.h, flow.c, fold-const.c, fp-test.c,
function.c, function.h, gbl-ctors.h, gcc.c, gcc.h, gcc.hlp,
gccspec.c, gcov-io.h, gcse.c, genattr.c, genattrtab.c,
gencheck.c, gencodes.c, genconfig.c, genemit.c,
genextract.c, genflags.c, gengenrtl.c, genmultilib,
genopinit.c, genoutput.c, genpeep.c, genrecog.c,
gensupport.c, gensupport.h, ggc-callbacks.c, ggc-common.c,
ggc-none.c, ggc-page.c, ggc-simple.c, ggc.h, global.c,
graph.c, graph.h, gthr-aix.h, gthr-dce.h, gthr-posix.h,
gthr-rtems.h, gthr-single.h, gthr-solaris.h, gthr-vxworks.h,
gthr-win32.h, gthr.h, haifa-sched.c, halfpic.c, halfpic.h,
hard-reg-set.h, hwint.h, ifcvt.c, input.h, insn-addr.h,
integrate.c, integrate.h, jump.c, lcm.c, libgcc2.c,
libgcc2.h, lists.c, local-alloc.c, loop.c, loop.h,
machmode.def, machmode.h, main.c, mbchar.c, mbchar.h,
mips-tdump.c, mips-tfile.c, mklibgcc.in, mkmap-flat.awk,
mkmap-symver.awk, optabs.c, output.h, params.c, params.def,
params.h, predict.c, predict.def, predict.h, prefix.c,
prefix.h, print-rtl.c, print-tree.c, profile.c, protoize.c,
read-rtl.c, real.c, real.h, recog.c, recog.h, reg-stack.c,
regclass.c, regmove.c, regrename.c, regs.h, reload.c,
reload.h, reload1.c, reorg.c, resource.c, resource.h, rtl.c,
rtl.def, rtl.h, rtlanal.c, sbitmap.c, sbitmap.h,
sched-deps.c, sched-ebb.c, sched-int.h, sched-rgn.c,
sched-vis.c, sdbout.c, sdbout.h, sibcall.c, simplify-rtx.c,
ssa-ccp.c, ssa-dce.c, ssa.c, ssa.h, stmt.c, stor-layout.c,
stringpool.c, system.h, timevar.c, timevar.def, timevar.h,
tlink.c, toplev.c, toplev.h, tree.c, tree.def, tree.h,
tsystem.h, unroll.c, unwind-dw2-fde.c, unwind-dw2-fde.h,
unwind-dw2.c, unwind-pe.h, unwind-sjlj.c, unwind.h,
unwind.inc, varasm.c, varray.c, varray.h, xcoffout.c,
xcoffout.h: replace "GNU CC" with "GCC".
From-SVN: r45105
2001-08-22 16:35:51 +02:00
|
|
|
GCC is free software; you can redistribute it and/or modify it
|
|
|
|
under the terms of the GNU General Public License as published by
|
2009-04-09 17:00:19 +02:00
|
|
|
the Free Software Foundation; either version 3, or (at your option)
|
2001-03-28 13:04:51 +02:00
|
|
|
any later version.
|
|
|
|
|
Makefile.in, [...]: replace "GNU CC" with "GCC".
* Makefile.in, alias.c, basic-block.h, bb-reorder.c, bitmap.c,
bitmap.h, builtin-types.def, builtins.c, builtins.def,
c-aux-info.c, c-common.c, c-common.def, c-common.h,
c-convert.c, c-decl.c, c-dump.c, c-dump.h, c-errors.c,
c-format.c, c-lang.c, c-lex.c, c-lex.h, c-parse.in,
c-pragma.c, c-pragma.h, c-semantics.c, c-tree.h, c-typeck.c,
caller-save.c, calls.c, collect2.c, collect2.h, combine.c,
conditions.h, config.gcc, configure.frag, configure.in,
conflict.c, convert.c, convert.h, cppspec.c, crtstuff.c,
cse.c, cselib.c, cselib.h, dbxout.c, dbxout.h, defaults.h,
dependence.c, df.c, df.h, diagnostic.c, diagnostic.h,
doloop.c, dominance.c, dwarf.h, dwarf2.h, dwarf2asm.c,
dwarf2asm.h, dwarf2out.c, dwarf2out.h, dwarfout.c,
emit-rtl.c, errors.c, errors.h, except.c, except.h,
exgettext, explow.c, expmed.c, expr.c, expr.h, final.c,
fixproto, flags.h, flow.c, fold-const.c, fp-test.c,
function.c, function.h, gbl-ctors.h, gcc.c, gcc.h, gcc.hlp,
gccspec.c, gcov-io.h, gcse.c, genattr.c, genattrtab.c,
gencheck.c, gencodes.c, genconfig.c, genemit.c,
genextract.c, genflags.c, gengenrtl.c, genmultilib,
genopinit.c, genoutput.c, genpeep.c, genrecog.c,
gensupport.c, gensupport.h, ggc-callbacks.c, ggc-common.c,
ggc-none.c, ggc-page.c, ggc-simple.c, ggc.h, global.c,
graph.c, graph.h, gthr-aix.h, gthr-dce.h, gthr-posix.h,
gthr-rtems.h, gthr-single.h, gthr-solaris.h, gthr-vxworks.h,
gthr-win32.h, gthr.h, haifa-sched.c, halfpic.c, halfpic.h,
hard-reg-set.h, hwint.h, ifcvt.c, input.h, insn-addr.h,
integrate.c, integrate.h, jump.c, lcm.c, libgcc2.c,
libgcc2.h, lists.c, local-alloc.c, loop.c, loop.h,
machmode.def, machmode.h, main.c, mbchar.c, mbchar.h,
mips-tdump.c, mips-tfile.c, mklibgcc.in, mkmap-flat.awk,
mkmap-symver.awk, optabs.c, output.h, params.c, params.def,
params.h, predict.c, predict.def, predict.h, prefix.c,
prefix.h, print-rtl.c, print-tree.c, profile.c, protoize.c,
read-rtl.c, real.c, real.h, recog.c, recog.h, reg-stack.c,
regclass.c, regmove.c, regrename.c, regs.h, reload.c,
reload.h, reload1.c, reorg.c, resource.c, resource.h, rtl.c,
rtl.def, rtl.h, rtlanal.c, sbitmap.c, sbitmap.h,
sched-deps.c, sched-ebb.c, sched-int.h, sched-rgn.c,
sched-vis.c, sdbout.c, sdbout.h, sibcall.c, simplify-rtx.c,
ssa-ccp.c, ssa-dce.c, ssa.c, ssa.h, stmt.c, stor-layout.c,
stringpool.c, system.h, timevar.c, timevar.def, timevar.h,
tlink.c, toplev.c, toplev.h, tree.c, tree.def, tree.h,
tsystem.h, unroll.c, unwind-dw2-fde.c, unwind-dw2-fde.h,
unwind-dw2.c, unwind-pe.h, unwind-sjlj.c, unwind.h,
unwind.inc, varasm.c, varray.c, varray.h, xcoffout.c,
xcoffout.h: replace "GNU CC" with "GCC".
From-SVN: r45105
2001-08-22 16:35:51 +02:00
|
|
|
GCC is distributed in the hope that it will be useful, but WITHOUT
|
|
|
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
|
|
|
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
|
|
|
License for more details.
|
2001-03-28 13:04:51 +02:00
|
|
|
|
2009-04-09 17:00:19 +02:00
|
|
|
Under Section 7 of GPL version 3, you are granted additional
|
|
|
|
permissions described in the GCC Runtime Library Exception, version
|
|
|
|
3.1, as published by the Free Software Foundation.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License and
|
|
|
|
a copy of the GCC Runtime Library Exception along with this program;
|
|
|
|
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
|
|
|
|
<http://www.gnu.org/licenses/>. */
|
2001-03-28 13:04:51 +02:00
|
|
|
|
|
|
|
/* This is derived from the C++ ABI for IA-64. Where we diverge
|
|
|
|
for cross-architecture compatibility are noted with "@@@".
|
2007-11-20 06:38:30 +01:00
|
|
|
This file is included from unwind-dw2.c, unwind-sjlj.c or
|
|
|
|
unwind-ia64.c. */
|
2001-03-28 13:04:51 +02:00
|
|
|
|
|
|
|
/* Subroutine of _Unwind_RaiseException also invoked from _Unwind_Resume.
|
|
|
|
|
|
|
|
Unwind the stack calling the personality routine to find both the
|
|
|
|
exception handler and intermediary cleanup code. We'll only locate
|
|
|
|
the first such frame here. Cleanup code will call back into
|
|
|
|
_Unwind_Resume and we'll continue Phase 2 there. */
|
|
|
|
|
|
|
|
static _Unwind_Reason_Code
|
|
|
|
_Unwind_RaiseException_Phase2(struct _Unwind_Exception *exc,
|
2017-11-17 16:21:23 +01:00
|
|
|
struct _Unwind_Context *context,
|
|
|
|
unsigned long *frames_p)
|
2001-03-28 13:04:51 +02:00
|
|
|
{
|
|
|
|
_Unwind_Reason_Code code;
|
2017-11-17 16:21:23 +01:00
|
|
|
unsigned long frames = 1;
|
2001-03-28 13:04:51 +02:00
|
|
|
|
|
|
|
while (1)
|
|
|
|
{
|
|
|
|
_Unwind_FrameState fs;
|
|
|
|
int match_handler;
|
|
|
|
|
|
|
|
code = uw_frame_state_for (context, &fs);
|
|
|
|
|
|
|
|
/* Identify when we've reached the designated handler context. */
|
|
|
|
match_handler = (uw_identify_context (context) == exc->private_2
|
|
|
|
? _UA_HANDLER_FRAME : 0);
|
|
|
|
|
|
|
|
if (code != _URC_NO_REASON)
|
2001-09-20 01:58:10 +02:00
|
|
|
/* Some error encountered. Usually the unwinder doesn't
|
2001-03-28 13:04:51 +02:00
|
|
|
diagnose these and merely crashes. */
|
|
|
|
return _URC_FATAL_PHASE2_ERROR;
|
|
|
|
|
|
|
|
/* Unwind successful. Run the personality routine, if any. */
|
|
|
|
if (fs.personality)
|
|
|
|
{
|
|
|
|
code = (*fs.personality) (1, _UA_CLEANUP_PHASE | match_handler,
|
|
|
|
exc->exception_class, exc, context);
|
|
|
|
if (code == _URC_INSTALL_CONTEXT)
|
|
|
|
break;
|
|
|
|
if (code != _URC_CONTINUE_UNWIND)
|
|
|
|
return _URC_FATAL_PHASE2_ERROR;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Don't let us unwind past the handler context. */
|
unwind-dw2-fde-glibc.c (base_from_cb_data, [...]): Use gcc_assert and gcc_unreachable as appropriate.
* unwind-dw2-fde-glibc.c (base_from_cb_data,
_Unwind_IteratePhdrCallback): Use gcc_assert and gcc_unreachable as
appropriate.
* unwind-dw2-fde.c (__deregister_frame_info_bases,
base_from_object, fde_split, end_fde_sort): Likewise.
* unwind-dw2.c (_Unwind_GetGR, _Unwind_SetGR, execute_stack_op,
execute_cfa_program, _Unwind_SetSpColumn, uw_update_context_1,
uw_init_context_1): Likewise.
* unwind.inc (_Unwind_RaiseException_Phase2, _Unwind_Resume,
_Unwind_Resume_or_Rethrow): Likewise.
* unwind-pe.h (__gxx_abort): Do not define.
(size_of_encoded_value, base_of_encoded_value,
read_encoded_value_with_base): Use gcc_unreachable.
* unwind.h (_Unwind_GetTextRelBase): Likewise.
From-SVN: r99835
2005-05-17 17:37:47 +02:00
|
|
|
gcc_assert (!match_handler);
|
2001-03-28 13:04:51 +02:00
|
|
|
|
|
|
|
uw_update_context (context, &fs);
|
2018-04-19 19:05:39 +02:00
|
|
|
_Unwind_Frames_Increment (context, frames);
|
2001-03-28 13:04:51 +02:00
|
|
|
}
|
|
|
|
|
2017-11-17 16:21:23 +01:00
|
|
|
*frames_p = frames;
|
2001-03-28 13:04:51 +02:00
|
|
|
return code;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Raise an exception, passing along the given exception object. */
|
|
|
|
|
2007-09-14 20:35:12 +02:00
|
|
|
_Unwind_Reason_Code LIBGCC2_UNWIND_ATTRIBUTE
|
2001-03-28 13:04:51 +02:00
|
|
|
_Unwind_RaiseException(struct _Unwind_Exception *exc)
|
|
|
|
{
|
|
|
|
struct _Unwind_Context this_context, cur_context;
|
|
|
|
_Unwind_Reason_Code code;
|
2017-11-17 16:21:23 +01:00
|
|
|
unsigned long frames;
|
2001-03-28 13:04:51 +02:00
|
|
|
|
2002-03-15 11:18:21 +01:00
|
|
|
/* Set up this_context to describe the current stack frame. */
|
2001-03-28 13:04:51 +02:00
|
|
|
uw_init_context (&this_context);
|
|
|
|
cur_context = this_context;
|
|
|
|
|
|
|
|
/* Phase 1: Search. Unwind the stack, calling the personality routine
|
|
|
|
with the _UA_SEARCH_PHASE flag set. Do not modify the stack yet. */
|
|
|
|
while (1)
|
|
|
|
{
|
|
|
|
_Unwind_FrameState fs;
|
|
|
|
|
2002-03-15 11:18:21 +01:00
|
|
|
/* Set up fs to describe the FDE for the caller of cur_context. The
|
|
|
|
first time through the loop, that means __cxa_throw. */
|
2001-03-28 13:04:51 +02:00
|
|
|
code = uw_frame_state_for (&cur_context, &fs);
|
|
|
|
|
|
|
|
if (code == _URC_END_OF_STACK)
|
|
|
|
/* Hit end of stack with no handler found. */
|
|
|
|
return _URC_END_OF_STACK;
|
|
|
|
|
|
|
|
if (code != _URC_NO_REASON)
|
2008-06-06 07:42:00 +02:00
|
|
|
/* Some error encountered. Usually the unwinder doesn't
|
2001-03-28 13:04:51 +02:00
|
|
|
diagnose these and merely crashes. */
|
|
|
|
return _URC_FATAL_PHASE1_ERROR;
|
|
|
|
|
|
|
|
/* Unwind successful. Run the personality routine, if any. */
|
|
|
|
if (fs.personality)
|
|
|
|
{
|
|
|
|
code = (*fs.personality) (1, _UA_SEARCH_PHASE, exc->exception_class,
|
|
|
|
exc, &cur_context);
|
|
|
|
if (code == _URC_HANDLER_FOUND)
|
|
|
|
break;
|
|
|
|
else if (code != _URC_CONTINUE_UNWIND)
|
|
|
|
return _URC_FATAL_PHASE1_ERROR;
|
|
|
|
}
|
|
|
|
|
2002-03-15 11:18:21 +01:00
|
|
|
/* Update cur_context to describe the same frame as fs. */
|
2001-03-28 13:04:51 +02:00
|
|
|
uw_update_context (&cur_context, &fs);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Indicate to _Unwind_Resume and associated subroutines that this
|
|
|
|
is not a forced unwind. Further, note where we found a handler. */
|
|
|
|
exc->private_1 = 0;
|
|
|
|
exc->private_2 = uw_identify_context (&cur_context);
|
|
|
|
|
|
|
|
cur_context = this_context;
|
2017-11-17 16:21:23 +01:00
|
|
|
code = _Unwind_RaiseException_Phase2 (exc, &cur_context, &frames);
|
2001-03-28 13:04:51 +02:00
|
|
|
if (code != _URC_INSTALL_CONTEXT)
|
|
|
|
return code;
|
|
|
|
|
2017-11-17 16:21:23 +01:00
|
|
|
uw_install_context (&this_context, &cur_context, frames);
|
2001-03-28 13:04:51 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* Subroutine of _Unwind_ForcedUnwind also invoked from _Unwind_Resume. */
|
|
|
|
|
|
|
|
static _Unwind_Reason_Code
|
unwind-dw2-fde-glibc.c (base_from_cb_data, [...]): Use gcc_assert and gcc_unreachable as appropriate.
* unwind-dw2-fde-glibc.c (base_from_cb_data,
_Unwind_IteratePhdrCallback): Use gcc_assert and gcc_unreachable as
appropriate.
* unwind-dw2-fde.c (__deregister_frame_info_bases,
base_from_object, fde_split, end_fde_sort): Likewise.
* unwind-dw2.c (_Unwind_GetGR, _Unwind_SetGR, execute_stack_op,
execute_cfa_program, _Unwind_SetSpColumn, uw_update_context_1,
uw_init_context_1): Likewise.
* unwind.inc (_Unwind_RaiseException_Phase2, _Unwind_Resume,
_Unwind_Resume_or_Rethrow): Likewise.
* unwind-pe.h (__gxx_abort): Do not define.
(size_of_encoded_value, base_of_encoded_value,
read_encoded_value_with_base): Use gcc_unreachable.
* unwind.h (_Unwind_GetTextRelBase): Likewise.
From-SVN: r99835
2005-05-17 17:37:47 +02:00
|
|
|
_Unwind_ForcedUnwind_Phase2 (struct _Unwind_Exception *exc,
|
2017-11-17 16:21:23 +01:00
|
|
|
struct _Unwind_Context *context,
|
|
|
|
unsigned long *frames_p)
|
2001-03-28 13:04:51 +02:00
|
|
|
{
|
2001-05-20 02:35:24 +02:00
|
|
|
_Unwind_Stop_Fn stop = (_Unwind_Stop_Fn) (_Unwind_Ptr) exc->private_1;
|
|
|
|
void *stop_argument = (void *) (_Unwind_Ptr) exc->private_2;
|
2001-03-28 13:04:51 +02:00
|
|
|
_Unwind_Reason_Code code, stop_code;
|
2017-11-17 16:21:23 +01:00
|
|
|
unsigned long frames = 1;
|
2001-03-28 13:04:51 +02:00
|
|
|
|
|
|
|
while (1)
|
|
|
|
{
|
|
|
|
_Unwind_FrameState fs;
|
2001-09-04 20:20:21 +02:00
|
|
|
int action;
|
2001-03-28 13:04:51 +02:00
|
|
|
|
2002-03-15 11:18:21 +01:00
|
|
|
/* Set up fs to describe the FDE for the caller of cur_context. */
|
2001-03-28 13:04:51 +02:00
|
|
|
code = uw_frame_state_for (context, &fs);
|
|
|
|
if (code != _URC_NO_REASON && code != _URC_END_OF_STACK)
|
|
|
|
return _URC_FATAL_PHASE2_ERROR;
|
|
|
|
|
|
|
|
/* Unwind successful. */
|
2001-09-04 20:20:21 +02:00
|
|
|
action = _UA_FORCE_UNWIND | _UA_CLEANUP_PHASE;
|
|
|
|
if (code == _URC_END_OF_STACK)
|
|
|
|
action |= _UA_END_OF_STACK;
|
|
|
|
stop_code = (*stop) (1, action, exc->exception_class, exc,
|
|
|
|
context, stop_argument);
|
2001-03-28 13:04:51 +02:00
|
|
|
if (stop_code != _URC_NO_REASON)
|
|
|
|
return _URC_FATAL_PHASE2_ERROR;
|
|
|
|
|
|
|
|
/* Stop didn't want to do anything. Invoke the personality
|
|
|
|
handler, if applicable, to run cleanups. */
|
|
|
|
if (code == _URC_END_OF_STACK)
|
|
|
|
break;
|
|
|
|
|
|
|
|
if (fs.personality)
|
|
|
|
{
|
|
|
|
code = (*fs.personality) (1, _UA_FORCE_UNWIND | _UA_CLEANUP_PHASE,
|
|
|
|
exc->exception_class, exc, context);
|
|
|
|
if (code == _URC_INSTALL_CONTEXT)
|
|
|
|
break;
|
|
|
|
if (code != _URC_CONTINUE_UNWIND)
|
|
|
|
return _URC_FATAL_PHASE2_ERROR;
|
|
|
|
}
|
|
|
|
|
2005-11-16 23:10:39 +01:00
|
|
|
/* Update cur_context to describe the same frame as fs, and discard
|
|
|
|
the previous context if necessary. */
|
|
|
|
uw_advance_context (context, &fs);
|
2018-04-19 19:05:39 +02:00
|
|
|
_Unwind_Frames_Increment (context, frames);
|
2001-03-28 13:04:51 +02:00
|
|
|
}
|
|
|
|
|
2017-11-17 16:21:23 +01:00
|
|
|
*frames_p = frames;
|
2001-03-28 13:04:51 +02:00
|
|
|
return code;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* Raise an exception for forced unwinding. */
|
|
|
|
|
2007-09-14 20:35:12 +02:00
|
|
|
_Unwind_Reason_Code LIBGCC2_UNWIND_ATTRIBUTE
|
2001-03-28 13:04:51 +02:00
|
|
|
_Unwind_ForcedUnwind (struct _Unwind_Exception *exc,
|
|
|
|
_Unwind_Stop_Fn stop, void * stop_argument)
|
|
|
|
{
|
|
|
|
struct _Unwind_Context this_context, cur_context;
|
|
|
|
_Unwind_Reason_Code code;
|
2017-11-17 16:21:23 +01:00
|
|
|
unsigned long frames;
|
2001-03-28 13:04:51 +02:00
|
|
|
|
|
|
|
uw_init_context (&this_context);
|
|
|
|
cur_context = this_context;
|
|
|
|
|
|
|
|
exc->private_1 = (_Unwind_Ptr) stop;
|
|
|
|
exc->private_2 = (_Unwind_Ptr) stop_argument;
|
|
|
|
|
2017-11-17 16:21:23 +01:00
|
|
|
code = _Unwind_ForcedUnwind_Phase2 (exc, &cur_context, &frames);
|
2001-03-28 13:04:51 +02:00
|
|
|
if (code != _URC_INSTALL_CONTEXT)
|
|
|
|
return code;
|
|
|
|
|
2017-11-17 16:21:23 +01:00
|
|
|
uw_install_context (&this_context, &cur_context, frames);
|
2001-03-28 13:04:51 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* Resume propagation of an existing exception. This is used after
|
|
|
|
e.g. executing cleanup code, and not to implement rethrowing. */
|
|
|
|
|
2007-09-14 20:35:12 +02:00
|
|
|
void LIBGCC2_UNWIND_ATTRIBUTE
|
2001-03-28 13:04:51 +02:00
|
|
|
_Unwind_Resume (struct _Unwind_Exception *exc)
|
|
|
|
{
|
|
|
|
struct _Unwind_Context this_context, cur_context;
|
|
|
|
_Unwind_Reason_Code code;
|
2017-11-17 16:21:23 +01:00
|
|
|
unsigned long frames;
|
2001-03-28 13:04:51 +02:00
|
|
|
|
|
|
|
uw_init_context (&this_context);
|
|
|
|
cur_context = this_context;
|
|
|
|
|
|
|
|
/* Choose between continuing to process _Unwind_RaiseException
|
|
|
|
or _Unwind_ForcedUnwind. */
|
|
|
|
if (exc->private_1 == 0)
|
2017-11-17 16:21:23 +01:00
|
|
|
code = _Unwind_RaiseException_Phase2 (exc, &cur_context, &frames);
|
2001-03-28 13:04:51 +02:00
|
|
|
else
|
2017-11-17 16:21:23 +01:00
|
|
|
code = _Unwind_ForcedUnwind_Phase2 (exc, &cur_context, &frames);
|
2001-03-28 13:04:51 +02:00
|
|
|
|
unwind-dw2-fde-glibc.c (base_from_cb_data, [...]): Use gcc_assert and gcc_unreachable as appropriate.
* unwind-dw2-fde-glibc.c (base_from_cb_data,
_Unwind_IteratePhdrCallback): Use gcc_assert and gcc_unreachable as
appropriate.
* unwind-dw2-fde.c (__deregister_frame_info_bases,
base_from_object, fde_split, end_fde_sort): Likewise.
* unwind-dw2.c (_Unwind_GetGR, _Unwind_SetGR, execute_stack_op,
execute_cfa_program, _Unwind_SetSpColumn, uw_update_context_1,
uw_init_context_1): Likewise.
* unwind.inc (_Unwind_RaiseException_Phase2, _Unwind_Resume,
_Unwind_Resume_or_Rethrow): Likewise.
* unwind-pe.h (__gxx_abort): Do not define.
(size_of_encoded_value, base_of_encoded_value,
read_encoded_value_with_base): Use gcc_unreachable.
* unwind.h (_Unwind_GetTextRelBase): Likewise.
From-SVN: r99835
2005-05-17 17:37:47 +02:00
|
|
|
gcc_assert (code == _URC_INSTALL_CONTEXT);
|
2001-03-28 13:04:51 +02:00
|
|
|
|
2017-11-17 16:21:23 +01:00
|
|
|
uw_install_context (&this_context, &cur_context, frames);
|
2001-03-28 13:04:51 +02:00
|
|
|
}
|
|
|
|
|
2003-05-08 00:11:38 +02:00
|
|
|
|
|
|
|
/* Resume propagation of an FORCE_UNWIND exception, or to rethrow
|
|
|
|
a normal exception that was handled. */
|
|
|
|
|
2007-09-14 20:35:12 +02:00
|
|
|
_Unwind_Reason_Code LIBGCC2_UNWIND_ATTRIBUTE
|
2003-05-08 00:11:38 +02:00
|
|
|
_Unwind_Resume_or_Rethrow (struct _Unwind_Exception *exc)
|
|
|
|
{
|
|
|
|
struct _Unwind_Context this_context, cur_context;
|
|
|
|
_Unwind_Reason_Code code;
|
2017-11-17 16:21:23 +01:00
|
|
|
unsigned long frames;
|
2003-05-08 00:11:38 +02:00
|
|
|
|
|
|
|
/* Choose between continuing to process _Unwind_RaiseException
|
|
|
|
or _Unwind_ForcedUnwind. */
|
|
|
|
if (exc->private_1 == 0)
|
|
|
|
return _Unwind_RaiseException (exc);
|
|
|
|
|
|
|
|
uw_init_context (&this_context);
|
|
|
|
cur_context = this_context;
|
|
|
|
|
2017-11-17 16:21:23 +01:00
|
|
|
code = _Unwind_ForcedUnwind_Phase2 (exc, &cur_context, &frames);
|
2003-05-08 00:11:38 +02:00
|
|
|
|
unwind-dw2-fde-glibc.c (base_from_cb_data, [...]): Use gcc_assert and gcc_unreachable as appropriate.
* unwind-dw2-fde-glibc.c (base_from_cb_data,
_Unwind_IteratePhdrCallback): Use gcc_assert and gcc_unreachable as
appropriate.
* unwind-dw2-fde.c (__deregister_frame_info_bases,
base_from_object, fde_split, end_fde_sort): Likewise.
* unwind-dw2.c (_Unwind_GetGR, _Unwind_SetGR, execute_stack_op,
execute_cfa_program, _Unwind_SetSpColumn, uw_update_context_1,
uw_init_context_1): Likewise.
* unwind.inc (_Unwind_RaiseException_Phase2, _Unwind_Resume,
_Unwind_Resume_or_Rethrow): Likewise.
* unwind-pe.h (__gxx_abort): Do not define.
(size_of_encoded_value, base_of_encoded_value,
read_encoded_value_with_base): Use gcc_unreachable.
* unwind.h (_Unwind_GetTextRelBase): Likewise.
From-SVN: r99835
2005-05-17 17:37:47 +02:00
|
|
|
gcc_assert (code == _URC_INSTALL_CONTEXT);
|
2003-05-08 00:11:38 +02:00
|
|
|
|
2017-11-17 16:21:23 +01:00
|
|
|
uw_install_context (&this_context, &cur_context, frames);
|
2003-05-08 00:11:38 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2001-03-28 13:04:51 +02:00
|
|
|
/* A convenience function that calls the exception_cleanup field. */
|
|
|
|
|
|
|
|
void
|
|
|
|
_Unwind_DeleteException (struct _Unwind_Exception *exc)
|
|
|
|
{
|
2003-05-08 00:11:38 +02:00
|
|
|
if (exc->exception_cleanup)
|
|
|
|
(*exc->exception_cleanup) (_URC_FOREIGN_EXCEPTION_CAUGHT, exc);
|
2001-03-28 13:04:51 +02:00
|
|
|
}
|
2003-04-15 18:24:18 +02:00
|
|
|
|
|
|
|
|
|
|
|
/* Perform stack backtrace through unwind data. */
|
|
|
|
|
2007-09-14 20:35:12 +02:00
|
|
|
_Unwind_Reason_Code LIBGCC2_UNWIND_ATTRIBUTE
|
2003-04-15 18:24:18 +02:00
|
|
|
_Unwind_Backtrace(_Unwind_Trace_Fn trace, void * trace_argument)
|
|
|
|
{
|
|
|
|
struct _Unwind_Context context;
|
|
|
|
_Unwind_Reason_Code code;
|
|
|
|
|
|
|
|
uw_init_context (&context);
|
|
|
|
|
|
|
|
while (1)
|
|
|
|
{
|
|
|
|
_Unwind_FrameState fs;
|
|
|
|
|
|
|
|
/* Set up fs to describe the FDE for the caller of context. */
|
|
|
|
code = uw_frame_state_for (&context, &fs);
|
|
|
|
if (code != _URC_NO_REASON && code != _URC_END_OF_STACK)
|
|
|
|
return _URC_FATAL_PHASE1_ERROR;
|
|
|
|
|
|
|
|
/* Call trace function. */
|
|
|
|
if ((*trace) (&context, trace_argument) != _URC_NO_REASON)
|
|
|
|
return _URC_FATAL_PHASE1_ERROR;
|
|
|
|
|
|
|
|
/* We're done at end of stack. */
|
|
|
|
if (code == _URC_END_OF_STACK)
|
|
|
|
break;
|
|
|
|
|
|
|
|
/* Update context to describe the same frame as fs. */
|
|
|
|
uw_update_context (&context, &fs);
|
|
|
|
}
|
|
|
|
|
|
|
|
return code;
|
|
|
|
}
|