Fix stack unwinding for sparc64; makes C++ exceptions work; ok kettenis@ sthen@
This commit is contained in:
parent
b9edbbb5e8
commit
750fe2e79e
@ -1,10 +1,10 @@
|
||||
# $OpenBSD: Makefile,v 1.64 2018/12/17 14:05:21 pascal Exp $
|
||||
# $OpenBSD: Makefile,v 1.65 2019/02/06 06:48:02 otto Exp $
|
||||
|
||||
ONLY_FOR_ARCHS = ${GCC49_ARCHS}
|
||||
DPB_PROPERTIES = parallel
|
||||
|
||||
V = 4.9.4
|
||||
REVISION = 15
|
||||
REVISION = 16
|
||||
FULL_VERSION = $V
|
||||
FULL_PKGVERSION = $V
|
||||
|
||||
|
53
lang/gcc/4.9/patches/patch-libgcc_unwind-dw2_c
Normal file
53
lang/gcc/4.9/patches/patch-libgcc_unwind-dw2_c
Normal file
@ -0,0 +1,53 @@
|
||||
$OpenBSD: patch-libgcc_unwind-dw2_c,v 1.1 2019/02/06 06:48:02 otto Exp $
|
||||
|
||||
Index: libgcc/unwind-dw2.c
|
||||
--- libgcc/unwind-dw2.c.orig
|
||||
+++ libgcc/unwind-dw2.c
|
||||
@@ -217,6 +217,25 @@ _Unwind_IsExtendedContext (struct _Unwind_Context *con
|
||||
return (ASSUME_EXTENDED_UNWIND_CONTEXT
|
||||
|| (context->flags & EXTENDED_CONTEXT_BIT));
|
||||
}
|
||||
+
|
||||
+#ifdef __sparc64__
|
||||
+
|
||||
+/* Figure out StackGhost cookie. */
|
||||
+_Unwind_Word uw_get_wcookie(void);
|
||||
+
|
||||
+asm(".text\n"
|
||||
+ "uw_get_wcookie:\n"
|
||||
+ " add %o7, %g0, %g4\n"
|
||||
+ " save %sp, -176, %sp\n"
|
||||
+ " save %sp, -176, %sp\n"
|
||||
+ " flushw\n"
|
||||
+ " restore\n"
|
||||
+ " ldx [%sp + 2047 + 120], %g5\n"
|
||||
+ " xor %g4, %g5, %i0\n"
|
||||
+ " ret\n"
|
||||
+ " restore\n");
|
||||
+#endif
|
||||
+
|
||||
|
||||
/* Get the value of register INDEX as saved in CONTEXT. */
|
||||
|
||||
@@ -239,6 +258,13 @@ _Unwind_GetGR (struct _Unwind_Context *context, int in
|
||||
if (_Unwind_IsExtendedContext (context) && context->by_value[index])
|
||||
return _Unwind_Get_Unwind_Word (val);
|
||||
|
||||
+#ifdef __sparc64__
|
||||
+ /* _Unwind_Word and _Unwind_Ptr are the same size on sparc64 */
|
||||
+ _Unwind_Word reg = * (_Unwind_Word *) val;
|
||||
+ if (index == 15 || index == 31)
|
||||
+ reg ^= uw_get_wcookie ();
|
||||
+ return reg;
|
||||
+#else
|
||||
/* This will segfault if the register hasn't been saved. */
|
||||
if (size == sizeof(_Unwind_Ptr))
|
||||
return * (_Unwind_Ptr *) (_Unwind_Internal_Ptr) val;
|
||||
@@ -247,6 +273,7 @@ _Unwind_GetGR (struct _Unwind_Context *context, int in
|
||||
gcc_assert (size == sizeof(_Unwind_Word));
|
||||
return * (_Unwind_Word *) (_Unwind_Internal_Ptr) val;
|
||||
}
|
||||
+#endif
|
||||
}
|
||||
|
||||
static inline void *
|
Loading…
x
Reference in New Issue
Block a user