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