aboutsummaryrefslogtreecommitdiff
path: root/gcc/target-globals.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/target-globals.cc')
-rw-r--r--gcc/target-globals.cc147
1 files changed, 147 insertions, 0 deletions
diff --git a/gcc/target-globals.cc b/gcc/target-globals.cc
new file mode 100644
index 0000000..a49960f
--- /dev/null
+++ b/gcc/target-globals.cc
@@ -0,0 +1,147 @@
+/* Target-dependent globals.
+ Copyright (C) 2010-2022 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 "backend.h"
+#include "rtl.h"
+#include "tree.h"
+#include "expmed.h"
+#include "optabs-query.h"
+#include "insn-config.h"
+#include "regs.h"
+#include "memmodel.h"
+#include "ira.h"
+#include "ira-int.h"
+#include "toplev.h"
+#include "target-globals.h"
+#include "flags.h"
+#include "reload.h"
+#include "libfuncs.h"
+#include "cfgloop.h"
+#include "builtins.h"
+#include "gcse.h"
+#include "bb-reorder.h"
+#include "lower-subreg.h"
+#include "function-abi.h"
+
+#if SWITCHABLE_TARGET
+class target_globals default_target_globals = {
+ &default_target_flag_state,
+ &default_target_regs,
+ &default_target_rtl,
+ &default_target_recog,
+ &default_target_hard_regs,
+ &default_target_function_abi_info,
+ &default_target_reload,
+ &default_target_expmed,
+ &default_target_optabs,
+ &default_target_libfuncs,
+ &default_target_cfgloop,
+ &default_target_ira,
+ &default_target_ira_int,
+ &default_target_builtins,
+ &default_target_gcse,
+ &default_target_bb_reorder,
+ &default_target_lower_subreg
+};
+
+class target_globals *
+save_target_globals (void)
+{
+ class target_globals *g = ggc_cleared_alloc <target_globals> ();
+ g->flag_state = XCNEW (class target_flag_state);
+ g->regs = XCNEW (struct target_regs);
+ g->rtl = ggc_cleared_alloc<target_rtl> ();
+ g->recog = XCNEW (struct target_recog);
+ g->hard_regs = XCNEW (struct target_hard_regs);
+ g->function_abi_info = XCNEW (struct target_function_abi_info);
+ g->reload = XCNEW (struct target_reload);
+ g->expmed = XCNEW (struct target_expmed);
+ g->optabs = XCNEW (struct target_optabs);
+ g->libfuncs = ggc_cleared_alloc<target_libfuncs> ();
+ g->cfgloop = XCNEW (struct target_cfgloop);
+ g->ira = XCNEW (struct target_ira);
+ g->ira_int = XCNEW (class target_ira_int);
+ g->builtins = XCNEW (struct target_builtins);
+ g->gcse = XCNEW (struct target_gcse);
+ g->bb_reorder = XCNEW (struct target_bb_reorder);
+ g->lower_subreg = XCNEW (struct target_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. */
+
+class target_globals *
+save_target_globals_default_opts ()
+{
+ class 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, &global_options_set,
+ TREE_OPTIMIZATION (optimization_default_node));
+ globals = save_target_globals ();
+ optimization_current_node = opts;
+ cl_optimization_restore (&global_options, &global_options_set,
+ TREE_OPTIMIZATION (opts));
+ return globals;
+ }
+ return save_target_globals ();
+}
+
+target_globals::~target_globals ()
+{
+ /* default_target_globals points to static data so shouldn't be freed. */
+ if (this != &default_target_globals)
+ {
+ ira_int->~target_ira_int ();
+ hard_regs->finalize ();
+ XDELETE (flag_state);
+ XDELETE (regs);
+ XDELETE (recog);
+ XDELETE (hard_regs);
+ XDELETE (function_abi_info);
+ XDELETE (reload);
+ XDELETE (expmed);
+ XDELETE (optabs);
+ XDELETE (cfgloop);
+ XDELETE (ira);
+ XDELETE (ira_int);
+ XDELETE (builtins);
+ XDELETE (gcse);
+ XDELETE (bb_reorder);
+ XDELETE (lower_subreg);
+ }
+}
+
+#endif