Sergio: Other than a few minor tweaks to the Changelog it largely
looks obvious to me.

Bernd, could you take another look at this since this is now shared
with the c6x backend ?

> Thanks,
>
> Sergio.
>
> diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog
> index 305e8ad..f6e9dec 100644
> --- a/libgcc/ChangeLog
> +++ b/libgcc/ChangeLog
> @@ -1,3 +1,15 @@
> +2011-11-22  Sergio Durigan Junior  <sergi...@redhat.com>
> +
> +       Implement ARM Unwinder SystemTap probe.

This line is not required.

> +       * unwind-arm-common.inc: Include `tconfig.h', `tsystem.h' and
> +       `sys/sdt.h'.
> +       (_Unwind_DebugHook): New function.
> +       (uw_restore_core_regs): New define.
> +       (unwind_phase2): Use `uw_restore_core_regs' instead of
> +       `restore_core_regs'.

You don't need the `' quoting of the function names in the ChangeLog.

> +       (unwind_phase2_forced): Likewise.
> +       (__gnu_Unwind_Resume): Likewise.
> +
>  2011-11-22  Iain Sandoe  <ia...@gcc.gnu.org>
>
>        * config/darwin-crt-tm.c: New file.
> diff --git a/libgcc/unwind-arm-common.inc b/libgcc/unwind-arm-common.inc
> index 0713056..bf16902 100644
> --- a/libgcc/unwind-arm-common.inc
> +++ b/libgcc/unwind-arm-common.inc
> @@ -21,8 +21,15 @@
>    see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
>    <http://www.gnu.org/licenses/>.  */
>
> +#include "tconfig.h"
> +#include "tsystem.h"
>  #include "unwind.h"
>
> +/* Used for SystemTap unwinder probe.  */
> +#ifdef HAVE_SYS_SDT_H
> +#include <sys/sdt.h>
> +#endif
> +
>  /* We add a prototype for abort here to avoid creating a dependency on
>    target headers.  */
>  extern void abort (void);
> @@ -105,6 +112,44 @@ static inline _uw selfrel_offset31 (const _uw *p);
>
>  static _uw __gnu_unwind_get_pr_addr (int idx);
>
> +static void _Unwind_DebugHook (void *, void *)
> +  __attribute__ ((__noinline__, __used__, __noclone__));
> +
> +/* This function is called during unwinding.  It is intended as a hook
> +   for a debugger to intercept exceptions.  CFA is the CFA of the
> +   target frame.  HANDLER is the PC to which control will be
> +   transferred.  */
> +
> +static void
> +_Unwind_DebugHook (void *cfa __attribute__ ((__unused__)),
> +                  void *handler __attribute__ ((__unused__)))
> +{
> +  /* We only want to use stap probes starting with v3.  Earlier
> +     versions added too much startup cost.  */
> +#if defined (HAVE_SYS_SDT_H) && defined (STAP_PROBE2) && _SDT_NOTE_TYPE >= 3
> +  STAP_PROBE2 (libgcc, unwind, cfa, handler);
> +#else
> +  asm ("");
> +#endif
> +}
> +
> +/* This is a wrapper to be called when we need to restore core registers.
> +   It will call `_Unwind_DebugHook' before restoring the registers, thus
> +   making it possible to intercept and debug exceptions.
> +
> +   When calling `_Unwind_DebugHook', the first argument (the CFA) is zero
> +   because we are not interested in it.  However, it must be there (even
> +   being zero) because GDB expects to find it when using the probe.  */
> +
> +#define uw_restore_core_regs(TARGET, CORE)                                   
> \
> +  do                                                                         
> \
> +    {                                                                        
> \
> +      void *handler = __builtin_frob_return_addr ((void *) VRS_PC (TARGET)); 
>  \
> +      _Unwind_DebugHook (0, handler);                                        
> \
> +      restore_core_regs (CORE);                                              
>         \
> +    }                                                                        
> \
> +  while (0)
> +
>  /* Perform a binary search for RETURN_ADDRESS in TABLE.  The table contains
>    NREC entries.  */
>
> @@ -253,8 +298,8 @@ unwind_phase2 (_Unwind_Control_Block * ucbp, phase2_vrs * 
> vrs)
>
>   if (pr_result != _URC_INSTALL_CONTEXT)
>     abort();
> -
> -  restore_core_regs (&vrs->core);
> +
> +  uw_restore_core_regs (vrs, &vrs->core);
>  }
>
>  /* Perform phase2 forced unwinding.  */
> @@ -339,7 +384,7 @@ unwind_phase2_forced (_Unwind_Control_Block *ucbp, 
> phase2_vrs *entry_vrs,
>       return _URC_FAILURE;
>     }
>
> -  restore_core_regs (&saved_vrs.core);
> +  uw_restore_core_regs (&saved_vrs, &saved_vrs.core);
>  }
>
>  /* This is a very limited implementation of _Unwind_GetCFA.  It returns
> @@ -450,7 +495,7 @@ __gnu_Unwind_Resume (_Unwind_Control_Block * ucbp, 
> phase2_vrs * entry_vrs)
>     {
>     case _URC_INSTALL_CONTEXT:
>       /* Upload the registers to enter the landing pad.  */
> -      restore_core_regs (&entry_vrs->core);
> +      uw_restore_core_regs (entry_vrs, &entry_vrs->core);
>
>     case _URC_CONTINUE_UNWIND:
>       /* Continue unwinding the next frame.  */

Otherwise looks ok to me .

Ramana

Reply via email to