toplev.c (backend_init_target): Move init_emit_regs and init_regs to...
authorJan Hubicka <hubicka@ucw.cz>
Thu, 26 Jun 2014 02:28:37 +0000 (04:28 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Thu, 26 Jun 2014 02:28:37 +0000 (02:28 +0000)
* toplev.c (backend_init_target): Move init_emit_regs and init_regs to...
(backend_init) ... here; skip ira_init_once and backend_init_target.
(target_reinit) ... and here; clear this_target_rtl->lang_dependent_initialized.
(lang_dependent_init_target): Clear this_target_rtl->lang_dependent_initialized;
break out rtl initialization to ...
(initialize_rtl): ... here; call also backend_init_target and ira_init_once.
* toplev.h (initialize_rtl): New function.
* function.c: Include toplev.h
(init_function_start): Call initialize_rtl.
* rtl.h (target_rtl): Add target_specific_initialized,
lang_dependent_initialized.

From-SVN: r212007

gcc/ChangeLog
gcc/function.c
gcc/rtl.h
gcc/toplev.c
gcc/toplev.h

index 48d6f22..ba0f832 100644 (file)
@@ -1,3 +1,17 @@
+2014-06-25  Jan Hubicka  <hubicka@ucw.cz>
+
+       * toplev.c (backend_init_target): Move init_emit_regs and init_regs to...
+       (backend_init) ... here; skip ira_init_once and backend_init_target.
+       (target_reinit) ... and here; clear this_target_rtl->lang_dependent_initialized.
+       (lang_dependent_init_target): Clear this_target_rtl->lang_dependent_initialized;
+       break out rtl initialization to ...
+       (initialize_rtl): ... here; call also backend_init_target and ira_init_once.
+       * toplev.h (initialize_rtl): New function.
+       * function.c: Include toplev.h
+       (init_function_start): Call initialize_rtl.
+       * rtl.h (target_rtl): Add target_specific_initialized,
+       lang_dependent_initialized.
+
 2014-06-25  Paul Gortmaker  <paul.gortmaker@windriver.com>
            Jakub Jelinek  <jakub@redhat.com>
 
index 441289e..001c579 100644 (file)
@@ -64,6 +64,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "params.h"
 #include "bb-reorder.h"
 #include "shrink-wrap.h"
+#include "toplev.h"
 
 /* So we can assign to cfun in this file.  */
 #undef cfun
@@ -4630,6 +4631,10 @@ init_function_start (tree subr)
     set_cfun (DECL_STRUCT_FUNCTION (subr));
   else
     allocate_struct_function (subr, false);
+
+  /* Initialize backend, if needed.  */
+  initialize_rtl ();
+
   prepare_function_start ();
   decide_function_section (subr);
 
index 6ec91a8..8eb215c 100644 (file)
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -2514,6 +2514,10 @@ struct GTY(()) target_rtl {
 
   /* The default memory attributes for each mode.  */
   struct mem_attrs *x_mode_mem_attrs[(int) MAX_MACHINE_MODE];
+
+  /* Track if RTL has been initialized.  */
+  bool target_specific_initialized;
+  bool lang_dependent_initialized;
 };
 
 extern GTY(()) struct target_rtl default_target_rtl;
index fcd0e43..e35b826 100644 (file)
@@ -1583,14 +1583,6 @@ backend_init_target (void)
   /* Initialize alignment variables.  */
   init_alignments ();
 
-  /* This reinitializes hard_frame_pointer, and calls init_reg_modes_target()
-     to initialize reg_raw_mode[].  */
-  init_emit_regs ();
-
-  /* This invokes target hooks to set fixed_reg[] etc, which is
-     mode-dependent.  */
-  init_regs ();
-
   /* This depends on stack_pointer_rtx.  */
   init_fake_stack_mems ();
 
@@ -1632,9 +1624,13 @@ backend_init (void)
   init_varasm_once ();
   save_register_info ();
 
-  /* Initialize the target-specific back end pieces.  */
-  ira_init_once ();
-  backend_init_target ();
+  /* Middle end needs this initialization for default mem attributes
+     used by early calls to make_decl_rtl.  */
+  init_emit_regs ();
+
+  /* Middle end needs this initialization for mode tables used to assign
+     modes to vector variables.  */
+  init_regs ();
 }
 
 /* Initialize excess precision settings.  */
@@ -1686,6 +1682,31 @@ lang_dependent_init_target (void)
      front end is initialized.  It also depends on the HAVE_xxx macros
      generated from the target machine description.  */
   init_optabs ();
+  this_target_rtl->lang_dependent_initialized = false;
+}
+
+/* Perform initializations that are lang-dependent or target-dependent.
+   but matters only for late optimizations and RTL generation.  */
+
+void
+initialize_rtl (void)
+{
+  static int initialized_once;
+
+  /* Initialization done just once per compilation, but delayed
+     till code generation.  */
+  if (!initialized_once)
+    ira_init_once ();
+  initialized_once = true;
+
+  /* Target specific RTL backend initialization.  */
+  if (!this_target_rtl->target_specific_initialized)
+    backend_init_target ();
+  this_target_rtl->target_specific_initialized = true;
+
+  if (this_target_rtl->lang_dependent_initialized)
+    return;
+  this_target_rtl->lang_dependent_initialized = true;
 
   /* The following initialization functions need to generate rtl, so
      provide a dummy function context for them.  */
@@ -1784,8 +1805,15 @@ target_reinit (void)
       regno_reg_rtx = NULL;
     }
 
-  /* Reinitialize RTL backend.  */
-  backend_init_target ();
+  this_target_rtl->target_specific_initialized = false;
+
+  /* This initializes hard_frame_pointer, and calls init_reg_modes_target()
+     to initialize reg_raw_mode[].  */
+  init_emit_regs ();
+
+  /* This invokes target hooks to set fixed_reg[] etc, which is
+     mode-dependent.  */
+  init_regs ();
 
   /* Reinitialize lang-dependent parts.  */
   lang_dependent_init_target ();
index 0290be3..1b54578 100644 (file)
@@ -77,4 +77,6 @@ extern bool set_src_pwd                      (const char *);
 extern HOST_WIDE_INT get_random_seed (bool);
 extern const char *set_random_seed (const char *);
 
+extern void initialize_rtl (void);
+
 #endif /* ! GCC_TOPLEV_H */