diagnostic-core.h (internal_error_no_backtrace): New prototype.
authorJakub Jelinek <jakub@redhat.com>
Fri, 23 Jan 2015 08:51:10 +0000 (09:51 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 23 Jan 2015 08:51:10 +0000 (09:51 +0100)
* 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/ChangeLog
gcc/diagnostic-core.h
gcc/diagnostic.c
gcc/diagnostic.def
gcc/fortran/ChangeLog
gcc/fortran/gfc-diagnostic.def
gcc/gcc.c

index ae5e9a5c332e18f201d47aa0301252eded46538e..4a1cfcfc586cb49d908ce4311e8c61fea199f81f 100644 (file)
@@ -1,3 +1,14 @@
+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>
 
        PR target/52076
index 01e866b8c9b7bfadaa6f97c6e4944ce902a303fc..d97111dccacd5eeb477f9129ab3653c358b0b05d 100644 (file)
@@ -56,6 +56,8 @@ extern const char *trim_filename (const char *);
 #endif
 extern void internal_error (const char *, ...) ATTRIBUTE_GCC_DIAG(1,2)
      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.  */
 extern bool warning (int, const char *, ...) ATTRIBUTE_GCC_DIAG(2,3);
 extern bool warning_n (location_t, int, int, const char *, const char *, ...)
index 6b4da23e7b96bbae645a1fa68aea3f6ce8666f02..33eed3ec6f5fab3373e48ea067210f57716ed7a3 100644 (file)
@@ -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 ();
+}
 \f
 /* Special case error functions.  Most are implemented in terms of the
    above, or should be.  */
index 44aea4cd5516e672157a69108a4d825198ff545d..b90ca6934ee609fb45ec02e013326331e6e2363e 100644 (file)
@@ -45,3 +45,6 @@ DEFINE_DIAGNOSTIC_KIND (DK_PERMERROR, "permerror: ", NULL)
 /* This one is just for counting DK_WARNING promoted to DK_ERROR
    due to -Werror and -Werror=warning.  */
 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")
index 0695b22ff16dd3bcd134157000e09b617451049a..6b30eb272aeccc7bad6907cee9c7fe8fb8ef9090 100644 (file)
@@ -1,3 +1,7 @@
+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>
 
        PR fortran/60922
index 2a651c943c516e46a7d2ffc7cee3db92956b3706..f46d2738ae4d9ff73405ba5146227efd2b299df0 100644 (file)
@@ -45,3 +45,6 @@ DEFINE_DIAGNOSTIC_KIND (DK_PERMERROR, "permerror", NULL)
 /* This one is just for counting DK_WARNING promoted to DK_ERROR
    due to -Werror and -Werror=warning.  */
 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")
index 71c1f720192618f5db741842ec8304ab7ade16df..9f98750aff6068f9db30d67f90cc72330dd1f485 100644 (file)
--- a/gcc/gcc.c
+++ b/gcc/gcc.c
@@ -2912,8 +2912,9 @@ execute (void)
              }
            else
 #endif
-             internal_error ("%s (program %s)",
-                             strsignal (WTERMSIG (status)), commands[i].prog);
+             internal_error_no_backtrace ("%s (program %s)",
+                                          strsignal (WTERMSIG (status)),
+                                          commands[i].prog);
          }
        else if (WIFEXITED (status)
                 && WEXITSTATUS (status) >= MIN_FATAL_STATUS)