Commit 3bd36029 by Richard Sandiford Committed by Richard Sandiford

tm.texi.in (SWITCHABLE_TARGET): Document.

gcc/
	* doc/tm.texi.in (SWITCHABLE_TARGET): Document.
	* doc/tm.texi: Regenerate.
	* Makefile.in (OBJS-common): Add target-globals.o.
	(gtype-desc.o): Depend on $(IPA_PROP_H), $(LTO_STREAMER_H)
	and target-globals.h.
	(target-globals.o): New rule.
	(GTFILES): Include $(srcdir)/target-globals.h.
	* defaults.h (SWITCHABLE_TARGET): Define.
	* gengtype.c (open_base_files): Add target-globals.h to the
	list of includes.
	* target-globals.h: New file.
	* target-globals.c: Likewise.

	* Makefile.in (target-globals.o): Depend on $(FLAGS_H).
	* flags.h (target_flag_state): New structure.
	(default_target_flag_state): Declare.
	(this_target_flag_state): Declare as a variable or define as a macro.
	(align_loops_log): Redefine as a macro.
	(align_loops_max_skip, align_jumps_log): Likewise.
	(align_jumps_max_skip, align_labels_log): Likewise.
	(align_labels_max_skip, align_functions_log): Likewise.
	* toplev.c (default_target_flag_state): New variable.
	(this_target_flag_state): New conditional variable.
	(align_loops_log): Delete.
	(align_loops_max_skip, align_jumps_log): Likewise.
	(align_jumps_max_skip, align_labels_log): Likewise.
	(align_labels_max_skip, align_functions_log): Likewise.
	* target-globals.h (this_target_flag_state): Declare.
	(target_globals): Add a flag_state field.
	(restore_target_globals): Copy the flag_state field to
	this_target_flag_state.
	* target-globals.c: Include flags.h.
	(default_target_globals): Initialize the flag_state field.
	(save_target_globals): Likewise.

From-SVN: r162086
parent 7beb0596
2010-07-12 Richard Sandiford <rdsandiford@googlemail.com>
* doc/tm.texi.in (SWITCHABLE_TARGET): Document.
* doc/tm.texi: Regenerate.
* Makefile.in (OBJS-common): Add target-globals.o.
(gtype-desc.o): Depend on $(IPA_PROP_H), $(LTO_STREAMER_H)
and target-globals.h.
(target-globals.o): New rule.
(GTFILES): Include $(srcdir)/target-globals.h.
* defaults.h (SWITCHABLE_TARGET): Define.
* gengtype.c (open_base_files): Add target-globals.h to the
list of includes.
* target-globals.h: New file.
* target-globals.c: Likewise.
* Makefile.in (target-globals.o): Depend on $(FLAGS_H).
* flags.h (target_flag_state): New structure.
(default_target_flag_state): Declare.
(this_target_flag_state): Declare as a variable or define as a macro.
(align_loops_log): Redefine as a macro.
(align_loops_max_skip, align_jumps_log): Likewise.
(align_jumps_max_skip, align_labels_log): Likewise.
(align_labels_max_skip, align_functions_log): Likewise.
* toplev.c (default_target_flag_state): New variable.
(this_target_flag_state): New conditional variable.
(align_loops_log): Delete.
(align_loops_max_skip, align_jumps_log): Likewise.
(align_jumps_max_skip, align_labels_log): Likewise.
(align_labels_max_skip, align_functions_log): Likewise.
* target-globals.h (this_target_flag_state): Declare.
(target_globals): Add a flag_state field.
(restore_target_globals): Copy the flag_state field to
this_target_flag_state.
* target-globals.c: Include flags.h.
(default_target_globals): Initialize the flag_state field.
(save_target_globals): Likewise.
2010-07-12 Jie Zhang <jie@codesourcery.com> 2010-07-12 Jie Zhang <jie@codesourcery.com>
* postreload.c (reg_symbol_ref[]): New. * postreload.c (reg_symbol_ref[]): New.
......
...@@ -1337,6 +1337,7 @@ OBJS-common = \ ...@@ -1337,6 +1337,7 @@ OBJS-common = \
stor-layout.o \ stor-layout.o \
store-motion.o \ store-motion.o \
stringpool.o \ stringpool.o \
target-globals.o \
targhooks.o \ targhooks.o \
timevar.o \ timevar.o \
toplev.o \ toplev.o \
...@@ -2249,7 +2250,8 @@ gtype-desc.o: gtype-desc.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \ ...@@ -2249,7 +2250,8 @@ gtype-desc.o: gtype-desc.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \
hard-reg-set.h $(BASIC_BLOCK_H) cselib.h $(INSN_ADDR_H) $(OPTABS_H) \ hard-reg-set.h $(BASIC_BLOCK_H) cselib.h $(INSN_ADDR_H) $(OPTABS_H) \
libfuncs.h debug.h $(GGC_H) $(CGRAPH_H) $(TREE_FLOW_H) reload.h \ libfuncs.h debug.h $(GGC_H) $(CGRAPH_H) $(TREE_FLOW_H) reload.h \
$(CPP_ID_DATA_H) tree-chrec.h $(CFGLAYOUT_H) $(EXCEPT_H) output.h \ $(CPP_ID_DATA_H) tree-chrec.h $(CFGLAYOUT_H) $(EXCEPT_H) output.h \
$(CFGLOOP_H) $(TARGET_H) $(CFGLOOP_H) $(TARGET_H) $(IPA_PROP_H) $(LTO_STREAMER_H) \
target-globals.h
ggc-common.o: ggc-common.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \ ggc-common.o: ggc-common.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
$(GGC_H) $(HASHTAB_H) $(TOPLEV_H) $(DIAGNOSTIC_CORE_H) $(PARAMS_H) hosthooks.h \ $(GGC_H) $(HASHTAB_H) $(TOPLEV_H) $(DIAGNOSTIC_CORE_H) $(PARAMS_H) hosthooks.h \
...@@ -3473,6 +3475,9 @@ lower-subreg.o : lower-subreg.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \ ...@@ -3473,6 +3475,9 @@ lower-subreg.o : lower-subreg.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
$(MACHMODE_H) $(TM_H) $(RTL_H) $(TM_P_H) $(TIMEVAR_H) $(FLAGS_H) \ $(MACHMODE_H) $(TM_H) $(RTL_H) $(TM_P_H) $(TIMEVAR_H) $(FLAGS_H) \
insn-config.h $(BASIC_BLOCK_H) $(RECOG_H) $(OBSTACK_H) $(BITMAP_H) \ insn-config.h $(BASIC_BLOCK_H) $(RECOG_H) $(OBSTACK_H) $(BITMAP_H) \
$(EXPR_H) $(EXCEPT_H) $(REGS_H) $(TREE_PASS_H) $(DF_H) $(EXPR_H) $(EXCEPT_H) $(REGS_H) $(TREE_PASS_H) $(DF_H)
target-globals.o : target-globals.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
$(TM_H) insn-config.h $(MACHMODE_H) $(GGC_H) $(TOPLEV_H) target-globals.h \
$(FLAGS_H)
$(out_object_file): $(out_file) $(CONFIG_H) coretypes.h $(TM_H) $(TREE_H) \ $(out_object_file): $(out_file) $(CONFIG_H) coretypes.h $(TM_H) $(TREE_H) \
$(RTL_H) $(REGS_H) hard-reg-set.h insn-config.h conditions.h \ $(RTL_H) $(REGS_H) hard-reg-set.h insn-config.h conditions.h \
...@@ -3750,6 +3755,7 @@ GTFILES = $(CPP_ID_DATA_H) $(srcdir)/input.h $(srcdir)/coretypes.h \ ...@@ -3750,6 +3755,7 @@ GTFILES = $(CPP_ID_DATA_H) $(srcdir)/input.h $(srcdir)/coretypes.h \
$(srcdir)/tree-ssa-alias.h \ $(srcdir)/tree-ssa-alias.h \
$(srcdir)/ipa-prop.h \ $(srcdir)/ipa-prop.h \
$(srcdir)/lto-streamer.h \ $(srcdir)/lto-streamer.h \
$(srcdir)/target-globals.h \
@all_gtfiles@ @all_gtfiles@
# Compute the list of GT header files from the corresponding C sources, # Compute the list of GT header files from the corresponding C sources,
......
...@@ -1372,6 +1372,10 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see ...@@ -1372,6 +1372,10 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
#define STACK_CHECK_MAX_VAR_SIZE (STACK_CHECK_MAX_FRAME_SIZE / 100) #define STACK_CHECK_MAX_VAR_SIZE (STACK_CHECK_MAX_FRAME_SIZE / 100)
#endif #endif
#ifndef SWITCHABLE_TARGET
#define SWITCHABLE_TARGET 0
#endif
#endif /* GCC_INSN_FLAGS_H */ #endif /* GCC_INSN_FLAGS_H */
#endif /* ! GCC_DEFAULTS_H */ #endif /* ! GCC_DEFAULTS_H */
...@@ -842,6 +842,25 @@ pointer. If this macro is defined, GCC will turn on the ...@@ -842,6 +842,25 @@ pointer. If this macro is defined, GCC will turn on the
@option{-fomit-frame-pointer} option whenever @option{-O} is specified. @option{-fomit-frame-pointer} option whenever @option{-O} is specified.
@end defmac @end defmac
@defmac SWITCHABLE_TARGET
Some targets need to switch between substantially different subtargets
during compilation. For example, the MIPS target has one subtarget for
the traditional MIPS architecture and another for MIPS16. Source code
can switch between these two subarchitectures using the @code{mips16}
and @code{nomips16} attributes.
Such subtargets can differ in things like the set of available
registers, the set of available instructions, the costs of various
operations, and so on. GCC caches a lot of this type of information
in global variables, and recomputing them for each subtarget takes a
significant amount of time. The compiler therefore provides a facility
for maintaining several versions of the global variables and quickly
switching between them; see @file{target-globals.h} for details.
Define this macro to 1 if your target needs this facility. The default
is 0.
@end defmac
@node Per-Function Data @node Per-Function Data
@section Defining data structures for per-function information. @section Defining data structures for per-function information.
@cindex per-function data @cindex per-function data
......
...@@ -842,6 +842,25 @@ pointer. If this macro is defined, GCC will turn on the ...@@ -842,6 +842,25 @@ pointer. If this macro is defined, GCC will turn on the
@option{-fomit-frame-pointer} option whenever @option{-O} is specified. @option{-fomit-frame-pointer} option whenever @option{-O} is specified.
@end defmac @end defmac
@defmac SWITCHABLE_TARGET
Some targets need to switch between substantially different subtargets
during compilation. For example, the MIPS target has one subtarget for
the traditional MIPS architecture and another for MIPS16. Source code
can switch between these two subarchitectures using the @code{mips16}
and @code{nomips16} attributes.
Such subtargets can differ in things like the set of available
registers, the set of available instructions, the costs of various
operations, and so on. GCC caches a lot of this type of information
in global variables, and recomputing them for each subtarget takes a
significant amount of time. The compiler therefore provides a facility
for maintaining several versions of the global variables and quickly
switching between them; see @file{target-globals.h} for details.
Define this macro to 1 if your target needs this facility. The default
is 0.
@end defmac
@node Per-Function Data @node Per-Function Data
@section Defining data structures for per-function information. @section Defining data structures for per-function information.
@cindex per-function data @cindex per-function data
......
...@@ -239,6 +239,43 @@ extern enum excess_precision flag_excess_precision; ...@@ -239,6 +239,43 @@ extern enum excess_precision flag_excess_precision;
/* Other basic status info about current function. */ /* Other basic status info about current function. */
/* Target-dependent global state. */
struct target_flag_state {
/* Values of the -falign-* flags: how much to align labels in code.
0 means `use default', 1 means `don't align'.
For each variable, there is an _log variant which is the power
of two not less than the variable, for .align output. */
int x_align_loops_log;
int x_align_loops_max_skip;
int x_align_jumps_log;
int x_align_jumps_max_skip;
int x_align_labels_log;
int x_align_labels_max_skip;
int x_align_functions_log;
};
extern struct target_flag_state default_target_flag_state;
#if SWITCHABLE_TARGET
extern struct target_flag_state *this_target_flag_state;
#else
#define this_target_flag_state (&default_target_flag_state)
#endif
#define align_loops_log \
(this_target_flag_state->x_align_loops_log)
#define align_loops_max_skip \
(this_target_flag_state->x_align_loops_max_skip)
#define align_jumps_log \
(this_target_flag_state->x_align_jumps_log)
#define align_jumps_max_skip \
(this_target_flag_state->x_align_jumps_max_skip)
#define align_labels_log \
(this_target_flag_state->x_align_labels_log)
#define align_labels_max_skip \
(this_target_flag_state->x_align_labels_max_skip)
#define align_functions_log \
(this_target_flag_state->x_align_functions_log)
/* Nonzero if subexpressions must be evaluated from left-to-right. */ /* Nonzero if subexpressions must be evaluated from left-to-right. */
extern int flag_evaluation_order; extern int flag_evaluation_order;
...@@ -252,19 +289,6 @@ extern bool sel_sched_switch_set; ...@@ -252,19 +289,6 @@ extern bool sel_sched_switch_set;
/* Whether to run the warn_unused_result attribute pass. */ /* Whether to run the warn_unused_result attribute pass. */
extern bool flag_warn_unused_result; extern bool flag_warn_unused_result;
/* Values of the -falign-* flags: how much to align labels in code.
0 means `use default', 1 means `don't align'.
For each variable, there is an _log variant which is the power
of two not less than the variable, for .align output. */
extern int align_loops_log;
extern int align_loops_max_skip;
extern int align_jumps_log;
extern int align_jumps_max_skip;
extern int align_labels_log;
extern int align_labels_max_skip;
extern int align_functions_log;
/* Nonzero if we dump in VCG format, not plain text. */ /* Nonzero if we dump in VCG format, not plain text. */
extern int dump_for_graph; extern int dump_for_graph;
......
...@@ -1571,7 +1571,7 @@ open_base_files (void) ...@@ -1571,7 +1571,7 @@ open_base_files (void)
"optabs.h", "libfuncs.h", "debug.h", "ggc.h", "cgraph.h", "optabs.h", "libfuncs.h", "debug.h", "ggc.h", "cgraph.h",
"tree-flow.h", "reload.h", "cpp-id-data.h", "tree-chrec.h", "tree-flow.h", "reload.h", "cpp-id-data.h", "tree-chrec.h",
"cfglayout.h", "except.h", "output.h", "gimple.h", "cfgloop.h", "cfglayout.h", "except.h", "output.h", "gimple.h", "cfgloop.h",
"target.h", "ipa-prop.h", "lto-streamer.h", NULL "target.h", "ipa-prop.h", "lto-streamer.h", "target-globals.h", NULL
}; };
const char *const *ifp; const char *const *ifp;
outf_p gtype_desc_c; outf_p gtype_desc_c;
......
/* Target-dependent globals.
Copyright (C) 2010 Free Software Foundation, Inc.
This file is part of GCC.
GCC is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 3, or (at your option) any later
version.
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with GCC; see the file COPYING3. If not see
<http://www.gnu.org/licenses/>. */
#include "config.h"
#include "system.h"
#include "coretypes.h"
#include "tm.h"
#include "insn-config.h"
#include "machmode.h"
#include "ggc.h"
#include "toplev.h"
#include "target-globals.h"
#include "flags.h"
#if SWITCHABLE_TARGET
struct target_globals default_target_globals = {
&default_target_flag_state
};
struct target_globals *
save_target_globals (void)
{
struct target_globals *g;
g = ggc_alloc_target_globals ();
g->flag_state = XCNEW (struct target_flag_state);
restore_target_globals (g);
target_reinit ();
return g;
}
#endif
/* Target-dependent globals.
Copyright (C) 2010 Free Software Foundation, Inc.
This file is part of GCC.
GCC is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 3, or (at your option) any later
version.
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with GCC; see the file COPYING3. If not see
<http://www.gnu.org/licenses/>. */
#ifndef TARGET_GLOBALS_H
#define TARGET_GLOBALS_H 1
#if SWITCHABLE_TARGET
extern struct target_flag_state *this_target_flag_state;
struct GTY(()) target_globals {
struct target_flag_state *GTY((skip)) flag_state;
};
extern struct target_globals default_target_globals;
extern struct target_globals *save_target_globals (void);
static inline void
restore_target_globals (struct target_globals *g)
{
this_target_flag_state = g->flag_state;
}
#endif
#endif
...@@ -317,18 +317,12 @@ enum stack_check_type flag_stack_check = NO_STACK_CHECK; ...@@ -317,18 +317,12 @@ enum stack_check_type flag_stack_check = NO_STACK_CHECK;
bool user_defined_section_attribute = false; bool user_defined_section_attribute = false;
/* Values of the -falign-* flags: how much to align labels in code. struct target_flag_state default_target_flag_state;
0 means `use default', 1 means `don't align'. #if SWITCHABLE_TARGET
For each variable, there is an _log variant which is the power struct target_flag_state *this_target_flag_state = &default_target_flag_state;
of two not less than the variable, for .align output. */ #else
#define this_target_flag_state (&default_target_flag_state)
int align_loops_log; #endif
int align_loops_max_skip;
int align_jumps_log;
int align_jumps_max_skip;
int align_labels_log;
int align_labels_max_skip;
int align_functions_log;
typedef struct typedef struct
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment