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 ();
 }