summaryrefslogtreecommitdiff
path: root/libgcc
diff options
context:
space:
mode:
authorandreast <andreast@138bc75d-0d04-0410-961f-82ee72b054a4>2017-05-19 18:38:22 +0000
committerandreast <andreast@138bc75d-0d04-0410-961f-82ee72b054a4>2017-05-19 18:38:22 +0000
commit8127ecff7c303458301575e5fe15944b15318927 (patch)
tree02b9f749806c6b843e4d9af9137b2a36a405419e /libgcc
parent6f6d9d7fd0c3e30bc2582abf1df1c8d6f49959cd (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/ChangeLog9
-rw-r--r--libgcc/config/arm/unwind-arm.c22
-rw-r--r--libgcc/config/arm/unwind-arm.h7
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" */