xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/target-globals.c (revision 8feb0f0b7eaff0608f8350bbfa3098827b4bb91b)
11debfc3dSmrg /* Target-dependent globals.
2*8feb0f0bSmrg    Copyright (C) 2010-2020 Free Software Foundation, Inc.
31debfc3dSmrg 
41debfc3dSmrg This file is part of GCC.
51debfc3dSmrg 
61debfc3dSmrg GCC is free software; you can redistribute it and/or modify it under
71debfc3dSmrg the terms of the GNU General Public License as published by the Free
81debfc3dSmrg Software Foundation; either version 3, or (at your option) any later
91debfc3dSmrg version.
101debfc3dSmrg 
111debfc3dSmrg GCC is distributed in the hope that it will be useful, but WITHOUT ANY
121debfc3dSmrg WARRANTY; without even the implied warranty of MERCHANTABILITY or
131debfc3dSmrg FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
141debfc3dSmrg for more details.
151debfc3dSmrg 
161debfc3dSmrg You should have received a copy of the GNU General Public License
171debfc3dSmrg along with GCC; see the file COPYING3.  If not see
181debfc3dSmrg <http://www.gnu.org/licenses/>.  */
191debfc3dSmrg 
201debfc3dSmrg #include "config.h"
211debfc3dSmrg #include "system.h"
221debfc3dSmrg #include "coretypes.h"
231debfc3dSmrg #include "backend.h"
241debfc3dSmrg #include "rtl.h"
251debfc3dSmrg #include "tree.h"
261debfc3dSmrg #include "expmed.h"
271debfc3dSmrg #include "optabs-query.h"
281debfc3dSmrg #include "insn-config.h"
291debfc3dSmrg #include "regs.h"
301debfc3dSmrg #include "memmodel.h"
311debfc3dSmrg #include "ira.h"
321debfc3dSmrg #include "ira-int.h"
331debfc3dSmrg #include "toplev.h"
341debfc3dSmrg #include "target-globals.h"
351debfc3dSmrg #include "flags.h"
361debfc3dSmrg #include "reload.h"
371debfc3dSmrg #include "libfuncs.h"
381debfc3dSmrg #include "cfgloop.h"
391debfc3dSmrg #include "builtins.h"
401debfc3dSmrg #include "gcse.h"
411debfc3dSmrg #include "bb-reorder.h"
421debfc3dSmrg #include "lower-subreg.h"
43*8feb0f0bSmrg #include "function-abi.h"
441debfc3dSmrg 
451debfc3dSmrg #if SWITCHABLE_TARGET
46*8feb0f0bSmrg class target_globals default_target_globals = {
471debfc3dSmrg   &default_target_flag_state,
481debfc3dSmrg   &default_target_regs,
491debfc3dSmrg   &default_target_rtl,
501debfc3dSmrg   &default_target_recog,
511debfc3dSmrg   &default_target_hard_regs,
52*8feb0f0bSmrg   &default_target_function_abi_info,
531debfc3dSmrg   &default_target_reload,
541debfc3dSmrg   &default_target_expmed,
551debfc3dSmrg   &default_target_optabs,
561debfc3dSmrg   &default_target_libfuncs,
571debfc3dSmrg   &default_target_cfgloop,
581debfc3dSmrg   &default_target_ira,
591debfc3dSmrg   &default_target_ira_int,
601debfc3dSmrg   &default_target_builtins,
611debfc3dSmrg   &default_target_gcse,
621debfc3dSmrg   &default_target_bb_reorder,
631debfc3dSmrg   &default_target_lower_subreg
641debfc3dSmrg };
651debfc3dSmrg 
66*8feb0f0bSmrg class target_globals *
save_target_globals(void)671debfc3dSmrg save_target_globals (void)
681debfc3dSmrg {
69*8feb0f0bSmrg   class target_globals *g = ggc_cleared_alloc <target_globals> ();
70*8feb0f0bSmrg   g->flag_state = XCNEW (class target_flag_state);
711debfc3dSmrg   g->regs = XCNEW (struct target_regs);
721debfc3dSmrg   g->rtl = ggc_cleared_alloc<target_rtl> ();
731debfc3dSmrg   g->recog = XCNEW (struct target_recog);
741debfc3dSmrg   g->hard_regs = XCNEW (struct target_hard_regs);
75*8feb0f0bSmrg   g->function_abi_info = XCNEW (struct target_function_abi_info);
761debfc3dSmrg   g->reload = XCNEW (struct target_reload);
771debfc3dSmrg   g->expmed = XCNEW (struct target_expmed);
781debfc3dSmrg   g->optabs = XCNEW (struct target_optabs);
791debfc3dSmrg   g->libfuncs = ggc_cleared_alloc<target_libfuncs> ();
801debfc3dSmrg   g->cfgloop = XCNEW (struct target_cfgloop);
811debfc3dSmrg   g->ira = XCNEW (struct target_ira);
82*8feb0f0bSmrg   g->ira_int = XCNEW (class target_ira_int);
831debfc3dSmrg   g->builtins = XCNEW (struct target_builtins);
841debfc3dSmrg   g->gcse = XCNEW (struct target_gcse);
851debfc3dSmrg   g->bb_reorder = XCNEW (struct target_bb_reorder);
861debfc3dSmrg   g->lower_subreg = XCNEW (struct target_lower_subreg);
871debfc3dSmrg   restore_target_globals (g);
881debfc3dSmrg   init_reg_sets ();
891debfc3dSmrg   target_reinit ();
901debfc3dSmrg   return g;
911debfc3dSmrg }
921debfc3dSmrg 
931debfc3dSmrg /* Like save_target_globals() above, but set *this_target_optabs
941debfc3dSmrg    correctly when a previous function has changed
951debfc3dSmrg    *this_target_optabs.  */
961debfc3dSmrg 
97*8feb0f0bSmrg class target_globals *
save_target_globals_default_opts()981debfc3dSmrg save_target_globals_default_opts ()
991debfc3dSmrg {
100*8feb0f0bSmrg   class target_globals *globals;
1011debfc3dSmrg 
1021debfc3dSmrg   if (optimization_current_node != optimization_default_node)
1031debfc3dSmrg     {
1041debfc3dSmrg       tree opts = optimization_current_node;
1051debfc3dSmrg       /* Temporarily switch to the default optimization node, so that
1061debfc3dSmrg 	 *this_target_optabs is set to the default, not reflecting
1071debfc3dSmrg 	 whatever a previous function used for the optimize
1081debfc3dSmrg 	 attribute.  */
1091debfc3dSmrg       optimization_current_node = optimization_default_node;
1101debfc3dSmrg       cl_optimization_restore
1111debfc3dSmrg 	(&global_options,
1121debfc3dSmrg 	 TREE_OPTIMIZATION (optimization_default_node));
1131debfc3dSmrg       globals = save_target_globals ();
1141debfc3dSmrg       optimization_current_node = opts;
1151debfc3dSmrg       cl_optimization_restore (&global_options,
1161debfc3dSmrg 			       TREE_OPTIMIZATION (opts));
1171debfc3dSmrg       return globals;
1181debfc3dSmrg     }
1191debfc3dSmrg   return save_target_globals ();
1201debfc3dSmrg }
1211debfc3dSmrg 
~target_globals()1221debfc3dSmrg target_globals::~target_globals ()
1231debfc3dSmrg {
1241debfc3dSmrg   /* default_target_globals points to static data so shouldn't be freed.  */
1251debfc3dSmrg   if (this != &default_target_globals)
1261debfc3dSmrg     {
1271debfc3dSmrg       ira_int->~target_ira_int ();
1281debfc3dSmrg       hard_regs->finalize ();
1291debfc3dSmrg       XDELETE (flag_state);
1301debfc3dSmrg       XDELETE (regs);
1311debfc3dSmrg       XDELETE (recog);
1321debfc3dSmrg       XDELETE (hard_regs);
133*8feb0f0bSmrg       XDELETE (function_abi_info);
1341debfc3dSmrg       XDELETE (reload);
1351debfc3dSmrg       XDELETE (expmed);
1361debfc3dSmrg       XDELETE (optabs);
1371debfc3dSmrg       XDELETE (cfgloop);
1381debfc3dSmrg       XDELETE (ira);
1391debfc3dSmrg       XDELETE (ira_int);
1401debfc3dSmrg       XDELETE (builtins);
1411debfc3dSmrg       XDELETE (gcse);
1421debfc3dSmrg       XDELETE (bb_reorder);
1431debfc3dSmrg       XDELETE (lower_subreg);
1441debfc3dSmrg     }
1451debfc3dSmrg }
1461debfc3dSmrg 
1471debfc3dSmrg #endif
148