From b55f40c12246309f204e2eccbe5d659641e841c9 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Fri, 23 Jan 2015 09:51:10 +0100 Subject: 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 --- gcc/diagnostic.c | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) (limited to 'gcc/diagnostic.c') diff --git a/gcc/diagnostic.c b/gcc/diagnostic.c index 6b4da23..33eed3e 100644 --- a/gcc/diagnostic.c +++ b/gcc/diagnostic.c @@ -518,9 +518,11 @@ diagnostic_action_after_output (diagnostic_context *context, break; case DK_ICE: + case DK_ICE_NOBT: { - struct backtrace_state *state = - backtrace_create_state (NULL, 0, bt_err_callback, NULL); + struct backtrace_state *state = NULL; + if (diag_kind == DK_ICE) + state = backtrace_create_state (NULL, 0, bt_err_callback, NULL); int count = 0; if (state != NULL) backtrace_full (state, 2, bt_callback, bt_err_callback, @@ -739,7 +741,8 @@ diagnostic_report_diagnostic (diagnostic_context *context, /* If we're reporting an ICE in the middle of some other error, try to flush out the previous error, then let this one 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); else error_recursion (context); @@ -812,7 +815,7 @@ diagnostic_report_diagnostic (diagnostic_context *context, context->lock++; - if (diagnostic->kind == DK_ICE) + if (diagnostic->kind == DK_ICE || diagnostic->kind == DK_ICE_NOBT) { #ifndef ENABLE_CHECKING /* When not checking, ICEs are converted to fatal errors when an @@ -1239,6 +1242,23 @@ internal_error (const char *gmsgid, ...) 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 above, or should be. */ -- cgit v1.1