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