xref: /dflybsd-src/contrib/gcc-8.0/gcc/target-globals.c (revision 38fd149817dfbff97799f62fcb70be98c4e32523)
1*38fd1498Szrj /* Target-dependent globals.
2*38fd1498Szrj    Copyright (C) 2010-2018 Free Software Foundation, Inc.
3*38fd1498Szrj 
4*38fd1498Szrj This file is part of GCC.
5*38fd1498Szrj 
6*38fd1498Szrj GCC is free software; you can redistribute it and/or modify it under
7*38fd1498Szrj the terms of the GNU General Public License as published by the Free
8*38fd1498Szrj Software Foundation; either version 3, or (at your option) any later
9*38fd1498Szrj version.
10*38fd1498Szrj 
11*38fd1498Szrj GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12*38fd1498Szrj WARRANTY; without even the implied warranty of MERCHANTABILITY or
13*38fd1498Szrj FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14*38fd1498Szrj for more details.
15*38fd1498Szrj 
16*38fd1498Szrj You should have received a copy of the GNU General Public License
17*38fd1498Szrj along with GCC; see the file COPYING3.  If not see
18*38fd1498Szrj <http://www.gnu.org/licenses/>.  */
19*38fd1498Szrj 
20*38fd1498Szrj #include "config.h"
21*38fd1498Szrj #include "system.h"
22*38fd1498Szrj #include "coretypes.h"
23*38fd1498Szrj #include "backend.h"
24*38fd1498Szrj #include "rtl.h"
25*38fd1498Szrj #include "tree.h"
26*38fd1498Szrj #include "expmed.h"
27*38fd1498Szrj #include "optabs-query.h"
28*38fd1498Szrj #include "insn-config.h"
29*38fd1498Szrj #include "regs.h"
30*38fd1498Szrj #include "memmodel.h"
31*38fd1498Szrj #include "ira.h"
32*38fd1498Szrj #include "ira-int.h"
33*38fd1498Szrj #include "toplev.h"
34*38fd1498Szrj #include "target-globals.h"
35*38fd1498Szrj #include "flags.h"
36*38fd1498Szrj #include "reload.h"
37*38fd1498Szrj #include "libfuncs.h"
38*38fd1498Szrj #include "cfgloop.h"
39*38fd1498Szrj #include "builtins.h"
40*38fd1498Szrj #include "gcse.h"
41*38fd1498Szrj #include "bb-reorder.h"
42*38fd1498Szrj #include "lower-subreg.h"
43*38fd1498Szrj 
44*38fd1498Szrj #if SWITCHABLE_TARGET
45*38fd1498Szrj struct target_globals default_target_globals = {
46*38fd1498Szrj   &default_target_flag_state,
47*38fd1498Szrj   &default_target_regs,
48*38fd1498Szrj   &default_target_rtl,
49*38fd1498Szrj   &default_target_recog,
50*38fd1498Szrj   &default_target_hard_regs,
51*38fd1498Szrj   &default_target_reload,
52*38fd1498Szrj   &default_target_expmed,
53*38fd1498Szrj   &default_target_optabs,
54*38fd1498Szrj   &default_target_libfuncs,
55*38fd1498Szrj   &default_target_cfgloop,
56*38fd1498Szrj   &default_target_ira,
57*38fd1498Szrj   &default_target_ira_int,
58*38fd1498Szrj   &default_target_builtins,
59*38fd1498Szrj   &default_target_gcse,
60*38fd1498Szrj   &default_target_bb_reorder,
61*38fd1498Szrj   &default_target_lower_subreg
62*38fd1498Szrj };
63*38fd1498Szrj 
64*38fd1498Szrj struct target_globals *
save_target_globals(void)65*38fd1498Szrj save_target_globals (void)
66*38fd1498Szrj {
67*38fd1498Szrj   struct target_globals *g = ggc_cleared_alloc <target_globals> ();
68*38fd1498Szrj   g->flag_state = XCNEW (struct target_flag_state);
69*38fd1498Szrj   g->regs = XCNEW (struct target_regs);
70*38fd1498Szrj   g->rtl = ggc_cleared_alloc<target_rtl> ();
71*38fd1498Szrj   g->recog = XCNEW (struct target_recog);
72*38fd1498Szrj   g->hard_regs = XCNEW (struct target_hard_regs);
73*38fd1498Szrj   g->reload = XCNEW (struct target_reload);
74*38fd1498Szrj   g->expmed = XCNEW (struct target_expmed);
75*38fd1498Szrj   g->optabs = XCNEW (struct target_optabs);
76*38fd1498Szrj   g->libfuncs = ggc_cleared_alloc<target_libfuncs> ();
77*38fd1498Szrj   g->cfgloop = XCNEW (struct target_cfgloop);
78*38fd1498Szrj   g->ira = XCNEW (struct target_ira);
79*38fd1498Szrj   g->ira_int = XCNEW (struct target_ira_int);
80*38fd1498Szrj   g->builtins = XCNEW (struct target_builtins);
81*38fd1498Szrj   g->gcse = XCNEW (struct target_gcse);
82*38fd1498Szrj   g->bb_reorder = XCNEW (struct target_bb_reorder);
83*38fd1498Szrj   g->lower_subreg = XCNEW (struct target_lower_subreg);
84*38fd1498Szrj   restore_target_globals (g);
85*38fd1498Szrj   init_reg_sets ();
86*38fd1498Szrj   target_reinit ();
87*38fd1498Szrj   return g;
88*38fd1498Szrj }
89*38fd1498Szrj 
90*38fd1498Szrj /* Like save_target_globals() above, but set *this_target_optabs
91*38fd1498Szrj    correctly when a previous function has changed
92*38fd1498Szrj    *this_target_optabs.  */
93*38fd1498Szrj 
94*38fd1498Szrj struct target_globals *
save_target_globals_default_opts()95*38fd1498Szrj save_target_globals_default_opts ()
96*38fd1498Szrj {
97*38fd1498Szrj   struct target_globals *globals;
98*38fd1498Szrj 
99*38fd1498Szrj   if (optimization_current_node != optimization_default_node)
100*38fd1498Szrj     {
101*38fd1498Szrj       tree opts = optimization_current_node;
102*38fd1498Szrj       /* Temporarily switch to the default optimization node, so that
103*38fd1498Szrj 	 *this_target_optabs is set to the default, not reflecting
104*38fd1498Szrj 	 whatever a previous function used for the optimize
105*38fd1498Szrj 	 attribute.  */
106*38fd1498Szrj       optimization_current_node = optimization_default_node;
107*38fd1498Szrj       cl_optimization_restore
108*38fd1498Szrj 	(&global_options,
109*38fd1498Szrj 	 TREE_OPTIMIZATION (optimization_default_node));
110*38fd1498Szrj       globals = save_target_globals ();
111*38fd1498Szrj       optimization_current_node = opts;
112*38fd1498Szrj       cl_optimization_restore (&global_options,
113*38fd1498Szrj 			       TREE_OPTIMIZATION (opts));
114*38fd1498Szrj       return globals;
115*38fd1498Szrj     }
116*38fd1498Szrj   return save_target_globals ();
117*38fd1498Szrj }
118*38fd1498Szrj 
~target_globals()119*38fd1498Szrj target_globals::~target_globals ()
120*38fd1498Szrj {
121*38fd1498Szrj   /* default_target_globals points to static data so shouldn't be freed.  */
122*38fd1498Szrj   if (this != &default_target_globals)
123*38fd1498Szrj     {
124*38fd1498Szrj       ira_int->~target_ira_int ();
125*38fd1498Szrj       hard_regs->finalize ();
126*38fd1498Szrj       XDELETE (flag_state);
127*38fd1498Szrj       XDELETE (regs);
128*38fd1498Szrj       XDELETE (recog);
129*38fd1498Szrj       XDELETE (hard_regs);
130*38fd1498Szrj       XDELETE (reload);
131*38fd1498Szrj       XDELETE (expmed);
132*38fd1498Szrj       XDELETE (optabs);
133*38fd1498Szrj       XDELETE (cfgloop);
134*38fd1498Szrj       XDELETE (ira);
135*38fd1498Szrj       XDELETE (ira_int);
136*38fd1498Szrj       XDELETE (builtins);
137*38fd1498Szrj       XDELETE (gcse);
138*38fd1498Szrj       XDELETE (bb_reorder);
139*38fd1498Szrj       XDELETE (lower_subreg);
140*38fd1498Szrj     }
141*38fd1498Szrj }
142*38fd1498Szrj 
143*38fd1498Szrj #endif
144