Commit 6f4176b0 by Andrew Haley Committed by Andrew Haley

libunwind.S (UNWIND_WRAPPER _Unwind_Backtrace): New.

2007-08-08  Andrew Haley  <aph@redhat.com>

        * config/arm/libunwind.S (UNWIND_WRAPPER _Unwind_Backtrace): New.
        * config/arm/unwind-arm.h (__gnu_Unwind_Backtrace): New.
        * config/arm/unwind-arm.c (__gnu_Unwind_Backtrace): New.

From-SVN: r128087
parent 29741d6a
2007-08-08 Andrew Haley <aph@redhat.com>
* config/arm/libunwind.S (UNWIND_WRAPPER _Unwind_Backtrace): New.
* config/arm/unwind-arm.h (__gnu_Unwind_Backtrace): New.
* config/arm/unwind-arm.c (__gnu_Unwind_Backtrace): New.
2007-09-04 Emmanuel Thome <Emmanuel.Thome@inria.fr> 2007-09-04 Emmanuel Thome <Emmanuel.Thome@inria.fr>
PR c++/14178 PR c++/14178
......
...@@ -237,5 +237,6 @@ UNWIND_WRAPPER _Unwind_RaiseException 1 ...@@ -237,5 +237,6 @@ UNWIND_WRAPPER _Unwind_RaiseException 1
UNWIND_WRAPPER _Unwind_Resume 1 UNWIND_WRAPPER _Unwind_Resume 1
UNWIND_WRAPPER _Unwind_Resume_or_Rethrow 1 UNWIND_WRAPPER _Unwind_Resume_or_Rethrow 1
UNWIND_WRAPPER _Unwind_ForcedUnwind 3 UNWIND_WRAPPER _Unwind_ForcedUnwind 3
UNWIND_WRAPPER _Unwind_Backtrace 2
#endif /* __symbian__ */ #endif /* ndef __symbian__ */
...@@ -950,6 +950,66 @@ _Unwind_DeleteException (_Unwind_Exception * exc) ...@@ -950,6 +950,66 @@ _Unwind_DeleteException (_Unwind_Exception * exc)
} }
/* Perform stack backtrace through unwind data. */
_Unwind_Reason_Code
__gnu_Unwind_Backtrace(_Unwind_Trace_Fn trace, void * trace_argument,
phase2_vrs * entry_vrs);
_Unwind_Reason_Code
__gnu_Unwind_Backtrace(_Unwind_Trace_Fn trace, void * trace_argument,
phase2_vrs * entry_vrs)
{
phase1_vrs saved_vrs;
_Unwind_Reason_Code code;
_Unwind_Control_Block ucb;
_Unwind_Control_Block *ucbp = &ucb;
/* Set the pc to the call site. */
entry_vrs->core.r[R_PC] = entry_vrs->core.r[R_LR];
/* Save the core registers. */
saved_vrs.core = entry_vrs->core;
/* Set demand-save flags. */
saved_vrs.demand_save_flags = ~(_uw) 0;
do
{
/* Find the entry for this routine. */
if (get_eit_entry (ucbp, saved_vrs.core.r[R_PC]) != _URC_OK)
{
code = _URC_FAILURE;
break;
}
/* The dwarf unwinder assumes the context structure holds things
like the function and LSDA pointers. The ARM implementation
caches these in the exception header (UCB). To avoid
rewriting everything we make the virtual IP register point at
the UCB. */
_Unwind_SetGR((_Unwind_Context *)&saved_vrs, 12, (_Unwind_Ptr) ucbp);
/* Call trace function. */
if ((*trace) ((_Unwind_Context *) &saved_vrs, trace_argument)
!= _URC_NO_REASON)
{
code = _URC_FAILURE;
break;
}
/* Call the pr to decide what to do. */
code = ((personality_routine) UCB_PR_ADDR (ucbp))
(_US_VIRTUAL_UNWIND_FRAME | _US_FORCE_UNWIND,
ucbp, (void *) &saved_vrs);
}
while (code != _URC_END_OF_STACK
&& code != _URC_FAILURE);
finish:
restore_non_core_regs (&saved_vrs);
return code;
}
/* Common implementation for ARM ABI defined personality routines. /* Common implementation for ARM ABI defined personality routines.
ID is the index of the personality routine, other arguments are as defined ID is the index of the personality routine, other arguments are as defined
by __aeabi_unwind_cpp_pr{0,1,2}. */ by __aeabi_unwind_cpp_pr{0,1,2}. */
......
...@@ -205,6 +205,13 @@ extern "C" { ...@@ -205,6 +205,13 @@ extern "C" {
_Unwind_Control_Block *, struct _Unwind_Context *, void *); _Unwind_Control_Block *, struct _Unwind_Context *, void *);
_Unwind_Reason_Code _Unwind_ForcedUnwind (_Unwind_Control_Block *, _Unwind_Reason_Code _Unwind_ForcedUnwind (_Unwind_Control_Block *,
_Unwind_Stop_Fn, void *); _Unwind_Stop_Fn, void *);
/* @@@ 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) (_Unwind_Context *, void *);
_Unwind_Reason_Code _Unwind_Backtrace(_Unwind_Trace_Fn,
void*);
_Unwind_Word _Unwind_GetCFA (struct _Unwind_Context *); _Unwind_Word _Unwind_GetCFA (struct _Unwind_Context *);
void _Unwind_Complete(_Unwind_Control_Block *ucbp); void _Unwind_Complete(_Unwind_Control_Block *ucbp);
void _Unwind_DeleteException (_Unwind_Exception *); void _Unwind_DeleteException (_Unwind_Exception *);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment