aboutsummaryrefslogtreecommitdiff
path: root/gcc
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
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')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/libgcc-std.ver1
-rw-r--r--gcc/unwind.h8
-rw-r--r--gcc/unwind.inc36
4 files changed, 51 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index e2750ac..4457250 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2003-04-15 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * unwind.inc (_Unwind_Backtrace): New function.
+ * unwind.h (_Unwind_Backtrace): Declare it.
+ * libgcc-std.ver (_Unwind_Backtrace): Export it.
+
2003-04-14 Jason Merrill <jason@redhat.com>
PR middle-end/10336, c++/10401
diff --git a/gcc/libgcc-std.ver b/gcc/libgcc-std.ver
index 00c72c0..c8a1a8b 100644
--- a/gcc/libgcc-std.ver
+++ b/gcc/libgcc-std.ver
@@ -180,6 +180,7 @@ GCC_3.0 {
GCC_3.3 {
_Unwind_FindEnclosingFunction
_Unwind_GetCFA
+ _Unwind_Backtrace
}
%inherit GCC_3.4 GCC_3.3
diff --git a/gcc/unwind.h b/gcc/unwind.h
index 084eebf..8f7a499 100644
--- a/gcc/unwind.h
+++ b/gcc/unwind.h
@@ -127,6 +127,14 @@ extern void _Unwind_DeleteException (struct _Unwind_Exception *);
e.g. executing cleanup code, and not to implement rethrowing. */
extern void _Unwind_Resume (struct _Unwind_Exception *);
+/* @@@ Use unwind data to perform a stack backtrace. The trace callback
+ is called for every stack frame in the call chain, but no cleanup
+ actions are performed. */
+typedef _Unwind_Reason_Code (*_Unwind_Trace_Fn)
+ (struct _Unwind_Context *, void *);
+
+extern _Unwind_Reason_Code _Unwind_Backtrace (_Unwind_Trace_Fn, void *);
+
/* These functions are used for communicating information about the unwind
context (i.e. the unwind descriptors and the user register state) between
the unwind library and the personality routine and landing pad. Only
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;
+}
+