2007-08-30 Sandra Loosemore <sandra@codesourcery.com>
authorsandra <sandra@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 31 Aug 2007 03:25:02 +0000 (03:25 +0000)
committersandra <sandra@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 31 Aug 2007 03:25:02 +0000 (03:25 +0000)
PR middle-end/33211

gcc/
* regclass.c (initial_fixed_regs): Revert previous change and make
it const again.
(initial_call_used_regs): Likewise.
(initial_call_really_used_regs): Delete, reverting previous addition.
(initial_reg_names): Likewise.
(init_reg_sets): Revert previous change.
(saved_fixed_regs): New.
(saved_call_used_regs): New.
(saved_call_really_used_regs): New.
(saved_reg_names): New.
(save_register_info): New.
(restore_register_info): New.
(init_reg_sets_1): Replace reset of register info with call to
restore_register_info.
* rtl.h (save_register_info): Declare.
* toplev.c (backend_init): Call save_register_info.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@127951 138bc75d-0d04-0410-961f-82ee72b054a4

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

index 03ee167..fa6bec8 100644 (file)
@@ -1,3 +1,24 @@
+2007-08-30  Sandra Loosemore  <sandra@codesourcery.com>
+
+       PR middle-end/33211
+
+       * regclass.c (initial_fixed_regs): Revert previous change and make
+       it const again.
+       (initial_call_used_regs): Likewise.
+       (initial_call_really_used_regs): Delete, reverting previous addition.
+       (initial_reg_names): Likewise.
+       (init_reg_sets): Revert previous change.
+       (saved_fixed_regs): New.
+       (saved_call_used_regs): New.
+       (saved_call_really_used_regs): New.
+       (saved_reg_names): New.
+       (save_register_info): New.
+       (restore_register_info): New.
+       (init_reg_sets_1): Replace reset of register info with call to
+       restore_register_info.
+       * rtl.h (save_register_info): Declare.
+       * toplev.c (backend_init): Call save_register_info.
+
 2007-08-30  Laurynas Biveinis  <laurynas.biveinis@gmail.com>
 
        * tree-ssa-propagate.c (set_rhs): Remove the copied annotation
index 689f91e..e54196c 100644 (file)
@@ -81,7 +81,7 @@ HARD_REG_SET fixed_reg_set;
 
 /* Data for initializing the above.  */
 
-static char initial_fixed_regs[] = FIXED_REGISTERS;
+static const char initial_fixed_regs[] = FIXED_REGISTERS;
 
 /* Indexed by hard register number, contains 1 for registers
    that are fixed use or are clobbered by function calls.
@@ -100,7 +100,7 @@ HARD_REG_SET losing_caller_save_reg_set;
 
 /* Data for initializing the above.  */
 
-static char initial_call_used_regs[] = CALL_USED_REGISTERS;
+static const char initial_call_used_regs[] = CALL_USED_REGISTERS;
 
 /* This is much like call_used_regs, except it doesn't have to
    be a superset of FIXED_REGISTERS. This vector indicates
@@ -108,8 +108,7 @@ static char initial_call_used_regs[] = CALL_USED_REGISTERS;
    regs_invalidated_by_call.  */
 
 #ifdef CALL_REALLY_USED_REGISTERS
-static char initial_call_really_used_regs[] = CALL_REALLY_USED_REGISTERS;
-char call_really_used_regs[FIRST_PSEUDO_REGISTER];
+char call_really_used_regs[] = CALL_REALLY_USED_REGISTERS;
 #endif
 
 #ifdef CALL_REALLY_USED_REGISTERS
@@ -193,11 +192,7 @@ enum reg_class reg_class_superunion[N_REG_CLASSES][N_REG_CLASSES];
 
 /* Array containing all of the register names.  */
 
-const char * reg_names[FIRST_PSEUDO_REGISTER];
-
-/* Data for initializing the above.  */
-
-const char * initial_reg_names[] = REGISTER_NAMES;
+const char * reg_names[] = REGISTER_NAMES;
 
 /* Array containing all of the register class names.  */
 
@@ -306,12 +301,14 @@ init_reg_sets (void)
          SET_HARD_REG_BIT (reg_class_contents[i], j);
     }
 
-  memset (global_regs, 0, sizeof global_regs);
+  /* Sanity check: make sure the target macros FIXED_REGISTERS and
+     CALL_USED_REGISTERS had the right number of initializers.  */
+  gcc_assert (sizeof fixed_regs == sizeof initial_fixed_regs);
+  gcc_assert (sizeof call_used_regs == sizeof initial_call_used_regs);
 
-  /* Processing of command-line options like -ffixed needs to know the
-     initial set of register names, so initialize that now.  */
-  gcc_assert (sizeof reg_names == sizeof initial_reg_names);
-  memcpy (reg_names, initial_reg_names, sizeof reg_names);
+  memcpy (fixed_regs, initial_fixed_regs, sizeof fixed_regs);
+  memcpy (call_used_regs, initial_call_used_regs, sizeof call_used_regs);
+  memset (global_regs, 0, sizeof global_regs);
 }
 
 /* Initialize may_move_cost and friends for mode M.  */
@@ -403,34 +400,68 @@ init_move_cost (enum machine_mode m)
        }
 }
 
-/* After switches have been processed, which perhaps alter
-   `fixed_regs' and `call_used_regs', convert them to HARD_REG_SETs.  */
+/* We need to save copies of some of the register information which
+   can be munged by command-line switches so we can restore it during
+   subsequent back-end reinitialization.  */
 
-static void
-init_reg_sets_1 (void)
-{
-  unsigned int i, j;
-  unsigned int /* enum machine_mode */ m;
+static char saved_fixed_regs[FIRST_PSEUDO_REGISTER];
+static char saved_call_used_regs[FIRST_PSEUDO_REGISTER];
+#ifdef CALL_REALLY_USED_REGISTERS
+static char saved_call_really_used_regs[FIRST_PSEUDO_REGISTER];
+#endif
+static const char *saved_reg_names[FIRST_PSEUDO_REGISTER];
+
+/* Save the register information.  */
 
+void
+save_register_info (void)
+{
   /* Sanity check:  make sure the target macros FIXED_REGISTERS and
      CALL_USED_REGISTERS had the right number of initializers.  */
-  gcc_assert (sizeof fixed_regs == sizeof initial_fixed_regs);
-  gcc_assert (sizeof call_used_regs == sizeof initial_call_used_regs);
-
-  memcpy (fixed_regs, initial_fixed_regs, sizeof fixed_regs);
-  memcpy (call_used_regs, initial_call_used_regs, sizeof call_used_regs);
+  gcc_assert (sizeof fixed_regs == sizeof saved_fixed_regs);
+  gcc_assert (sizeof call_used_regs == sizeof saved_call_used_regs);
+  memcpy (saved_fixed_regs, fixed_regs, sizeof fixed_regs);
+  memcpy (saved_call_used_regs, call_used_regs, sizeof call_used_regs);
 
   /* Likewise for call_really_used_regs.  */
 #ifdef CALL_REALLY_USED_REGISTERS
   gcc_assert (sizeof call_really_used_regs
-             == sizeof initial_call_really_used_regs);
-  memcpy (call_really_used_regs, initial_call_really_used_regs,
+             == sizeof saved_call_really_used_regs);
+  memcpy (saved_call_really_used_regs, call_really_used_regs,
          sizeof call_really_used_regs);
 #endif
 
   /* And similarly for reg_names.  */
-  gcc_assert (sizeof reg_names == sizeof initial_reg_names);
-  memcpy (reg_names, initial_reg_names, sizeof reg_names);
+  gcc_assert (sizeof reg_names == sizeof saved_reg_names);
+  memcpy (saved_reg_names, reg_names, sizeof reg_names);
+}
+
+/* Restore the register information.  */
+
+static void
+restore_register_info (void)
+{
+  memcpy (fixed_regs, saved_fixed_regs, sizeof fixed_regs);
+  memcpy (call_used_regs, saved_call_used_regs, sizeof call_used_regs);
+
+#ifdef CALL_REALLY_USED_REGISTERS
+  memcpy (call_really_used_regs, saved_call_really_used_regs,
+         sizeof call_really_used_regs);
+#endif
+
+  memcpy (reg_names, saved_reg_names, sizeof reg_names);
+}
+
+/* After switches have been processed, which perhaps alter
+   `fixed_regs' and `call_used_regs', convert them to HARD_REG_SETs.  */
+
+static void
+init_reg_sets_1 (void)
+{
+  unsigned int i, j;
+  unsigned int /* enum machine_mode */ m;
+
+  restore_register_info ();
 
 #ifdef REG_ALLOC_ORDER
   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
@@ -846,11 +877,11 @@ fix_register (const char *name, int fixed, int call_used)
        }
       else
        {
-         initial_fixed_regs[i] = fixed;
-         initial_call_used_regs[i] = call_used;
+         fixed_regs[i] = fixed;
+         call_used_regs[i] = call_used;
 #ifdef CALL_REALLY_USED_REGISTERS
          if (fixed == 0)
-           initial_call_really_used_regs[i] = call_used;
+           call_really_used_regs[i] = call_used;
 #endif
        }
     }
index 8599658..5484df1 100644 (file)
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -2190,6 +2190,7 @@ extern void globalize_reg (int);
 extern void init_reg_modes_target (void);
 extern void init_regs (void);
 extern void init_fake_stack_mems (void);
+extern void save_register_info (void);
 extern void init_reg_sets (void);
 extern void regclass (rtx, int);
 extern void reg_scan (rtx, unsigned int);
index fe7918f..31d8c5f 100644 (file)
@@ -2064,6 +2064,7 @@ backend_init (void)
   init_rtlanal ();
   init_inline_once ();
   init_varasm_once ();
+  save_register_info ();
 
   /* Initialize the target-specific back end pieces.  */
   backend_init_target ();