Handle fancy_abort before diagnostic initialization [PR98586]
authorDavid Malcolm <dmalcolm@redhat.com>
Thu, 14 Jan 2021 22:02:28 +0000 (17:02 -0500)
committerDavid Malcolm <dmalcolm@redhat.com>
Thu, 14 Jan 2021 22:02:28 +0000 (17:02 -0500)
commit387f6c15d303a8f8da508e419fea10a6ef0e2590
treefcf14c994b578c9faaec264b1f7bbb60cf36ec32
parent02e7af1122c1aae7c4c764aaa078f72a54645c06
Handle fancy_abort before diagnostic initialization [PR98586]

If fancy_abort is called before the diagnostic subsystem is initialized,
internal_error will crash internally in a way that prevents a useful
message reaching the user.

This can happen with libgccjit in the case of gcc_assert failures
that occur outside of the libgccjit mutex that guards the rest of
gcc's state, including global_dc (when global_dc may not be
initialized yet, or might be in use by another thread).

I tried a few approaches to fixing this as noted in PR jit/98586
e.g. using a temporary diagnostic_context and initializing it for
the call to internal_error, however the more code that runs, the
more chance there is for other errors to occur.

The best fix appears to be to simply fall back to a minimal abort
implementation that only relies on i18n, as implemented by this
patch.

gcc/ChangeLog:
PR jit/98586
* diagnostic.c (diagnostic_kind_text): Break out this array
from...
(diagnostic_build_prefix): ...here.
(fancy_abort): Detect when diagnostic_initialize has not yet been
called and fall back to a minimal implementation of printing the
ICE, rather than segfaulting in internal_error.
gcc/diagnostic.c