diff options
author | Ben Cheng <bccheng@google.com> | 2014-03-25 22:37:19 -0700 |
---|---|---|
committer | Ben Cheng <bccheng@google.com> | 2014-03-25 22:37:19 -0700 |
commit | 1bc5aee63eb72b341f506ad058502cd0361f0d10 (patch) | |
tree | c607e8252f3405424ff15bc2d00aa38dadbb2518 /gcc-4.9/gcc/target-globals.c | |
parent | 283a0bf58fcf333c58a2a92c3ebbc41fb9eb1fdb (diff) | |
download | toolchain_gcc-1bc5aee63eb72b341f506ad058502cd0361f0d10.tar.gz toolchain_gcc-1bc5aee63eb72b341f506ad058502cd0361f0d10.tar.bz2 toolchain_gcc-1bc5aee63eb72b341f506ad058502cd0361f0d10.zip |
Initial checkin of GCC 4.9.0 from trunk (r208799).
Change-Id: I48a3c08bb98542aa215912a75f03c0890e497dba
Diffstat (limited to 'gcc-4.9/gcc/target-globals.c')
-rw-r--r-- | gcc-4.9/gcc/target-globals.c | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/gcc-4.9/gcc/target-globals.c b/gcc-4.9/gcc/target-globals.c new file mode 100644 index 000000000..7cf95aeed --- /dev/null +++ b/gcc-4.9/gcc/target-globals.c @@ -0,0 +1,136 @@ +/* Target-dependent globals. + Copyright (C) 2010-2014 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 "tree.h" +#include "ggc.h" +#include "toplev.h" +#include "target-globals.h" +#include "flags.h" +#include "regs.h" +#include "rtl.h" +#include "hard-reg-set.h" +#include "reload.h" +#include "expmed.h" +#include "expr.h" +#include "optabs.h" +#include "libfuncs.h" +#include "cfgloop.h" +#include "ira-int.h" +#include "lra-int.h" +#include "builtins.h" +#include "gcse.h" +#include "bb-reorder.h" +#include "lower-subreg.h" + +#if SWITCHABLE_TARGET +struct target_globals default_target_globals = { + &default_target_flag_state, + &default_target_regs, + &default_target_rtl, + &default_target_hard_regs, + &default_target_reload, + &default_target_expmed, + &default_target_optabs, + &default_target_libfuncs, + &default_target_cfgloop, + &default_target_ira, + &default_target_ira_int, + &default_target_lra_int, + &default_target_builtins, + &default_target_gcse, + &default_target_bb_reorder, + &default_target_lower_subreg +}; + +struct target_globals * +save_target_globals (void) +{ + struct target_globals *g; + struct target_globals_extra { + struct target_globals g; + struct target_flag_state flag_state; + struct target_optabs optabs; + struct target_cfgloop cfgloop; + struct target_builtins builtins; + struct target_gcse gcse; + struct target_bb_reorder bb_reorder; + struct target_lower_subreg lower_subreg; + } *p; + p = (struct target_globals_extra *) + ggc_internal_cleared_alloc (sizeof (struct target_globals_extra)); + g = (struct target_globals *) p; + g->flag_state = &p->flag_state; + g->regs = ggc_internal_cleared_alloc (sizeof (struct target_regs)); + g->rtl = ggc_alloc_cleared_target_rtl (); + g->hard_regs + = ggc_internal_cleared_alloc (sizeof (struct target_hard_regs)); + g->reload = ggc_internal_cleared_alloc (sizeof (struct target_reload)); + g->expmed = ggc_internal_cleared_alloc (sizeof (struct target_expmed)); + g->optabs = &p->optabs; + g->libfuncs = ggc_alloc_cleared_target_libfuncs (); + g->cfgloop = &p->cfgloop; + g->ira = ggc_internal_cleared_alloc (sizeof (struct target_ira)); + g->ira_int = ggc_internal_cleared_alloc (sizeof (struct target_ira_int)); + g->lra_int = ggc_internal_cleared_alloc (sizeof (struct target_lra_int)); + g->builtins = &p->builtins; + g->gcse = &p->gcse; + g->bb_reorder = &p->bb_reorder; + g->lower_subreg = &p->lower_subreg; + restore_target_globals (g); + init_reg_sets (); + target_reinit (); + return g; +} + +/* Like save_target_globals() above, but set *this_target_optabs + correctly when a previous function has changed + *this_target_optabs. */ + +struct target_globals * +save_target_globals_default_opts () +{ + struct target_globals *globals; + + if (optimization_current_node != optimization_default_node) + { + tree opts = optimization_current_node; + /* Temporarily switch to the default optimization node, so that + *this_target_optabs is set to the default, not reflecting + whatever a previous function used for the optimize + attribute. */ + optimization_current_node = optimization_default_node; + cl_optimization_restore + (&global_options, + TREE_OPTIMIZATION (optimization_default_node)); + globals = save_target_globals (); + optimization_current_node = opts; + cl_optimization_restore (&global_options, + TREE_OPTIMIZATION (opts)); + return globals; + } + return save_target_globals (); +} + +#endif |