diff options
author | Ulrich Weigand <uweigand@de.ibm.com> | 2003-04-15 16:24:18 +0000 |
---|---|---|
committer | Ulrich Weigand <uweigand@gcc.gnu.org> | 2003-04-15 16:24:18 +0000 |
commit | 7344f3d75bffdd2372e2a24101f7e48de44af2f3 (patch) | |
tree | 90eeed59b90dd08a506965db65e9397ff6d450d4 /gcc/unwind.inc | |
parent | 9547e8fd98c50f8e01cb5d92109a5c7ed6b862dd (diff) | |
download | gcc-7344f3d75bffdd2372e2a24101f7e48de44af2f3.zip gcc-7344f3d75bffdd2372e2a24101f7e48de44af2f3.tar.gz gcc-7344f3d75bffdd2372e2a24101f7e48de44af2f3.tar.bz2 |
unwind.inc (_Unwind_Backtrace): New function.
* unwind.inc (_Unwind_Backtrace): New function.
* unwind.h (_Unwind_Backtrace): Declare it.
* libgcc-std.ver (_Unwind_Backtrace): Export it.
From-SVN: r65641
Diffstat (limited to 'gcc/unwind.inc')
-rw-r--r-- | gcc/unwind.inc | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/gcc/unwind.inc b/gcc/unwind.inc index 0422cb8..225b046 100644 --- a/gcc/unwind.inc +++ b/gcc/unwind.inc @@ -239,3 +239,39 @@ _Unwind_DeleteException (struct _Unwind_Exception *exc) { (*exc->exception_cleanup) (_URC_FOREIGN_EXCEPTION_CAUGHT, exc); } + + +/* Perform stack backtrace through unwind data. */ + +_Unwind_Reason_Code +_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; +} + |