aboutsummaryrefslogtreecommitdiff
path: root/gcc/unwind.inc
diff options
context:
space:
mode:
authorUlrich Weigand <uweigand@de.ibm.com>2003-04-15 16:24:18 +0000
committerUlrich Weigand <uweigand@gcc.gnu.org>2003-04-15 16:24:18 +0000
commit7344f3d75bffdd2372e2a24101f7e48de44af2f3 (patch)
tree90eeed59b90dd08a506965db65e9397ff6d450d4 /gcc/unwind.inc
parent9547e8fd98c50f8e01cb5d92109a5c7ed6b862dd (diff)
downloadgcc-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.inc36
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;
+}
+