libgo: print reason code if throwing unwind exception fails
Calls to _Unwind_RaiseException and friends *can* return due to bugs in
libgo or memory corruption. When this occurs, print a message to stderr
with the reason code before aborting to aid debugging.
Change-Id: Iadd7bfca40def25fa7fa9208dca52a56dbbe2208
Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/261257
Trust: Than McIntosh <thanm@google.com>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
diff --git a/libgo/runtime/go-unwind.c b/libgo/runtime/go-unwind.c
index ad3142c..16e0525 100644
--- a/libgo/runtime/go-unwind.c
+++ b/libgo/runtime/go-unwind.c
@@ -59,20 +59,22 @@
rethrowException ()
{
struct _Unwind_Exception *hdr;
+ _Unwind_Reason_Code reason;
hdr = (struct _Unwind_Exception *) runtime_g()->exception;
#ifdef __USING_SJLJ_EXCEPTIONS__
- _Unwind_SjLj_Resume_or_Rethrow (hdr);
+ reason = _Unwind_SjLj_Resume_or_Rethrow (hdr);
#else
#if defined(_LIBUNWIND_STD_ABI)
- _Unwind_RaiseException (hdr);
+ reason = _Unwind_RaiseException (hdr);
#else
- _Unwind_Resume_or_Rethrow (hdr);
+ reason = _Unwind_Resume_or_Rethrow (hdr);
#endif
#endif
/* Rethrowing the exception should not return. */
+ runtime_printf ("failed to rethrow unwind exception (reason=%d)\n", reason);
abort();
}
@@ -105,6 +107,7 @@
{
struct _Unwind_Exception *hdr;
uintptr align;
+ _Unwind_Reason_Code reason;
hdr = (struct _Unwind_Exception *)runtime_g ()->exception;
@@ -119,12 +122,13 @@
hdr->exception_cleanup = NULL;
#ifdef __USING_SJLJ_EXCEPTIONS__
- _Unwind_SjLj_RaiseException (hdr);
+ reason = _Unwind_SjLj_RaiseException (hdr);
#else
- _Unwind_RaiseException (hdr);
+ reason = _Unwind_RaiseException (hdr);
#endif
/* Raising an exception should not return. */
+ runtime_printf ("failed to throw unwind exception (reason=%d)\n", reason);
abort ();
}