Patchwork [27/27] Use *_target_globals for MIPS

login
register
mail settings
Submitter Richard Sandiford
Date July 7, 2010, 9:48 p.m.
Message ID <87tyobq7z0.fsf@firetop.home>
Download mbox | patch
Permalink /patch/58198/
State New
Headers show

Comments

Richard Sandiford - July 7, 2010, 9:48 p.m.
Here's the MIPS patch that actually makes use of all this stuff.
(Note that the default target is always non-MIPS16, even if
-mips16 is passed on the command line.)

Richard


gcc/
	* config/mips/mips.h (mips16_globals): Declare.
	(SWITCHABLE_TARGET): Define.
	* config/mips/mips.c: Include target-globals.h.
	(mips16_globals): New variable.
	(mips_set_mips16_mode): Use save_target_globals and
	restore_target_globals instead of target_reinit.
Richard Henderson - July 7, 2010, 10:41 p.m.
Overall I think this series is good.  I pointed out two
problems with the conversion.  With those fixed, I think
the series could go in.


r~

Patch

Index: gcc/config/mips/mips.h
===================================================================
--- gcc/config/mips/mips.h	2010-07-04 22:48:27.000000000 +0100
+++ gcc/config/mips/mips.h	2010-07-07 22:46:45.000000000 +0100
@@ -3025,6 +3025,7 @@  struct mips_asm_switch {
 extern const struct mips_rtx_cost_data *mips_cost;
 extern bool mips_base_mips16;
 extern enum mips_code_readable_setting mips_code_readable;
+extern GTY(()) struct target_globals *mips16_globals;
 #endif
 
 /* Enable querying of DFA units.  */
@@ -3059,3 +3060,6 @@  #define FINAL_PRESCAN_INSN(INSN, OPVEC,
    support this feature.  */
 #define ASM_PREFERRED_EH_DATA_FORMAT(CODE,GLOBAL) \
   (((GLOBAL) ? DW_EH_PE_indirect : 0) | DW_EH_PE_absptr)
+
+/* For switching between MIPS16 and non-MIPS16 modes.  */
+#define SWITCHABLE_TARGET 1
Index: gcc/config/mips/mips.c
===================================================================
--- gcc/config/mips/mips.c	2010-07-04 22:48:27.000000000 +0100
+++ gcc/config/mips/mips.c	2010-07-07 22:46:45.000000000 +0100
@@ -58,6 +58,7 @@  the Free Software Foundation; either ver
 #include "gimple.h"
 #include "bitmap.h"
 #include "diagnostic.h"
+#include "target-globals.h"
 
 /* True if X is an UNSPEC wrapper around a SYMBOL_REF or LABEL_REF.  */
 #define UNSPEC_ADDRESS_P(X)					\
@@ -568,6 +569,9 @@  static GTY (()) int mips_output_filename
 /* Likewise for HIGHs.  */
 static const char *mips_hi_relocs[NUM_SYMBOL_TYPES];
 
+/* Target state for MIPS16.  */
+struct target_globals *mips16_globals;
+
 /* Index R is the smallest register class that contains register R.  */
 const enum reg_class mips_regno_to_class[FIRST_PSEUDO_REGISTER] = {
   LEA_REGS,	LEA_REGS,	M16_REGS,	V1_REG,
@@ -15200,9 +15204,15 @@  mips_set_mips16_mode (int mips16_p)
   /* (Re)initialize MIPS target internals for new ISA.  */
   mips_init_relocs ();
 
-  if (was_mips16_p >= 0 || was_mips16_pch_p >= 0)
-    /* Reinitialize target-dependent state.  */
-    target_reinit ();
+  if (mips16_p)
+    {
+      if (!mips16_globals)
+	mips16_globals = save_target_globals ();
+      else
+	restore_target_globals (mips16_globals);
+    }
+  else
+    restore_target_globals (&default_target_globals);
 
   was_mips16_p = mips16_p;
   was_mips16_pch_p = mips16_p;