libunwind.S (UNWIND_WRAPPER _Unwind_Backtrace): New.
authorAndrew Haley <aph@redhat.com>
Tue, 4 Sep 2007 15:05:01 +0000 (15:05 +0000)
committerAndrew Haley <aph@gcc.gnu.org>
Tue, 4 Sep 2007 15:05:01 +0000 (15:05 +0000)
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

gcc/ChangeLog
gcc/config/arm/libunwind.S
gcc/config/arm/unwind-arm.c
gcc/config/arm/unwind-arm.h

index 2a9310c644eb325b331fb132d0739a8371775766..aa53b22418f24b8f7ae7471cf92ca2475c50a93d 100644 (file)
@@ -1,3 +1,9 @@
+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>
 
        PR c++/14178
index 232847104670dbe2e3bbd6911ee59551950b37f0..0732e9f0af9d2b047cb17789d3d4c0b933a3cba4 100644 (file)
@@ -237,5 +237,6 @@ UNWIND_WRAPPER _Unwind_RaiseException 1
 UNWIND_WRAPPER _Unwind_Resume 1
 UNWIND_WRAPPER _Unwind_Resume_or_Rethrow 1
 UNWIND_WRAPPER _Unwind_ForcedUnwind 3
+UNWIND_WRAPPER _Unwind_Backtrace 2
 
-#endif  /* __symbian__ */
+#endif  /* ndef __symbian__ */
index 60f61d526f46c3a7c06524f0406851c6ef18426c..d9f8a855925c86d16bfcfb256fa2909f15d5d160 100644 (file)
@@ -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.
    ID is the index of the personality routine, other arguments are as defined
    by __aeabi_unwind_cpp_pr{0,1,2}.  */
index 164533058749e5f4fc522c4418eb7d2dec96ec92..896e410c7378f2caef9574d80896b9c146b20f3d 100644 (file)
@@ -205,6 +205,13 @@ extern "C" {
        _Unwind_Control_Block *, struct _Unwind_Context *, void *);
   _Unwind_Reason_Code _Unwind_ForcedUnwind (_Unwind_Control_Block *,
                                            _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 *);
   void _Unwind_Complete(_Unwind_Control_Block *ucbp);
   void _Unwind_DeleteException (_Unwind_Exception *);