aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.9/gcc/target-globals.c
diff options
context:
space:
mode:
authorBen Cheng <bccheng@google.com>2014-03-25 22:37:19 -0700
committerBen Cheng <bccheng@google.com>2014-03-25 22:37:19 -0700
commit1bc5aee63eb72b341f506ad058502cd0361f0d10 (patch)
treec607e8252f3405424ff15bc2d00aa38dadbb2518 /gcc-4.9/gcc/target-globals.c
parent283a0bf58fcf333c58a2a92c3ebbc41fb9eb1fdb (diff)
downloadtoolchain_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.c136
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