backport: unwind-arm.h: Make _Unwind_GetIP...

2017-05-19  Andreas Tobler  <andreast@gcc.gnu.org>

    Backport from mainline
    2017-05-17  Andreas Tobler  <andreast@gcc.gnu.org>

    * config/arm/unwind-arm.h: Make _Unwind_GetIP, _Unwind_GetIPInfo and
    _Unwind_SetIP available as functions for arm*-*-freebsd*.
    * config/arm/unwind-arm.c: Implement the above.

From-SVN: r248299
This commit is contained in:
Andreas Tobler 2017-05-19 20:38:22 +02:00
parent a40583fba8
commit f132a47f39
3 changed files with 38 additions and 0 deletions

View File

@ -1,3 +1,12 @@
2017-05-19 Andreas Tobler <andreast@gcc.gnu.org>
Backport from mainline
2017-05-17 Andreas Tobler <andreast@gcc.gnu.org>
* config/arm/unwind-arm.h: Make _Unwind_GetIP, _Unwind_GetIPInfo and
_Unwind_SetIP available as functions for arm*-*-freebsd*.
* config/arm/unwind-arm.c: Implement the above.
2017-05-15 Adhemerval Zanella <adhemerval.zanella@linaro.org>
* config/sparc/lb1spc.S [__ELF__ && __linux__]: Emit .note.GNU-stack

View File

@ -509,3 +509,25 @@ __aeabi_unwind_cpp_pr2 (_Unwind_State state,
{
return __gnu_unwind_pr_common (state, ucbp, context, 2);
}
#ifdef __FreeBSD__
/* FreeBSD expects these to be functions */
inline _Unwind_Ptr
_Unwind_GetIP (struct _Unwind_Context *context)
{
return _Unwind_GetGR (context, 15) & ~(_Unwind_Word)1;
}
inline _Unwind_Ptr
_Unwind_GetIPInfo (struct _Unwind_Context *context, int *ip_before_insn)
{
*ip_before_insn = 0;
return _Unwind_GetIP (context);
}
inline void
_Unwind_SetIP (struct _Unwind_Context *context, _Unwind_Ptr val)
{
_Unwind_SetGR (context, 15, val | (_Unwind_GetGR (context, 15) & 1));
}
#endif

View File

@ -72,12 +72,19 @@ extern "C" {
{
return _URC_FAILURE;
}
#ifndef __FreeBSD__
/* Return the address of the instruction, not the actual IP value. */
#define _Unwind_GetIP(context) \
(_Unwind_GetGR (context, 15) & ~(_Unwind_Word)1)
#define _Unwind_SetIP(context, val) \
_Unwind_SetGR (context, 15, val | (_Unwind_GetGR (context, 15) & 1))
#else
#undef _Unwind_GetIPInfo
_Unwind_Ptr _Unwind_GetIP (struct _Unwind_Context *);
_Unwind_Ptr _Unwind_GetIPInfo (struct _Unwind_Context *, int *);
void _Unwind_SetIP (struct _Unwind_Context *, _Unwind_Ptr);
#endif
#ifdef __cplusplus
} /* extern "C" */