libgo: print reason code if throwing unwind exception fails
authorNikhil Benesch <nikhil.benesch@gmail.com>
Sat, 10 Oct 2020 16:26:54 +0000 (16:26 +0000)
committerIan Lance Taylor <iant@golang.org>
Thu, 15 Oct 2020 00:00:02 +0000 (17:00 -0700)
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.

Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/261257

gcc/go/gofrontend/MERGE
libgo/runtime/go-unwind.c

index e6eb8e5..45a7b42 100644 (file)
@@ -1,4 +1,4 @@
-cc1f7d613f9b0666bbf8aac3dd208d5adfe88546
+b73a8f17dfe8d7c7ecc9ccd0317be5abe71c5509
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
index ad3142c..16e0525 100644 (file)
@@ -59,20 +59,22 @@ void
 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 @@ throwException ()
 {
   struct _Unwind_Exception *hdr;
   uintptr align;
+  _Unwind_Reason_Code reason;
 
   hdr = (struct _Unwind_Exception *)runtime_g ()->exception;
 
@@ -119,12 +122,13 @@ throwException ()
   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 ();
 }