aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Sandiford <rdsandiford@googlemail.com>2010-07-12 19:04:36 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2010-07-12 19:04:36 +0000
commit5aa62249ce9cad9a0897e801fcdff781cc335116 (patch)
tree6c43689f637c9b183fc04e1d15a2b5fb0ab552e8 /gcc
parent77f558794e5ab9a012c7231c799603ba73cc41cd (diff)
downloadgcc-5aa62249ce9cad9a0897e801fcdff781cc335116.zip
gcc-5aa62249ce9cad9a0897e801fcdff781cc335116.tar.gz
gcc-5aa62249ce9cad9a0897e801fcdff781cc335116.tar.bz2
mips.h (mips16_globals): Declare.
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. From-SVN: r162111
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/config/mips/mips.c16
-rw-r--r--gcc/config/mips/mips.h4
3 files changed, 26 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 0f2a7de..b8a7756 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,14 @@
2010-07-12 Richard Sandiford <rdsandiford@googlemail.com>
+ * 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.
+
+2010-07-12 Richard Sandiford <rdsandiford@googlemail.com>
+
* reginfo.c (init_reg_sets): Don't zero globals here. Update comment
to say that the function can be called more than once.
* target-globals.c (save_target_globals): Call init_reg_sets.
diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c
index ccdfbbc..5fb2fc0 100644
--- a/gcc/config/mips/mips.c
+++ b/gcc/config/mips/mips.c
@@ -58,6 +58,7 @@ along with GCC; see the file COPYING3. If not see
#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 const char *mips_lo_relocs[NUM_SYMBOL_TYPES];
/* 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;
diff --git a/gcc/config/mips/mips.h b/gcc/config/mips/mips.h
index ea79eba..a75cd57 100644
--- a/gcc/config/mips/mips.h
+++ b/gcc/config/mips/mips.h
@@ -3025,6 +3025,7 @@ extern const struct mips_cpu_info *mips_tune_info;
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 @@ extern enum mips_code_readable_setting mips_code_readable;
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