passes.c: implement pre-ICE emergency dumping
authorAlexander Monakov <amonakov@ispras.ru>
Wed, 31 May 2017 13:26:54 +0000 (16:26 +0300)
committerAlexander Monakov <amonakov@gcc.gnu.org>
Wed, 31 May 2017 13:26:54 +0000 (16:26 +0300)
* 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.

From-SVN: r248736

gcc/ChangeLog
gcc/passes.c
gcc/plugin.c
gcc/plugin.h
gcc/toplev.c
gcc/tree-pass.h

index f42b287413ba21c80589c3dbdf7559661ed3139c..9c7b3de1dd85c14cdf853c8c65825f6591247382 100644 (file)
@@ -1,3 +1,12 @@
+2017-05-31  Alexander Monakov  <amonakov@ispras.ru>
+
+       * 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.
+
 2017-05-31  Graham Markall  <graham.markall@embecosm.com>
 
        * config/arc/arc.c (arc_print_operand): Handle constant operands.
index 98e05e4ba7add538d9e2882c2bda5c3096f23a13..64493ba1688ba713ec446cf5cdf5247ac80e4744 100644 (file)
@@ -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.
index c6d3cddd81072d7a077f6fbe8d858a4786da7263..9892748cd1519a75a9cc9df550921201346f6412 100644 (file)
@@ -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
index 68a673b40d9e0bf9b794b44e8bd985a195ed589a..b96445d0a3305e9ad601779ba60182d72c87f6a3 100644 (file)
@@ -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);
index 425315c8b5ef97e8005b38d955fb9be74fd5ef23..f8b5a4001c4c6f5b7b9441550985f2e3f0c62825 100644 (file)
@@ -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;
index cfa4b01f81ab46b6a3f006cad2ffaf47cc7f49b0..0f7d936e64bd507ccb429801ca78a348b110f691 100644 (file)
@@ -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);