Commit b55f40c1 by Jakub Jelinek Committed by Jakub Jelinek

diagnostic-core.h (internal_error_no_backtrace): New prototype.

	* diagnostic-core.h (internal_error_no_backtrace): New prototype.
	* diagnostic.def (DK_ICE_NOBT): New kind.
	* diagnostic.c (diagnostic_action_after_output): Handle DK_ICE_NOBT
	like DK_ICE, but never print backtrace.
	(diagnostic_report_diagnostic): Handle DK_ICE_NOBT like DK_ICE.
	(internal_error_no_backtrace): New function.
	* gcc.c (execute): Use internal_error_no_backtrace instead of
	internal_error.
fortran/
	* gfc-diagnostic.def (DK_ICE_NOBT): New kind.

From-SVN: r220030
parent 652960d1
2015-01-23 Jakub Jelinek <jakub@redhat.com>
* diagnostic-core.h (internal_error_no_backtrace): New prototype.
* diagnostic.def (DK_ICE_NOBT): New kind.
* diagnostic.c (diagnostic_action_after_output): Handle DK_ICE_NOBT
like DK_ICE, but never print backtrace.
(diagnostic_report_diagnostic): Handle DK_ICE_NOBT like DK_ICE.
(internal_error_no_backtrace): New function.
* gcc.c (execute): Use internal_error_no_backtrace instead of
internal_error.
2015-01-22 Jeff Law <law@redhat.com> 2015-01-22 Jeff Law <law@redhat.com>
PR target/52076 PR target/52076
......
...@@ -56,6 +56,8 @@ extern const char *trim_filename (const char *); ...@@ -56,6 +56,8 @@ extern const char *trim_filename (const char *);
#endif #endif
extern void internal_error (const char *, ...) ATTRIBUTE_GCC_DIAG(1,2) extern void internal_error (const char *, ...) ATTRIBUTE_GCC_DIAG(1,2)
ATTRIBUTE_NORETURN; ATTRIBUTE_NORETURN;
extern void internal_error_no_backtrace (const char *, ...)
ATTRIBUTE_GCC_DIAG(1,2) ATTRIBUTE_NORETURN;
/* Pass one of the OPT_W* from options.h as the first parameter. */ /* Pass one of the OPT_W* from options.h as the first parameter. */
extern bool warning (int, const char *, ...) ATTRIBUTE_GCC_DIAG(2,3); extern bool warning (int, const char *, ...) ATTRIBUTE_GCC_DIAG(2,3);
extern bool warning_n (location_t, int, int, const char *, const char *, ...) extern bool warning_n (location_t, int, int, const char *, const char *, ...)
......
...@@ -518,9 +518,11 @@ diagnostic_action_after_output (diagnostic_context *context, ...@@ -518,9 +518,11 @@ diagnostic_action_after_output (diagnostic_context *context,
break; break;
case DK_ICE: case DK_ICE:
case DK_ICE_NOBT:
{ {
struct backtrace_state *state = struct backtrace_state *state = NULL;
backtrace_create_state (NULL, 0, bt_err_callback, NULL); if (diag_kind == DK_ICE)
state = backtrace_create_state (NULL, 0, bt_err_callback, NULL);
int count = 0; int count = 0;
if (state != NULL) if (state != NULL)
backtrace_full (state, 2, bt_callback, bt_err_callback, backtrace_full (state, 2, bt_callback, bt_err_callback,
...@@ -739,7 +741,8 @@ diagnostic_report_diagnostic (diagnostic_context *context, ...@@ -739,7 +741,8 @@ diagnostic_report_diagnostic (diagnostic_context *context,
/* If we're reporting an ICE in the middle of some other error, /* If we're reporting an ICE in the middle of some other error,
try to flush out the previous error, then let this one try to flush out the previous error, then let this one
through. Don't do this more than once. */ through. Don't do this more than once. */
if (diagnostic->kind == DK_ICE && context->lock == 1) if ((diagnostic->kind == DK_ICE || diagnostic->kind == DK_ICE_NOBT)
&& context->lock == 1)
pp_newline_and_flush (context->printer); pp_newline_and_flush (context->printer);
else else
error_recursion (context); error_recursion (context);
...@@ -812,7 +815,7 @@ diagnostic_report_diagnostic (diagnostic_context *context, ...@@ -812,7 +815,7 @@ diagnostic_report_diagnostic (diagnostic_context *context,
context->lock++; context->lock++;
if (diagnostic->kind == DK_ICE) if (diagnostic->kind == DK_ICE || diagnostic->kind == DK_ICE_NOBT)
{ {
#ifndef ENABLE_CHECKING #ifndef ENABLE_CHECKING
/* When not checking, ICEs are converted to fatal errors when an /* When not checking, ICEs are converted to fatal errors when an
...@@ -1240,6 +1243,23 @@ internal_error (const char *gmsgid, ...) ...@@ -1240,6 +1243,23 @@ internal_error (const char *gmsgid, ...)
gcc_unreachable (); gcc_unreachable ();
} }
/* Like internal_error, but no backtrace will be printed. Used when
the internal error does not happen at the current location, but happened
somewhere else. */
void
internal_error_no_backtrace (const char *gmsgid, ...)
{
diagnostic_info diagnostic;
va_list ap;
va_start (ap, gmsgid);
diagnostic_set_info (&diagnostic, gmsgid, &ap, input_location, DK_ICE_NOBT);
report_diagnostic (&diagnostic);
va_end (ap);
gcc_unreachable ();
}
/* Special case error functions. Most are implemented in terms of the /* Special case error functions. Most are implemented in terms of the
above, or should be. */ above, or should be. */
......
...@@ -45,3 +45,6 @@ DEFINE_DIAGNOSTIC_KIND (DK_PERMERROR, "permerror: ", NULL) ...@@ -45,3 +45,6 @@ DEFINE_DIAGNOSTIC_KIND (DK_PERMERROR, "permerror: ", NULL)
/* This one is just for counting DK_WARNING promoted to DK_ERROR /* This one is just for counting DK_WARNING promoted to DK_ERROR
due to -Werror and -Werror=warning. */ due to -Werror and -Werror=warning. */
DEFINE_DIAGNOSTIC_KIND (DK_WERROR, "error: ", NULL) DEFINE_DIAGNOSTIC_KIND (DK_WERROR, "error: ", NULL)
/* This is like DK_ICE, but backtrace is not printed. Used in the driver
when reporting fatal signal in the compiler. */
DEFINE_DIAGNOSTIC_KIND (DK_ICE_NOBT, "internal compiler error: ", "error")
2015-01-23 Jakub Jelinek <jakub@redhat.com>
* gfc-diagnostic.def (DK_ICE_NOBT): New kind.
2015-01-23 Janus Weil <janus@gcc.gnu.org> 2015-01-23 Janus Weil <janus@gcc.gnu.org>
PR fortran/60922 PR fortran/60922
......
...@@ -45,3 +45,6 @@ DEFINE_DIAGNOSTIC_KIND (DK_PERMERROR, "permerror", NULL) ...@@ -45,3 +45,6 @@ DEFINE_DIAGNOSTIC_KIND (DK_PERMERROR, "permerror", NULL)
/* This one is just for counting DK_WARNING promoted to DK_ERROR /* This one is just for counting DK_WARNING promoted to DK_ERROR
due to -Werror and -Werror=warning. */ due to -Werror and -Werror=warning. */
DEFINE_DIAGNOSTIC_KIND (DK_WERROR, "error", NULL) DEFINE_DIAGNOSTIC_KIND (DK_WERROR, "error", NULL)
/* This is like DK_ICE, but backtrace is not printed. Used in the driver
when reporting fatal signal in the compiler. */
DEFINE_DIAGNOSTIC_KIND (DK_ICE_NOBT, "internal compiler error", "error")
...@@ -2912,8 +2912,9 @@ execute (void) ...@@ -2912,8 +2912,9 @@ execute (void)
} }
else else
#endif #endif
internal_error ("%s (program %s)", internal_error_no_backtrace ("%s (program %s)",
strsignal (WTERMSIG (status)), commands[i].prog); strsignal (WTERMSIG (status)),
commands[i].prog);
} }
else if (WIFEXITED (status) else if (WIFEXITED (status)
&& WEXITSTATUS (status) >= MIN_FATAL_STATUS) && WEXITSTATUS (status) >= MIN_FATAL_STATUS)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment