summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoramonakov <amonakov@138bc75d-0d04-0410-961f-82ee72b054a4>2017-08-03 13:39:47 +0000
committeramonakov <amonakov@138bc75d-0d04-0410-961f-82ee72b054a4>2017-08-03 13:39:47 +0000
commit32e4d7fa5f5ab3c82c0729b3ff2dd67d8ca473f9 (patch)
treeb4be28c423eff8d34a963ed82b921519d41aec2d
parentba9f2afe27d7118526ea5ed951dcf1adf91ea59b (diff)
downloadgcc-32e4d7fa5f5ab3c82c0729b3ff2dd67d8ca473f9.tar.gz
toplev: avoid recursive emergency_dump_function
* toplev.c (dumpfile.h): New include. (internal_error_reentered): New static function. Use it... (internal_error_function): ...here to handle reentered internal_error. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@250854 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/toplev.c12
2 files changed, 18 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d660e83602f..9e3a8aac28d 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/toplev.c b/gcc/toplev.c
index b28f1847c83..48a79e28d99 100644
--- a/gcc/toplev.c
+++ b/gcc/toplev.c
@@ -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 ();
}