On Tue, 30 May 2017, Richard Biener wrote: > If you want to improve here I'd do > > if (current_pass) > fnotice (stderr, "during %s pass: %s\n", ... > if (dump_file && cfun) > { > fnotice (..); > execute_function_dump ... > } > > and I'd print the pass name even if it starts with '*' (that just > means it won't get a dumpfile). > > Generally the patch looks good to me.
Thanks. I'm going to check in the following: * passes.c (emergency_dump_function): New. * tree-pass.h (emergency_dump_function): Declare. * plugin.c (plugins_internal_error_function): Remove. * plugin.h (plugins_internal_error_function): Remove declaration. * toplev.c (internal_error_function): New static function. Use it... (general_init): ...here. --- gcc/passes.c | 19 +++++++++++++++++++ gcc/plugin.c | 10 ---------- gcc/plugin.h | 2 -- gcc/toplev.c | 12 +++++++++++- gcc/tree-pass.h | 1 + 5 files changed, 31 insertions(+), 13 deletions(-) diff --git a/gcc/passes.c b/gcc/passes.c index 98e05e4..64493ba 100644 --- a/gcc/passes.c +++ b/gcc/passes.c @@ -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. diff --git a/gcc/plugin.c b/gcc/plugin.c index c6d3cdd..9892748 100644 --- a/gcc/plugin.c +++ b/gcc/plugin.c @@ -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 diff --git a/gcc/plugin.h b/gcc/plugin.h index 68a673b..b96445d 100644 --- a/gcc/plugin.h +++ b/gcc/plugin.h @@ -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); diff --git a/gcc/toplev.c b/gcc/toplev.c index 425315c..f8b5a40 100644 --- a/gcc/toplev.c +++ b/gcc/toplev.c @@ -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; diff --git a/gcc/tree-pass.h b/gcc/tree-pass.h index cfa4b01..0f7d936 100644 --- a/gcc/tree-pass.h +++ b/gcc/tree-pass.h @@ -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); -- 1.8.3.1