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 e6eb8e5c3359cf0aaea5e0d3ee84d9a008ffa2fc..45a7b422a298a689d23e70c64f30862d4179cb63 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 ad3142cb05d86c4b237da118b7cdc3863076dc64..16e05252ec997ae15e6871c246282f86c2753247 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 ();
 }