diff options
author | andreast <andreast@138bc75d-0d04-0410-961f-82ee72b054a4> | 2017-05-19 18:38:22 +0000 |
---|---|---|
committer | andreast <andreast@138bc75d-0d04-0410-961f-82ee72b054a4> | 2017-05-19 18:38:22 +0000 |
commit | 8127ecff7c303458301575e5fe15944b15318927 (patch) | |
tree | 02b9f749806c6b843e4d9af9137b2a36a405419e /libgcc | |
parent | 6f6d9d7fd0c3e30bc2582abf1df1c8d6f49959cd (diff) |
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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-7-branch@248299 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libgcc')
-rw-r--r-- | libgcc/ChangeLog | 9 | ||||
-rw-r--r-- | libgcc/config/arm/unwind-arm.c | 22 | ||||
-rw-r--r-- | libgcc/config/arm/unwind-arm.h | 7 |
3 files changed, 38 insertions, 0 deletions
diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog index ded3a21b0d50..1e9dd6851d64 100644 --- a/libgcc/ChangeLog +++ b/libgcc/ChangeLog @@ -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 diff --git a/libgcc/config/arm/unwind-arm.c b/libgcc/config/arm/unwind-arm.c index a3d7391fc03b..c6bfe130b20d 100644 --- a/libgcc/config/arm/unwind-arm.c +++ b/libgcc/config/arm/unwind-arm.c @@ -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 diff --git a/libgcc/config/arm/unwind-arm.h b/libgcc/config/arm/unwind-arm.h index 9fb854fd97d1..8181cb696acf 100644 --- a/libgcc/config/arm/unwind-arm.h +++ b/libgcc/config/arm/unwind-arm.h @@ -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" */ |