mirror of git://gcc.gnu.org/git/gcc.git
unwind-arm-common.inc: Include `tconfig.h', `tsystem.h' and `sys/sdt.h'.
2011-12-20 Sergio Durigan Junior <sergiodj@redhat.com> * 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. (unwind_phase2_forced): Likewise. (__gnu_Unwind_Resume): Likewise. From-SVN: r182552
This commit is contained in:
parent
48b0b19630
commit
6904889880
|
|
@ -1,3 +1,14 @@
|
||||||
|
2011-12-20 Sergio Durigan Junior <sergiodj@redhat.com>
|
||||||
|
|
||||||
|
* 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.
|
||||||
|
(unwind_phase2_forced): Likewise.
|
||||||
|
(__gnu_Unwind_Resume): Likewise.
|
||||||
|
|
||||||
2011-12-20 Uros Bizjak <ubizjak@gmail.com>
|
2011-12-20 Uros Bizjak <ubizjak@gmail.com>
|
||||||
|
|
||||||
* config/alpha/linux-unwind.h: Update copyright years.
|
* config/alpha/linux-unwind.h: Update copyright years.
|
||||||
|
|
|
||||||
|
|
@ -21,8 +21,15 @@
|
||||||
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
|
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
|
||||||
<http://www.gnu.org/licenses/>. */
|
<http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include "tconfig.h"
|
||||||
|
#include "tsystem.h"
|
||||||
#include "unwind.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
|
/* We add a prototype for abort here to avoid creating a dependency on
|
||||||
target headers. */
|
target headers. */
|
||||||
extern void abort (void);
|
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 _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
|
/* Perform a binary search for RETURN_ADDRESS in TABLE. The table contains
|
||||||
NREC entries. */
|
NREC entries. */
|
||||||
|
|
||||||
|
|
@ -253,8 +298,8 @@ unwind_phase2 (_Unwind_Control_Block * ucbp, phase2_vrs * vrs)
|
||||||
|
|
||||||
if (pr_result != _URC_INSTALL_CONTEXT)
|
if (pr_result != _URC_INSTALL_CONTEXT)
|
||||||
abort();
|
abort();
|
||||||
|
|
||||||
restore_core_regs (&vrs->core);
|
uw_restore_core_regs (vrs, &vrs->core);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Perform phase2 forced unwinding. */
|
/* Perform phase2 forced unwinding. */
|
||||||
|
|
@ -339,7 +384,7 @@ unwind_phase2_forced (_Unwind_Control_Block *ucbp, phase2_vrs *entry_vrs,
|
||||||
return _URC_FAILURE;
|
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
|
/* 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:
|
case _URC_INSTALL_CONTEXT:
|
||||||
/* Upload the registers to enter the landing pad. */
|
/* 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:
|
case _URC_CONTINUE_UNWIND:
|
||||||
/* Continue unwinding the next frame. */
|
/* Continue unwinding the next frame. */
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue