toplev: avoid recursive emergency_dump_function
authorAlexander Monakov <amonakov@ispras.ru>
Thu, 3 Aug 2017 13:39:47 +0000 (16:39 +0300)
committerAlexander Monakov <amonakov@gcc.gnu.org>
Thu, 3 Aug 2017 13:39:47 +0000 (16:39 +0300)
* toplev.c (dumpfile.h): New include.
(internal_error_reentered): New static function.  Use it...
(internal_error_function): ...here to handle reentered internal_error.

From-SVN: r250854

gcc/ChangeLog
gcc/toplev.c

index d660e83602f06df42e48a361f1eea2b970caf62e..9e3a8aac28d1e3f4e306ee42bfbf55c40beedb85 100644 (file)
@@ -1,3 +1,9 @@
+2017-08-03 Alexander Monakov  <amonakov@ispras.ru>
+
+       * toplev.c (dumpfile.h): New include.
+       (internal_error_reentered): New static function.  Use it...
+       (internal_error_function): ...here to handle reentered internal_error.
+
 2017-08-03 Richard Biener  <rguenther@suse.de>
 
        PR middle-end/81148
index b28f1847c839c825fb315dbb360318e48274aa25..48a79e28d99a1843beb12b84c02ff7d36eace312 100644 (file)
@@ -80,6 +80,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "hsa-common.h"
 #include "edit-context.h"
 #include "tree-pass.h"
+#include "dumpfile.h"
 
 #if defined(DBX_DEBUGGING_INFO) || defined(XCOFF_DEBUGGING_INFO)
 #include "dbxout.h"
@@ -1064,11 +1065,22 @@ open_auxiliary_file (const char *ext)
   return file;
 }
 
+/* Alternative diagnostics callback for reentered ICE reporting.  */
+
+static void
+internal_error_reentered (diagnostic_context *, const char *, va_list *)
+{
+  /* Flush the dump file if emergency_dump_function itself caused an ICE.  */
+  if (dump_file)
+    fflush (dump_file);
+}
+
 /* Auxiliary callback for the diagnostics code.  */
 
 static void
 internal_error_function (diagnostic_context *, const char *, va_list *)
 {
+  global_dc->internal_error = internal_error_reentered;
   warn_if_plugins ();
   emergency_dump_function ();
 }