@@ -60,6 +60,7 @@ along with GCC; see the file COPYING3. If not see
#include "tree-ssa-live.h" /* For remove_unused_locals. */
#include "tree-cfgcleanup.h"
#include "insn-addr.h" /* for INSN_ADDRESSES_ALLOC. */
+#include "diagnostic-core.h" /* for fnotice */
using namespace gcc;
@@ -1779,6 +1780,24 @@ execute_function_dump (function *fn, void *data)
}
}
+/* This function is called when an internal compiler error is encountered.
+ Ensure that function dump is made available before compiler is aborted. */
+
+void
+emergency_dump_function ()
+{
+ if (!current_pass)
+ return;
+ enum opt_pass_type pt = current_pass->type;
+ fnotice (stderr, "during %s pass: %s\n",
+ pt == GIMPLE_PASS ? "GIMPLE" : pt == RTL_PASS ? "RTL" : "IPA",
+ current_pass->name);
+ if (!dump_file || !cfun)
+ return;
+ fnotice (stderr, "dump file: %s\n", dump_file_name);
+ execute_function_dump (cfun, current_pass);
+}
+
static struct profile_record *profile_record;
/* Do profile consistency book-keeping for the pass with static number INDEX.
@@ -858,16 +858,6 @@ warn_if_plugins (void)
}
-/* Likewise, as a callback from the diagnostics code. */
-
-void
-plugins_internal_error_function (diagnostic_context *context ATTRIBUTE_UNUSED,
- const char *msgid ATTRIBUTE_UNUSED,
- va_list *ap ATTRIBUTE_UNUSED)
-{
- warn_if_plugins ();
-}
-
/* The default version check. Compares every field in VERSION. */
bool
@@ -167,8 +167,6 @@ extern bool plugins_active_p (void);
extern void dump_active_plugins (FILE *);
extern void debug_active_plugins (void);
extern void warn_if_plugins (void);
-extern void plugins_internal_error_function (diagnostic_context *,
- const char *, va_list *);
extern void print_plugins_versions (FILE *file, const char *indent);
extern void print_plugins_help (FILE *file, const char *indent);
extern void finalize_plugins (void);
@@ -79,6 +79,7 @@ along with GCC; see the file COPYING3. If not see
#include "omp-offload.h"
#include "hsa-common.h"
#include "edit-context.h"
+#include "tree-pass.h"
#if defined(DBX_DEBUGGING_INFO) || defined(XCOFF_DEBUGGING_INFO)
#include "dbxout.h"
@@ -1063,6 +1064,15 @@ open_auxiliary_file (const char *ext)
return file;
}
+/* Auxiliary callback for the diagnostics code. */
+
+static void
+internal_error_function (diagnostic_context *, const char *, va_list *)
+{
+ warn_if_plugins ();
+ emergency_dump_function ();
+}
+
/* Initialization of the front end environment, before command line
options are parsed. Signal handlers, internationalization etc.
ARGV0 is main's argv[0]. */
@@ -1101,7 +1111,7 @@ general_init (const char *argv0, bool init_signals)
= global_options_init.x_flag_diagnostics_show_option;
global_dc->show_column
= global_options_init.x_flag_show_column;
- global_dc->internal_error = plugins_internal_error_function;
+ global_dc->internal_error = internal_error_function;
global_dc->option_enabled = option_enabled;
global_dc->option_state = &global_options;
global_dc->option_name = option_name;
@@ -634,6 +634,7 @@ extern void execute_all_ipa_transforms (void);
extern void execute_all_ipa_stmt_fixups (struct cgraph_node *, gimple **);
extern bool pass_init_dump_file (opt_pass *);
extern void pass_fini_dump_file (opt_pass *);
+extern void emergency_dump_function (void);
extern void print_current_pass (FILE *);
extern void debug_pass (void);