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