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.

Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/261257
This commit is contained in:
Nikhil Benesch 2020-10-10 16:26:54 +00:00 committed by Ian Lance Taylor
parent 14d83c6f58
commit 28774a6015
2 changed files with 10 additions and 6 deletions

View 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.

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