Home | History | Annotate | Line # | Download | only in gcc
      1  1.1  mrg /* Pass to free or clear language-specific data structures from
      2  1.1  mrg    the IL before they reach the middle end.
      3  1.1  mrg 
      4  1.1  mrg    Copyright (C) 1987-2022 Free Software Foundation, Inc.
      5  1.1  mrg 
      6  1.1  mrg    This file is part of GCC.
      7  1.1  mrg 
      8  1.1  mrg    GCC is free software; you can redistribute it and/or modify it under
      9  1.1  mrg    the terms of the GNU General Public License as published by the Free
     10  1.1  mrg    Software Foundation; either version 3, or (at your option) any later
     11  1.1  mrg    version.
     12  1.1  mrg 
     13  1.1  mrg    GCC is distributed in the hope that it will be useful, but WITHOUT ANY
     14  1.1  mrg    WARRANTY; without even the implied warranty of MERCHANTABILITY or
     15  1.1  mrg    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
     16  1.1  mrg    for more details.
     17  1.1  mrg 
     18  1.1  mrg    You should have received a copy of the GNU General Public License
     19  1.1  mrg    along with GCC; see the file COPYING3.  If not see
     20  1.1  mrg    <http://www.gnu.org/licenses/>.  */
     21  1.1  mrg 
     22  1.1  mrg /* This file contains the low level primitives for operating on tree nodes,
     23  1.1  mrg    including allocation, list operations, interning of identifiers,
     24  1.1  mrg    construction of data type nodes and statement nodes,
     25  1.1  mrg    and construction of type conversion nodes.  It also contains
     26  1.1  mrg    tables index by tree code that describe how to take apart
     27  1.1  mrg    nodes of that code.
     28  1.1  mrg 
     29  1.1  mrg    It is intended to be language-independent but can occasionally
     30  1.1  mrg    calls language-dependent routines.  */
     31  1.1  mrg 
     32  1.1  mrg #include "config.h"
     33  1.1  mrg #include "system.h"
     34  1.1  mrg #include "coretypes.h"
     35  1.1  mrg #include "backend.h"
     36  1.1  mrg #include "target.h"
     37  1.1  mrg #include "tree.h"
     38  1.1  mrg #include "gimple.h"
     39  1.1  mrg #include "tree-pass.h"
     40  1.1  mrg #include "ssa.h"
     41  1.1  mrg #include "cgraph.h"
     42  1.1  mrg #include "diagnostic.h"
     43  1.1  mrg #include "alias.h"
     44  1.1  mrg #include "attribs.h"
     45  1.1  mrg #include "langhooks.h"
     46  1.1  mrg #include "gimple-iterator.h"
     47  1.1  mrg #include "langhooks-def.h"
     48  1.1  mrg #include "tree-diagnostic.h"
     49  1.1  mrg #include "except.h"
     50  1.1  mrg #include "ipa-utils.h"
     51  1.1  mrg 
     52  1.1  mrg namespace {
     53  1.1  mrg 
     54  1.1  mrg /* Data used when collecting DECLs and TYPEs for language data removal.  */
     55  1.1  mrg 
     56  1.1  mrg class free_lang_data_d
     57  1.1  mrg {
     58  1.1  mrg public:
     59  1.1  mrg   free_lang_data_d () : decls (100), types (100) {}
     60  1.1  mrg 
     61  1.1  mrg   /* Worklist to avoid excessive recursion.  */
     62  1.1  mrg   auto_vec<tree> worklist;
     63  1.1  mrg 
     64  1.1  mrg   /* Set of traversed objects.  Used to avoid duplicate visits.  */
     65  1.1  mrg   hash_set<tree> pset;
     66  1.1  mrg 
     67  1.1  mrg   /* Array of symbols to process with free_lang_data_in_decl.  */
     68  1.1  mrg   auto_vec<tree> decls;
     69  1.1  mrg 
     70  1.1  mrg   /* Array of types to process with free_lang_data_in_type.  */
     71  1.1  mrg   auto_vec<tree> types;
     72  1.1  mrg };
     73  1.1  mrg 
     74  1.1  mrg 
     75  1.1  mrg /* Add type or decl T to one of the list of tree nodes that need their
     76  1.1  mrg    language data removed.  The lists are held inside FLD.  */
     77  1.1  mrg 
     78  1.1  mrg static void
     79  1.1  mrg add_tree_to_fld_list (tree t, class free_lang_data_d *fld)
     80  1.1  mrg {
     81  1.1  mrg   if (DECL_P (t))
     82  1.1  mrg     fld->decls.safe_push (t);
     83  1.1  mrg   else if (TYPE_P (t))
     84  1.1  mrg     fld->types.safe_push (t);
     85  1.1  mrg   else
     86  1.1  mrg     gcc_unreachable ();
     87  1.1  mrg }
     88  1.1  mrg 
     89  1.1  mrg /* Push tree node T into FLD->WORKLIST.  */
     90  1.1  mrg 
     91  1.1  mrg static inline void
     92  1.1  mrg fld_worklist_push (tree t, class free_lang_data_d *fld)
     93  1.1  mrg {
     94  1.1  mrg   if (t && !is_lang_specific (t) && !fld->pset.contains (t))
     95  1.1  mrg     fld->worklist.safe_push ((t));
     96  1.1  mrg }
     97  1.1  mrg 
     98  1.1  mrg 
     99  1.1  mrg 
    100  1.1  mrg /* Return simplified TYPE_NAME of TYPE.  */
    102  1.1  mrg 
    103  1.1  mrg static tree
    104  1.1  mrg fld_simplified_type_name (tree type)
    105  1.1  mrg {
    106  1.1  mrg   if (!TYPE_NAME (type) || TREE_CODE (TYPE_NAME (type)) != TYPE_DECL)
    107  1.1  mrg     return TYPE_NAME (type);
    108  1.1  mrg   /* Drop TYPE_DECLs in TYPE_NAME in favor of the identifier in the
    109  1.1  mrg      TYPE_DECL if the type doesn't have linkage.
    110  1.1  mrg      this must match fld_  */
    111  1.1  mrg   if (type != TYPE_MAIN_VARIANT (type)
    112  1.1  mrg       || (!DECL_ASSEMBLER_NAME_SET_P (TYPE_NAME (type))
    113  1.1  mrg 	  && (TREE_CODE (type) != RECORD_TYPE
    114  1.1  mrg 	      || !TYPE_BINFO (type)
    115  1.1  mrg 	      || !BINFO_VTABLE (TYPE_BINFO (type)))))
    116  1.1  mrg     return DECL_NAME (TYPE_NAME (type));
    117  1.1  mrg   return TYPE_NAME (type);
    118  1.1  mrg }
    119  1.1  mrg 
    120  1.1  mrg /* Do same comparsion as check_qualified_type skipping lang part of type
    121  1.1  mrg    and be more permissive about type names: we only care that names are
    122  1.1  mrg    same (for diagnostics) and that ODR names are the same.
    123  1.1  mrg    If INNER_TYPE is non-NULL, be sure that TREE_TYPE match it.  */
    124  1.1  mrg 
    125  1.1  mrg static bool
    126  1.1  mrg fld_type_variant_equal_p (tree t, tree v, tree inner_type)
    127  1.1  mrg {
    128  1.1  mrg   if (TYPE_QUALS (t) != TYPE_QUALS (v)
    129  1.1  mrg       /* We want to match incomplete variants with complete types.
    130  1.1  mrg 	 In this case we need to ignore alignment.   */
    131  1.1  mrg       || ((!RECORD_OR_UNION_TYPE_P (t) || COMPLETE_TYPE_P (v))
    132  1.1  mrg 	  && (TYPE_ALIGN (t) != TYPE_ALIGN (v)
    133  1.1  mrg 	      || TYPE_USER_ALIGN (t) != TYPE_USER_ALIGN (v)))
    134  1.1  mrg       || fld_simplified_type_name (t) != fld_simplified_type_name (v)
    135  1.1  mrg       || !attribute_list_equal (TYPE_ATTRIBUTES (t),
    136  1.1  mrg 			        TYPE_ATTRIBUTES (v))
    137  1.1  mrg       || (inner_type && TREE_TYPE (v) != inner_type))
    138  1.1  mrg     return false;
    139  1.1  mrg 
    140  1.1  mrg   return true;
    141  1.1  mrg }
    142  1.1  mrg 
    143  1.1  mrg /* Find variant of FIRST that match T and create new one if necessary.
    144  1.1  mrg    Set TREE_TYPE to INNER_TYPE if non-NULL.  */
    145  1.1  mrg 
    146  1.1  mrg static tree
    147  1.1  mrg fld_type_variant (tree first, tree t, class free_lang_data_d *fld,
    148  1.1  mrg 		  tree inner_type = NULL)
    149  1.1  mrg {
    150  1.1  mrg   if (first == TYPE_MAIN_VARIANT (t))
    151  1.1  mrg     return t;
    152  1.1  mrg   for (tree v = first; v; v = TYPE_NEXT_VARIANT (v))
    153  1.1  mrg     if (fld_type_variant_equal_p (t, v, inner_type))
    154  1.1  mrg       return v;
    155  1.1  mrg   tree v = build_variant_type_copy (first);
    156  1.1  mrg   TYPE_READONLY (v) = TYPE_READONLY (t);
    157  1.1  mrg   TYPE_VOLATILE (v) = TYPE_VOLATILE (t);
    158  1.1  mrg   TYPE_ATOMIC (v) = TYPE_ATOMIC (t);
    159  1.1  mrg   TYPE_RESTRICT (v) = TYPE_RESTRICT (t);
    160  1.1  mrg   TYPE_ADDR_SPACE (v) = TYPE_ADDR_SPACE (t);
    161  1.1  mrg   TYPE_NAME (v) = TYPE_NAME (t);
    162  1.1  mrg   TYPE_ATTRIBUTES (v) = TYPE_ATTRIBUTES (t);
    163  1.1  mrg   TYPE_CANONICAL (v) = TYPE_CANONICAL (t);
    164  1.1  mrg   /* Variants of incomplete types should have alignment
    165  1.1  mrg      set to BITS_PER_UNIT.  Do not copy the actual alignment.  */
    166  1.1  mrg   if (!RECORD_OR_UNION_TYPE_P (v) || COMPLETE_TYPE_P (v))
    167  1.1  mrg     {
    168  1.1  mrg       SET_TYPE_ALIGN (v, TYPE_ALIGN (t));
    169  1.1  mrg       TYPE_USER_ALIGN (v) = TYPE_USER_ALIGN (t);
    170  1.1  mrg     }
    171  1.1  mrg   if (inner_type)
    172  1.1  mrg     TREE_TYPE (v) = inner_type;
    173  1.1  mrg   gcc_checking_assert (fld_type_variant_equal_p (t,v, inner_type));
    174  1.1  mrg   if (!fld->pset.add (v))
    175  1.1  mrg     add_tree_to_fld_list (v, fld);
    176  1.1  mrg   return v;
    177  1.1  mrg }
    178  1.1  mrg 
    179  1.1  mrg /* Map complete types to incomplete types.  */
    180  1.1  mrg 
    181  1.1  mrg static hash_map<tree, tree> *fld_incomplete_types;
    182  1.1  mrg 
    183  1.1  mrg /* Map types to simplified types.  */
    184  1.1  mrg 
    185  1.1  mrg static hash_map<tree, tree> *fld_simplified_types;
    186  1.1  mrg 
    187  1.1  mrg /* Produce variant of T whose TREE_TYPE is T2. If it is main variant,
    188  1.1  mrg    use MAP to prevent duplicates.  */
    189  1.1  mrg 
    190  1.1  mrg static tree
    191  1.1  mrg fld_process_array_type (tree t, tree t2, hash_map<tree, tree> *map,
    192  1.1  mrg 			class free_lang_data_d *fld)
    193  1.1  mrg {
    194  1.1  mrg   if (TREE_TYPE (t) == t2)
    195  1.1  mrg     return t;
    196  1.1  mrg 
    197  1.1  mrg   if (TYPE_MAIN_VARIANT (t) != t)
    198  1.1  mrg     {
    199  1.1  mrg       return fld_type_variant
    200  1.1  mrg 	(fld_process_array_type (TYPE_MAIN_VARIANT (t),
    201  1.1  mrg 				 TYPE_MAIN_VARIANT (t2), map, fld),
    202  1.1  mrg 	 t, fld, t2);
    203  1.1  mrg     }
    204  1.1  mrg 
    205  1.1  mrg   bool existed;
    206  1.1  mrg   tree &array
    207  1.1  mrg     = map->get_or_insert (t, &existed);
    208  1.1  mrg   if (!existed)
    209  1.1  mrg     {
    210  1.1  mrg       array
    211  1.1  mrg 	= build_array_type_1 (t2, TYPE_DOMAIN (t), TYPE_TYPELESS_STORAGE (t),
    212  1.1  mrg 			      false, false);
    213  1.1  mrg       TYPE_CANONICAL (array) = TYPE_CANONICAL (t);
    214  1.1  mrg       if (!fld->pset.add (array))
    215  1.1  mrg 	add_tree_to_fld_list (array, fld);
    216  1.1  mrg     }
    217  1.1  mrg   return array;
    218  1.1  mrg }
    219  1.1  mrg 
    220  1.1  mrg /* Return CTX after removal of contexts that are not relevant  */
    221  1.1  mrg 
    222  1.1  mrg static tree
    223  1.1  mrg fld_decl_context (tree ctx)
    224  1.1  mrg {
    225  1.1  mrg   /* Variably modified types are needed for tree_is_indexable to decide
    226  1.1  mrg      whether the type needs to go to local or global section.
    227  1.1  mrg      This code is semi-broken but for now it is easiest to keep contexts
    228  1.1  mrg      as expected.  */
    229  1.1  mrg   if (ctx && TYPE_P (ctx)
    230  1.1  mrg       && !variably_modified_type_p (ctx, NULL_TREE))
    231  1.1  mrg     {
    232  1.1  mrg       while (ctx && TYPE_P (ctx))
    233  1.1  mrg 	ctx = TYPE_CONTEXT (ctx);
    234  1.1  mrg     }
    235  1.1  mrg   return ctx;
    236  1.1  mrg }
    237  1.1  mrg 
    238  1.1  mrg /* For T being aggregate type try to turn it into a incomplete variant.
    239  1.1  mrg    Return T if no simplification is possible.  */
    240  1.1  mrg 
    241  1.1  mrg static tree
    242  1.1  mrg fld_incomplete_type_of (tree t, class free_lang_data_d *fld)
    243  1.1  mrg {
    244  1.1  mrg   if (!t)
    245  1.1  mrg     return NULL;
    246  1.1  mrg   if (POINTER_TYPE_P (t))
    247  1.1  mrg     {
    248  1.1  mrg       tree t2 = fld_incomplete_type_of (TREE_TYPE (t), fld);
    249  1.1  mrg       if (t2 != TREE_TYPE (t))
    250  1.1  mrg 	{
    251  1.1  mrg 	  tree first;
    252  1.1  mrg 	  if (TREE_CODE (t) == POINTER_TYPE)
    253  1.1  mrg 	    first = build_pointer_type_for_mode (t2, TYPE_MODE (t),
    254  1.1  mrg 						 TYPE_REF_CAN_ALIAS_ALL (t));
    255  1.1  mrg 	  else
    256  1.1  mrg 	    first = build_reference_type_for_mode (t2, TYPE_MODE (t),
    257  1.1  mrg 						   TYPE_REF_CAN_ALIAS_ALL (t));
    258  1.1  mrg 	  gcc_assert (TYPE_CANONICAL (t2) != t2
    259  1.1  mrg 		      && TYPE_CANONICAL (t2) == TYPE_CANONICAL (TREE_TYPE (t)));
    260  1.1  mrg 	  if (!fld->pset.add (first))
    261  1.1  mrg 	    add_tree_to_fld_list (first, fld);
    262  1.1  mrg 	  return fld_type_variant (first, t, fld);
    263  1.1  mrg 	}
    264  1.1  mrg       return t;
    265  1.1  mrg     }
    266  1.1  mrg   if (TREE_CODE (t) == ARRAY_TYPE)
    267  1.1  mrg     return fld_process_array_type (t,
    268  1.1  mrg 				   fld_incomplete_type_of (TREE_TYPE (t), fld),
    269  1.1  mrg 				   fld_incomplete_types, fld);
    270  1.1  mrg   if ((!RECORD_OR_UNION_TYPE_P (t) && TREE_CODE (t) != ENUMERAL_TYPE)
    271  1.1  mrg       || !COMPLETE_TYPE_P (t))
    272  1.1  mrg     return t;
    273  1.1  mrg   if (TYPE_MAIN_VARIANT (t) == t)
    274  1.1  mrg     {
    275  1.1  mrg       bool existed;
    276  1.1  mrg       tree &copy
    277  1.1  mrg 	= fld_incomplete_types->get_or_insert (t, &existed);
    278  1.1  mrg 
    279  1.1  mrg       if (!existed)
    280  1.1  mrg 	{
    281  1.1  mrg 	  copy = build_distinct_type_copy (t);
    282  1.1  mrg 
    283  1.1  mrg 	  /* It is possible that type was not seen by free_lang_data yet.  */
    284  1.1  mrg 	  if (!fld->pset.add (copy))
    285  1.1  mrg 	    add_tree_to_fld_list (copy, fld);
    286  1.1  mrg 	  TYPE_SIZE (copy) = NULL;
    287  1.1  mrg 	  TYPE_USER_ALIGN (copy) = 0;
    288  1.1  mrg 	  TYPE_SIZE_UNIT (copy) = NULL;
    289  1.1  mrg 	  TYPE_CANONICAL (copy) = TYPE_CANONICAL (t);
    290  1.1  mrg 	  TREE_ADDRESSABLE (copy) = 0;
    291  1.1  mrg 	  if (AGGREGATE_TYPE_P (t))
    292  1.1  mrg 	    {
    293  1.1  mrg 	      SET_TYPE_MODE (copy, VOIDmode);
    294  1.1  mrg 	      SET_TYPE_ALIGN (copy, BITS_PER_UNIT);
    295  1.1  mrg 	      TYPE_TYPELESS_STORAGE (copy) = 0;
    296  1.1  mrg 	      TYPE_FIELDS (copy) = NULL;
    297  1.1  mrg 	      TYPE_BINFO (copy) = NULL;
    298  1.1  mrg 	      TYPE_FINAL_P (copy) = 0;
    299  1.1  mrg 	      TYPE_EMPTY_P (copy) = 0;
    300  1.1  mrg 	    }
    301  1.1  mrg 	  else
    302  1.1  mrg 	    {
    303  1.1  mrg 	      TYPE_VALUES (copy) = NULL;
    304  1.1  mrg 	      ENUM_IS_OPAQUE (copy) = 0;
    305  1.1  mrg 	      ENUM_IS_SCOPED (copy) = 0;
    306  1.1  mrg 	    }
    307  1.1  mrg 
    308  1.1  mrg 	  /* Build copy of TYPE_DECL in TYPE_NAME if necessary.
    309  1.1  mrg 	     This is needed for ODR violation warnings to come out right (we
    310  1.1  mrg 	     want duplicate TYPE_DECLs whenever the type is duplicated because
    311  1.1  mrg 	     of ODR violation.  Because lang data in the TYPE_DECL may not
    312  1.1  mrg 	     have been freed yet, rebuild it from scratch and copy relevant
    313  1.1  mrg 	     fields.  */
    314  1.1  mrg 	  TYPE_NAME (copy) = fld_simplified_type_name (copy);
    315  1.1  mrg 	  tree name = TYPE_NAME (copy);
    316  1.1  mrg 
    317  1.1  mrg 	  if (name && TREE_CODE (name) == TYPE_DECL)
    318  1.1  mrg 	    {
    319  1.1  mrg 	      gcc_checking_assert (TREE_TYPE (name) == t);
    320  1.1  mrg 	      tree name2 = build_decl (DECL_SOURCE_LOCATION (name), TYPE_DECL,
    321  1.1  mrg 				       DECL_NAME (name), copy);
    322  1.1  mrg 	      if (DECL_ASSEMBLER_NAME_SET_P (name))
    323  1.1  mrg 		SET_DECL_ASSEMBLER_NAME (name2, DECL_ASSEMBLER_NAME (name));
    324  1.1  mrg 	      SET_DECL_ALIGN (name2, 0);
    325  1.1  mrg 	      DECL_CONTEXT (name2) = fld_decl_context
    326  1.1  mrg 		(DECL_CONTEXT (name));
    327  1.1  mrg 	      TYPE_NAME (copy) = name2;
    328  1.1  mrg 	    }
    329  1.1  mrg 	}
    330  1.1  mrg       return copy;
    331  1.1  mrg     }
    332  1.1  mrg   return (fld_type_variant
    333  1.1  mrg 	  (fld_incomplete_type_of (TYPE_MAIN_VARIANT (t), fld), t, fld));
    334  1.1  mrg }
    335  1.1  mrg 
    336  1.1  mrg /* Simplify type T for scenarios where we do not need complete pointer
    337  1.1  mrg    types.  */
    338  1.1  mrg 
    339  1.1  mrg static tree
    340  1.1  mrg fld_simplified_type (tree t, class free_lang_data_d *fld)
    341  1.1  mrg {
    342  1.1  mrg   if (!t)
    343  1.1  mrg     return t;
    344  1.1  mrg   if (POINTER_TYPE_P (t))
    345  1.1  mrg     return fld_incomplete_type_of (t, fld);
    346  1.1  mrg   /* FIXME: This triggers verification error, see PR88140.  */
    347  1.1  mrg #if 0
    348  1.1  mrg   if (TREE_CODE (t) == ARRAY_TYPE)
    349  1.1  mrg     return fld_process_array_type (t, fld_simplified_type (TREE_TYPE (t), fld),
    350  1.1  mrg 				   fld_simplified_types, fld);
    351  1.1  mrg #endif
    352  1.1  mrg   return t;
    353  1.1  mrg }
    354  1.1  mrg 
    355  1.1  mrg /* Reset the expression *EXPR_P, a size or position.
    356  1.1  mrg 
    357  1.1  mrg    ??? We could reset all non-constant sizes or positions.  But it's cheap
    358  1.1  mrg    enough to not do so and refrain from adding workarounds to dwarf2out.cc.
    359  1.1  mrg 
    360  1.1  mrg    We need to reset self-referential sizes or positions because they cannot
    361  1.1  mrg    be gimplified and thus can contain a CALL_EXPR after the gimplification
    362  1.1  mrg    is finished, which will run afoul of LTO streaming.  And they need to be
    363  1.1  mrg    reset to something essentially dummy but not constant, so as to preserve
    364  1.1  mrg    the properties of the object they are attached to.  */
    365  1.1  mrg 
    366  1.1  mrg static inline void
    367  1.1  mrg free_lang_data_in_one_sizepos (tree *expr_p)
    368  1.1  mrg {
    369  1.1  mrg   tree expr = *expr_p;
    370  1.1  mrg   if (CONTAINS_PLACEHOLDER_P (expr))
    371  1.1  mrg     *expr_p = build0 (PLACEHOLDER_EXPR, TREE_TYPE (expr));
    372  1.1  mrg }
    373  1.1  mrg 
    374  1.1  mrg 
    375  1.1  mrg /* Reset all the fields in a binfo node BINFO.  We only keep
    376  1.1  mrg    BINFO_VTABLE, which is used by gimple_fold_obj_type_ref.  */
    377  1.1  mrg 
    378  1.1  mrg static void
    379  1.1  mrg free_lang_data_in_binfo (tree binfo)
    380  1.1  mrg {
    381  1.1  mrg   unsigned i;
    382  1.1  mrg   tree t;
    383  1.1  mrg 
    384  1.1  mrg   gcc_assert (TREE_CODE (binfo) == TREE_BINFO);
    385  1.1  mrg 
    386  1.1  mrg   BINFO_VIRTUALS (binfo) = NULL_TREE;
    387  1.1  mrg   BINFO_BASE_ACCESSES (binfo) = NULL;
    388  1.1  mrg   BINFO_INHERITANCE_CHAIN (binfo) = NULL_TREE;
    389  1.1  mrg   BINFO_SUBVTT_INDEX (binfo) = NULL_TREE;
    390  1.1  mrg   BINFO_VPTR_FIELD (binfo) = NULL_TREE;
    391  1.1  mrg   TREE_PUBLIC (binfo) = 0;
    392  1.1  mrg 
    393  1.1  mrg   FOR_EACH_VEC_ELT (*BINFO_BASE_BINFOS (binfo), i, t)
    394  1.1  mrg     free_lang_data_in_binfo (t);
    395  1.1  mrg }
    396  1.1  mrg 
    397  1.1  mrg 
    398  1.1  mrg /* Reset all language specific information still present in TYPE.  */
    399  1.1  mrg 
    400  1.1  mrg static void
    401  1.1  mrg free_lang_data_in_type (tree type, class free_lang_data_d *fld)
    402  1.1  mrg {
    403  1.1  mrg   gcc_assert (TYPE_P (type));
    404  1.1  mrg 
    405  1.1  mrg   /* Give the FE a chance to remove its own data first.  */
    406  1.1  mrg   lang_hooks.free_lang_data (type);
    407  1.1  mrg 
    408  1.1  mrg   TREE_LANG_FLAG_0 (type) = 0;
    409  1.1  mrg   TREE_LANG_FLAG_1 (type) = 0;
    410  1.1  mrg   TREE_LANG_FLAG_2 (type) = 0;
    411  1.1  mrg   TREE_LANG_FLAG_3 (type) = 0;
    412  1.1  mrg   TREE_LANG_FLAG_4 (type) = 0;
    413  1.1  mrg   TREE_LANG_FLAG_5 (type) = 0;
    414  1.1  mrg   TREE_LANG_FLAG_6 (type) = 0;
    415  1.1  mrg 
    416  1.1  mrg   TYPE_NEEDS_CONSTRUCTING (type) = 0;
    417  1.1  mrg 
    418  1.1  mrg   /* Purge non-marked variants from the variants chain, so that they
    419  1.1  mrg      don't reappear in the IL after free_lang_data.  */
    420  1.1  mrg   while (TYPE_NEXT_VARIANT (type)
    421  1.1  mrg 	 && !fld->pset.contains (TYPE_NEXT_VARIANT (type)))
    422  1.1  mrg     {
    423  1.1  mrg       tree t = TYPE_NEXT_VARIANT (type);
    424  1.1  mrg       TYPE_NEXT_VARIANT (type) = TYPE_NEXT_VARIANT (t);
    425  1.1  mrg       /* Turn the removed types into distinct types.  */
    426  1.1  mrg       TYPE_MAIN_VARIANT (t) = t;
    427  1.1  mrg       TYPE_NEXT_VARIANT (t) = NULL_TREE;
    428  1.1  mrg     }
    429  1.1  mrg 
    430  1.1  mrg   if (TREE_CODE (type) == FUNCTION_TYPE)
    431  1.1  mrg     {
    432  1.1  mrg       TREE_TYPE (type) = fld_simplified_type (TREE_TYPE (type), fld);
    433  1.1  mrg       /* Remove the const and volatile qualifiers from arguments.  The
    434  1.1  mrg 	 C++ front end removes them, but the C front end does not,
    435  1.1  mrg 	 leading to false ODR violation errors when merging two
    436  1.1  mrg 	 instances of the same function signature compiled by
    437  1.1  mrg 	 different front ends.  */
    438  1.1  mrg       for (tree p = TYPE_ARG_TYPES (type); p; p = TREE_CHAIN (p))
    439  1.1  mrg 	{
    440  1.1  mrg 	  tree arg_type = TREE_VALUE (p);
    441  1.1  mrg 	  if (TYPE_READONLY (arg_type) || TYPE_VOLATILE (arg_type))
    442  1.1  mrg 	    {
    443  1.1  mrg 	      int quals = TYPE_QUALS (arg_type)
    444  1.1  mrg 		& ~TYPE_QUAL_CONST
    445  1.1  mrg 		& ~TYPE_QUAL_VOLATILE;
    446  1.1  mrg 	      TREE_VALUE (p) = build_qualified_type (arg_type, quals);
    447  1.1  mrg 	      if (!fld->pset.add (TREE_VALUE (p)))
    448  1.1  mrg 		free_lang_data_in_type (TREE_VALUE (p), fld);
    449  1.1  mrg 	    }
    450  1.1  mrg 	  TREE_VALUE (p) = fld_simplified_type (TREE_VALUE (p), fld);
    451  1.1  mrg 	  /* C++ FE uses TREE_PURPOSE to store initial values.  */
    452  1.1  mrg 	  TREE_PURPOSE (p) = NULL;
    453  1.1  mrg 	}
    454  1.1  mrg     }
    455  1.1  mrg   else if (TREE_CODE (type) == METHOD_TYPE)
    456  1.1  mrg     {
    457  1.1  mrg       TREE_TYPE (type) = fld_simplified_type (TREE_TYPE (type), fld);
    458  1.1  mrg       for (tree p = TYPE_ARG_TYPES (type); p; p = TREE_CHAIN (p))
    459  1.1  mrg 	{
    460  1.1  mrg 	  /* C++ FE uses TREE_PURPOSE to store initial values.  */
    461  1.1  mrg 	  TREE_VALUE (p) = fld_simplified_type (TREE_VALUE (p), fld);
    462  1.1  mrg 	  TREE_PURPOSE (p) = NULL;
    463  1.1  mrg 	}
    464  1.1  mrg     }
    465  1.1  mrg   else if (RECORD_OR_UNION_TYPE_P (type))
    466  1.1  mrg     {
    467  1.1  mrg       /* Remove members that are not FIELD_DECLs from the field list
    468  1.1  mrg 	 of an aggregate.  These occur in C++.  */
    469  1.1  mrg       for (tree *prev = &TYPE_FIELDS (type), member; (member = *prev);)
    470  1.1  mrg 	if (TREE_CODE (member) == FIELD_DECL)
    471  1.1  mrg 	  prev = &DECL_CHAIN (member);
    472  1.1  mrg 	else
    473  1.1  mrg 	  *prev = DECL_CHAIN (member);
    474  1.1  mrg 
    475  1.1  mrg       TYPE_VFIELD (type) = NULL_TREE;
    476  1.1  mrg 
    477  1.1  mrg       if (TYPE_BINFO (type))
    478  1.1  mrg 	{
    479  1.1  mrg 	  free_lang_data_in_binfo (TYPE_BINFO (type));
    480  1.1  mrg 	  /* We need to preserve link to bases and virtual table for all
    481  1.1  mrg 	     polymorphic types to make devirtualization machinery working.  */
    482  1.1  mrg 	  if (!BINFO_VTABLE (TYPE_BINFO (type)))
    483  1.1  mrg 	    TYPE_BINFO (type) = NULL;
    484  1.1  mrg 	}
    485  1.1  mrg     }
    486  1.1  mrg   else if (INTEGRAL_TYPE_P (type)
    487  1.1  mrg 	   || SCALAR_FLOAT_TYPE_P (type)
    488  1.1  mrg 	   || FIXED_POINT_TYPE_P (type))
    489  1.1  mrg     {
    490  1.1  mrg       if (TREE_CODE (type) == ENUMERAL_TYPE)
    491  1.1  mrg 	{
    492  1.1  mrg 	  ENUM_IS_OPAQUE (type) = 0;
    493  1.1  mrg 	  ENUM_IS_SCOPED (type) = 0;
    494  1.1  mrg 	  /* Type values are used only for C++ ODR checking.  Drop them
    495  1.1  mrg 	     for all type variants and non-ODR types.
    496  1.1  mrg 	     For ODR types the data is freed in free_odr_warning_data.  */
    497  1.1  mrg 	  if (!TYPE_VALUES (type))
    498  1.1  mrg 	    ;
    499  1.1  mrg 	  else if (TYPE_MAIN_VARIANT (type) != type
    500  1.1  mrg 		   || !type_with_linkage_p (type)
    501  1.1  mrg 		   || type_in_anonymous_namespace_p (type))
    502  1.1  mrg 	    TYPE_VALUES (type) = NULL;
    503  1.1  mrg 	  else
    504  1.1  mrg 	    register_odr_enum (type);
    505  1.1  mrg 	}
    506  1.1  mrg       free_lang_data_in_one_sizepos (&TYPE_MIN_VALUE (type));
    507  1.1  mrg       free_lang_data_in_one_sizepos (&TYPE_MAX_VALUE (type));
    508  1.1  mrg     }
    509  1.1  mrg 
    510  1.1  mrg   TYPE_LANG_SLOT_1 (type) = NULL_TREE;
    511  1.1  mrg 
    512  1.1  mrg   free_lang_data_in_one_sizepos (&TYPE_SIZE (type));
    513  1.1  mrg   free_lang_data_in_one_sizepos (&TYPE_SIZE_UNIT (type));
    514  1.1  mrg 
    515  1.1  mrg   if (TYPE_CONTEXT (type)
    516  1.1  mrg       && TREE_CODE (TYPE_CONTEXT (type)) == BLOCK)
    517  1.1  mrg     {
    518  1.1  mrg       tree ctx = TYPE_CONTEXT (type);
    519  1.1  mrg       do
    520  1.1  mrg 	{
    521  1.1  mrg 	  ctx = BLOCK_SUPERCONTEXT (ctx);
    522  1.1  mrg 	}
    523  1.1  mrg       while (ctx && TREE_CODE (ctx) == BLOCK);
    524  1.1  mrg       TYPE_CONTEXT (type) = ctx;
    525  1.1  mrg     }
    526  1.1  mrg 
    527  1.1  mrg   TYPE_STUB_DECL (type) = NULL;
    528  1.1  mrg   TYPE_NAME (type) = fld_simplified_type_name (type);
    529  1.1  mrg }
    530  1.1  mrg 
    531  1.1  mrg /* Reset all language specific information still present in symbol
    532  1.1  mrg    DECL.  */
    533  1.1  mrg 
    534  1.1  mrg static void
    535  1.1  mrg free_lang_data_in_decl (tree decl, class free_lang_data_d *fld)
    536  1.1  mrg {
    537  1.1  mrg   gcc_assert (DECL_P (decl));
    538  1.1  mrg 
    539  1.1  mrg   /* Give the FE a chance to remove its own data first.  */
    540  1.1  mrg   lang_hooks.free_lang_data (decl);
    541  1.1  mrg 
    542  1.1  mrg   TREE_LANG_FLAG_0 (decl) = 0;
    543  1.1  mrg   TREE_LANG_FLAG_1 (decl) = 0;
    544  1.1  mrg   TREE_LANG_FLAG_2 (decl) = 0;
    545  1.1  mrg   TREE_LANG_FLAG_3 (decl) = 0;
    546  1.1  mrg   TREE_LANG_FLAG_4 (decl) = 0;
    547  1.1  mrg   TREE_LANG_FLAG_5 (decl) = 0;
    548  1.1  mrg   TREE_LANG_FLAG_6 (decl) = 0;
    549  1.1  mrg 
    550  1.1  mrg   free_lang_data_in_one_sizepos (&DECL_SIZE (decl));
    551  1.1  mrg   free_lang_data_in_one_sizepos (&DECL_SIZE_UNIT (decl));
    552  1.1  mrg   if (TREE_CODE (decl) == FIELD_DECL)
    553  1.1  mrg     {
    554  1.1  mrg       DECL_FCONTEXT (decl) = NULL;
    555  1.1  mrg       free_lang_data_in_one_sizepos (&DECL_FIELD_OFFSET (decl));
    556  1.1  mrg       if (TREE_CODE (DECL_CONTEXT (decl)) == QUAL_UNION_TYPE)
    557  1.1  mrg 	DECL_QUALIFIER (decl) = NULL_TREE;
    558  1.1  mrg     }
    559  1.1  mrg 
    560  1.1  mrg   if (TREE_CODE (decl) == FUNCTION_DECL)
    561  1.1  mrg     {
    562  1.1  mrg       struct cgraph_node *node;
    563  1.1  mrg       /* Frontends do not set TREE_ADDRESSABLE on public variables even though
    564  1.1  mrg 	 the address may be taken in other unit, so this flag has no practical
    565  1.1  mrg 	 use for middle-end.
    566  1.1  mrg 
    567  1.1  mrg 	 It would make more sense if frontends set TREE_ADDRESSABLE to 0 only
    568  1.1  mrg 	 for public objects that indeed cannot be adressed, but it is not
    569  1.1  mrg 	 the case.  Set the flag to true so we do not get merge failures for
    570  1.1  mrg 	 i.e. virtual tables between units that take address of it and
    571  1.1  mrg 	 units that don't.  */
    572  1.1  mrg       if (TREE_PUBLIC (decl))
    573  1.1  mrg 	TREE_ADDRESSABLE (decl) = true;
    574  1.1  mrg       TREE_TYPE (decl) = fld_simplified_type (TREE_TYPE (decl), fld);
    575  1.1  mrg       if (!(node = cgraph_node::get (decl))
    576  1.1  mrg 	  || (!node->definition && !node->clones))
    577  1.1  mrg 	{
    578  1.1  mrg 	  if (node && !node->declare_variant_alt)
    579  1.1  mrg 	    node->release_body ();
    580  1.1  mrg 	  else
    581  1.1  mrg 	    {
    582  1.1  mrg 	      release_function_body (decl);
    583  1.1  mrg 	      DECL_ARGUMENTS (decl) = NULL;
    584  1.1  mrg 	      DECL_RESULT (decl) = NULL;
    585  1.1  mrg 	      DECL_INITIAL (decl) = error_mark_node;
    586  1.1  mrg 	    }
    587  1.1  mrg 	}
    588  1.1  mrg       if (gimple_has_body_p (decl) || (node && node->thunk))
    589  1.1  mrg 	{
    590  1.1  mrg 	  tree t;
    591  1.1  mrg 
    592  1.1  mrg 	  /* If DECL has a gimple body, then the context for its
    593  1.1  mrg 	     arguments must be DECL.  Otherwise, it doesn't really
    594  1.1  mrg 	     matter, as we will not be emitting any code for DECL.  In
    595  1.1  mrg 	     general, there may be other instances of DECL created by
    596  1.1  mrg 	     the front end and since PARM_DECLs are generally shared,
    597  1.1  mrg 	     their DECL_CONTEXT changes as the replicas of DECL are
    598  1.1  mrg 	     created.  The only time where DECL_CONTEXT is important
    599  1.1  mrg 	     is for the FUNCTION_DECLs that have a gimple body (since
    600  1.1  mrg 	     the PARM_DECL will be used in the function's body).  */
    601  1.1  mrg 	  for (t = DECL_ARGUMENTS (decl); t; t = TREE_CHAIN (t))
    602  1.1  mrg 	    DECL_CONTEXT (t) = decl;
    603  1.1  mrg 	  if (!DECL_FUNCTION_SPECIFIC_TARGET (decl))
    604  1.1  mrg 	    DECL_FUNCTION_SPECIFIC_TARGET (decl)
    605  1.1  mrg 	      = target_option_default_node;
    606  1.1  mrg 	  if (!DECL_FUNCTION_SPECIFIC_OPTIMIZATION (decl))
    607  1.1  mrg 	    DECL_FUNCTION_SPECIFIC_OPTIMIZATION (decl)
    608  1.1  mrg 	      = optimization_default_node;
    609  1.1  mrg 	}
    610  1.1  mrg 
    611  1.1  mrg       /* DECL_SAVED_TREE holds the GENERIC representation for DECL.
    612  1.1  mrg 	 At this point, it is not needed anymore.  */
    613  1.1  mrg       DECL_SAVED_TREE (decl) = NULL_TREE;
    614  1.1  mrg 
    615  1.1  mrg       /* Clear the abstract origin if it refers to a method.
    616  1.1  mrg          Otherwise dwarf2out.cc will ICE as we splice functions out of
    617  1.1  mrg          TYPE_FIELDS and thus the origin will not be output
    618  1.1  mrg          correctly.  */
    619  1.1  mrg       if (DECL_ABSTRACT_ORIGIN (decl)
    620  1.1  mrg 	  && DECL_CONTEXT (DECL_ABSTRACT_ORIGIN (decl))
    621  1.1  mrg 	  && RECORD_OR_UNION_TYPE_P
    622  1.1  mrg 	  (DECL_CONTEXT (DECL_ABSTRACT_ORIGIN (decl))))
    623  1.1  mrg 	DECL_ABSTRACT_ORIGIN (decl) = NULL_TREE;
    624  1.1  mrg 
    625  1.1  mrg       DECL_VINDEX (decl) = NULL_TREE;
    626  1.1  mrg     }
    627  1.1  mrg   else if (VAR_P (decl))
    628  1.1  mrg     {
    629  1.1  mrg       /* See comment above why we set the flag for functions.  */
    630  1.1  mrg       if (TREE_PUBLIC (decl))
    631  1.1  mrg 	TREE_ADDRESSABLE (decl) = true;
    632  1.1  mrg       if ((DECL_EXTERNAL (decl)
    633  1.1  mrg 	   && (!TREE_STATIC (decl) || !TREE_READONLY (decl)))
    634  1.1  mrg 	  || (decl_function_context (decl) && !TREE_STATIC (decl)))
    635  1.1  mrg 	DECL_INITIAL (decl) = NULL_TREE;
    636  1.1  mrg     }
    637  1.1  mrg   else if (TREE_CODE (decl) == TYPE_DECL)
    638  1.1  mrg     {
    639  1.1  mrg       DECL_VISIBILITY (decl) = VISIBILITY_DEFAULT;
    640  1.1  mrg       DECL_VISIBILITY_SPECIFIED (decl) = 0;
    641  1.1  mrg       TREE_PUBLIC (decl) = 0;
    642  1.1  mrg       TREE_PRIVATE (decl) = 0;
    643  1.1  mrg       DECL_ARTIFICIAL (decl) = 0;
    644  1.1  mrg       TYPE_DECL_SUPPRESS_DEBUG (decl) = 0;
    645  1.1  mrg       DECL_INITIAL (decl) = NULL_TREE;
    646  1.1  mrg       DECL_ORIGINAL_TYPE (decl) = NULL_TREE;
    647  1.1  mrg       DECL_MODE (decl) = VOIDmode;
    648  1.1  mrg       SET_DECL_ALIGN (decl, 0);
    649  1.1  mrg       /* TREE_TYPE is cleared at WPA time in free_odr_warning_data.  */
    650  1.1  mrg     }
    651  1.1  mrg   else if (TREE_CODE (decl) == FIELD_DECL)
    652  1.1  mrg     {
    653  1.1  mrg       TREE_TYPE (decl) = fld_simplified_type (TREE_TYPE (decl), fld);
    654  1.1  mrg       DECL_INITIAL (decl) = NULL_TREE;
    655  1.1  mrg     }
    656  1.1  mrg   else if (TREE_CODE (decl) == TRANSLATION_UNIT_DECL
    657  1.1  mrg            && DECL_INITIAL (decl)
    658  1.1  mrg            && TREE_CODE (DECL_INITIAL (decl)) == BLOCK)
    659  1.1  mrg     {
    660  1.1  mrg       /* Strip builtins from the translation-unit BLOCK.  We still have targets
    661  1.1  mrg 	 without builtin_decl_explicit support and also builtins are shared
    662  1.1  mrg 	 nodes and thus we can't use TREE_CHAIN in multiple lists.  */
    663  1.1  mrg       tree *nextp = &BLOCK_VARS (DECL_INITIAL (decl));
    664  1.1  mrg       while (*nextp)
    665  1.1  mrg 	{
    666  1.1  mrg 	  tree var = *nextp;
    667  1.1  mrg 	  if (TREE_CODE (var) == FUNCTION_DECL
    668  1.1  mrg 	      && fndecl_built_in_p (var))
    669  1.1  mrg 	    *nextp = TREE_CHAIN (var);
    670  1.1  mrg 	  else
    671  1.1  mrg 	    nextp = &TREE_CHAIN (var);
    672  1.1  mrg         }
    673  1.1  mrg     }
    674  1.1  mrg   /* We need to keep field decls associated with their trees. Otherwise tree
    675  1.1  mrg      merging may merge some fields and keep others disjoint which in turn will
    676  1.1  mrg      not do well with TREE_CHAIN pointers linking them.
    677  1.1  mrg 
    678  1.1  mrg      Also do not drop containing types for virtual methods and tables because
    679  1.1  mrg      these are needed by devirtualization.
    680  1.1  mrg      C++ destructors are special because C++ frontends sometimes produces
    681  1.1  mrg      virtual destructor as an alias of non-virtual destructor.  In
    682  1.1  mrg      devirutalization code we always walk through aliases and we need
    683  1.1  mrg      context to be preserved too.  See PR89335  */
    684  1.1  mrg   if (TREE_CODE (decl) != FIELD_DECL
    685  1.1  mrg       && ((TREE_CODE (decl) != VAR_DECL && TREE_CODE (decl) != FUNCTION_DECL)
    686  1.1  mrg           || (!DECL_VIRTUAL_P (decl)
    687  1.1  mrg 	      && (TREE_CODE (decl) != FUNCTION_DECL
    688  1.1  mrg 		  || !DECL_CXX_DESTRUCTOR_P (decl)))))
    689  1.1  mrg     DECL_CONTEXT (decl) = fld_decl_context (DECL_CONTEXT (decl));
    690  1.1  mrg }
    691  1.1  mrg 
    692  1.1  mrg 
    693  1.1  mrg /* Operand callback helper for free_lang_data_in_node.  *TP is the
    694  1.1  mrg    subtree operand being considered.  */
    695  1.1  mrg 
    696  1.1  mrg static tree
    697  1.1  mrg find_decls_types_r (tree *tp, int *ws, void *data)
    698  1.1  mrg {
    699  1.1  mrg   tree t = *tp;
    700  1.1  mrg   class free_lang_data_d *fld = (class free_lang_data_d *) data;
    701  1.1  mrg 
    702  1.1  mrg   if (TREE_CODE (t) == TREE_LIST)
    703  1.1  mrg     return NULL_TREE;
    704  1.1  mrg 
    705  1.1  mrg   /* Language specific nodes will be removed, so there is no need
    706  1.1  mrg      to gather anything under them.  */
    707  1.1  mrg   if (is_lang_specific (t))
    708  1.1  mrg     {
    709  1.1  mrg       *ws = 0;
    710  1.1  mrg       return NULL_TREE;
    711  1.1  mrg     }
    712  1.1  mrg 
    713  1.1  mrg   if (DECL_P (t))
    714  1.1  mrg     {
    715  1.1  mrg       /* Note that walk_tree does not traverse every possible field in
    716  1.1  mrg 	 decls, so we have to do our own traversals here.  */
    717  1.1  mrg       add_tree_to_fld_list (t, fld);
    718  1.1  mrg 
    719  1.1  mrg       fld_worklist_push (DECL_NAME (t), fld);
    720  1.1  mrg       fld_worklist_push (DECL_CONTEXT (t), fld);
    721  1.1  mrg       fld_worklist_push (DECL_SIZE (t), fld);
    722  1.1  mrg       fld_worklist_push (DECL_SIZE_UNIT (t), fld);
    723  1.1  mrg 
    724  1.1  mrg       /* We are going to remove everything under DECL_INITIAL for
    725  1.1  mrg 	 TYPE_DECLs.  No point walking them.  */
    726  1.1  mrg       if (TREE_CODE (t) != TYPE_DECL)
    727  1.1  mrg 	fld_worklist_push (DECL_INITIAL (t), fld);
    728  1.1  mrg 
    729  1.1  mrg       fld_worklist_push (DECL_ATTRIBUTES (t), fld);
    730  1.1  mrg       fld_worklist_push (DECL_ABSTRACT_ORIGIN (t), fld);
    731  1.1  mrg 
    732  1.1  mrg       if (TREE_CODE (t) == FUNCTION_DECL)
    733  1.1  mrg 	{
    734  1.1  mrg 	  fld_worklist_push (DECL_ARGUMENTS (t), fld);
    735  1.1  mrg 	  fld_worklist_push (DECL_RESULT (t), fld);
    736  1.1  mrg 	}
    737  1.1  mrg       else if (TREE_CODE (t) == FIELD_DECL)
    738  1.1  mrg 	{
    739  1.1  mrg 	  fld_worklist_push (DECL_FIELD_OFFSET (t), fld);
    740  1.1  mrg 	  fld_worklist_push (DECL_BIT_FIELD_TYPE (t), fld);
    741  1.1  mrg 	  fld_worklist_push (DECL_FIELD_BIT_OFFSET (t), fld);
    742  1.1  mrg 	  fld_worklist_push (DECL_FCONTEXT (t), fld);
    743  1.1  mrg 	}
    744  1.1  mrg 
    745  1.1  mrg       if ((VAR_P (t) || TREE_CODE (t) == PARM_DECL)
    746  1.1  mrg 	  && DECL_HAS_VALUE_EXPR_P (t))
    747  1.1  mrg 	fld_worklist_push (DECL_VALUE_EXPR (t), fld);
    748  1.1  mrg 
    749  1.1  mrg       if (TREE_CODE (t) != FIELD_DECL
    750  1.1  mrg 	  && TREE_CODE (t) != TYPE_DECL)
    751  1.1  mrg 	fld_worklist_push (TREE_CHAIN (t), fld);
    752  1.1  mrg       *ws = 0;
    753  1.1  mrg     }
    754  1.1  mrg   else if (TYPE_P (t))
    755  1.1  mrg     {
    756  1.1  mrg       /* Note that walk_tree does not traverse every possible field in
    757  1.1  mrg 	 types, so we have to do our own traversals here.  */
    758  1.1  mrg       add_tree_to_fld_list (t, fld);
    759  1.1  mrg 
    760  1.1  mrg       if (!RECORD_OR_UNION_TYPE_P (t))
    761  1.1  mrg 	fld_worklist_push (TYPE_CACHED_VALUES (t), fld);
    762  1.1  mrg       fld_worklist_push (TYPE_SIZE (t), fld);
    763  1.1  mrg       fld_worklist_push (TYPE_SIZE_UNIT (t), fld);
    764  1.1  mrg       fld_worklist_push (TYPE_ATTRIBUTES (t), fld);
    765  1.1  mrg       fld_worklist_push (TYPE_POINTER_TO (t), fld);
    766  1.1  mrg       fld_worklist_push (TYPE_REFERENCE_TO (t), fld);
    767  1.1  mrg       fld_worklist_push (TYPE_NAME (t), fld);
    768  1.1  mrg       /* While we do not stream TYPE_POINTER_TO and TYPE_REFERENCE_TO
    769  1.1  mrg 	 lists, we may look types up in these lists and use them while
    770  1.1  mrg 	 optimizing the function body.  Thus we need to free lang data
    771  1.1  mrg 	 in them.  */
    772  1.1  mrg       if (TREE_CODE (t) == POINTER_TYPE)
    773  1.1  mrg 	fld_worklist_push (TYPE_NEXT_PTR_TO (t), fld);
    774  1.1  mrg       if (TREE_CODE (t) == REFERENCE_TYPE)
    775  1.1  mrg 	fld_worklist_push (TYPE_NEXT_REF_TO (t), fld);
    776  1.1  mrg       if (!POINTER_TYPE_P (t))
    777  1.1  mrg 	fld_worklist_push (TYPE_MIN_VALUE_RAW (t), fld);
    778  1.1  mrg       /* TYPE_MAX_VALUE_RAW is TYPE_BINFO for record types.  */
    779  1.1  mrg       if (!RECORD_OR_UNION_TYPE_P (t))
    780  1.1  mrg 	fld_worklist_push (TYPE_MAX_VALUE_RAW (t), fld);
    781  1.1  mrg       fld_worklist_push (TYPE_MAIN_VARIANT (t), fld);
    782  1.1  mrg       /* Do not walk TYPE_NEXT_VARIANT.  We do not stream it and thus
    783  1.1  mrg 	 do not and want not to reach unused variants this way.  */
    784  1.1  mrg       if (TYPE_CONTEXT (t))
    785  1.1  mrg 	{
    786  1.1  mrg 	  tree ctx = TYPE_CONTEXT (t);
    787  1.1  mrg 	  /* We adjust BLOCK TYPE_CONTEXTs to the innermost non-BLOCK one.
    788  1.1  mrg 	     So push that instead.  */
    789  1.1  mrg 	  while (ctx && TREE_CODE (ctx) == BLOCK)
    790  1.1  mrg 	    ctx = BLOCK_SUPERCONTEXT (ctx);
    791  1.1  mrg 	  fld_worklist_push (ctx, fld);
    792  1.1  mrg 	}
    793  1.1  mrg       fld_worklist_push (TYPE_CANONICAL (t), fld);
    794  1.1  mrg 
    795  1.1  mrg       if (RECORD_OR_UNION_TYPE_P (t) && TYPE_BINFO (t))
    796  1.1  mrg 	{
    797  1.1  mrg 	  unsigned i;
    798  1.1  mrg 	  tree tem;
    799  1.1  mrg 	  FOR_EACH_VEC_ELT (*BINFO_BASE_BINFOS (TYPE_BINFO (t)), i, tem)
    800  1.1  mrg 	    fld_worklist_push (TREE_TYPE (tem), fld);
    801  1.1  mrg 	  fld_worklist_push (BINFO_TYPE (TYPE_BINFO (t)), fld);
    802  1.1  mrg 	  fld_worklist_push (BINFO_VTABLE (TYPE_BINFO (t)), fld);
    803  1.1  mrg 	}
    804  1.1  mrg       if (RECORD_OR_UNION_TYPE_P (t))
    805  1.1  mrg 	{
    806  1.1  mrg 	  tree tem;
    807  1.1  mrg 	  /* Push all TYPE_FIELDS - there can be interleaving interesting
    808  1.1  mrg 	     and non-interesting things.  */
    809  1.1  mrg 	  tem = TYPE_FIELDS (t);
    810  1.1  mrg 	  while (tem)
    811  1.1  mrg 	    {
    812  1.1  mrg 	      if (TREE_CODE (tem) == FIELD_DECL)
    813  1.1  mrg 		fld_worklist_push (tem, fld);
    814  1.1  mrg 	      tem = TREE_CHAIN (tem);
    815  1.1  mrg 	    }
    816  1.1  mrg 	}
    817  1.1  mrg       if (FUNC_OR_METHOD_TYPE_P (t))
    818  1.1  mrg 	fld_worklist_push (TYPE_METHOD_BASETYPE (t), fld);
    819  1.1  mrg 
    820  1.1  mrg       fld_worklist_push (TYPE_STUB_DECL (t), fld);
    821  1.1  mrg       *ws = 0;
    822  1.1  mrg     }
    823  1.1  mrg   else if (TREE_CODE (t) == BLOCK)
    824  1.1  mrg     {
    825  1.1  mrg       for (tree *tem = &BLOCK_VARS (t); *tem; )
    826  1.1  mrg 	{
    827  1.1  mrg 	  if (TREE_CODE (*tem) != LABEL_DECL
    828  1.1  mrg 	      && (TREE_CODE (*tem) != VAR_DECL
    829  1.1  mrg 		  || !auto_var_in_fn_p (*tem, DECL_CONTEXT (*tem))))
    830  1.1  mrg 	    {
    831  1.1  mrg 	      gcc_assert (TREE_CODE (*tem) != RESULT_DECL
    832  1.1  mrg 			  && TREE_CODE (*tem) != PARM_DECL);
    833  1.1  mrg 	      *tem = TREE_CHAIN (*tem);
    834  1.1  mrg 	    }
    835  1.1  mrg 	  else
    836  1.1  mrg 	    {
    837  1.1  mrg 	      fld_worklist_push (*tem, fld);
    838  1.1  mrg 	      tem = &TREE_CHAIN (*tem);
    839  1.1  mrg 	    }
    840  1.1  mrg 	}
    841  1.1  mrg       for (tree tem = BLOCK_SUBBLOCKS (t); tem; tem = BLOCK_CHAIN (tem))
    842  1.1  mrg 	fld_worklist_push (tem, fld);
    843  1.1  mrg       fld_worklist_push (BLOCK_ABSTRACT_ORIGIN (t), fld);
    844  1.1  mrg     }
    845  1.1  mrg   /* walk_tree does not visit ce->index which can be a FIELD_DECL, pulling
    846  1.1  mrg      in otherwise unused structure fields so handle CTORs explicitly.  */
    847  1.1  mrg   else if (TREE_CODE (t) == CONSTRUCTOR)
    848  1.1  mrg     {
    849  1.1  mrg       unsigned HOST_WIDE_INT idx;
    850  1.1  mrg       constructor_elt *ce;
    851  1.1  mrg       for (idx = 0; vec_safe_iterate (CONSTRUCTOR_ELTS (t), idx, &ce); idx++)
    852  1.1  mrg 	{
    853  1.1  mrg 	  if (ce->index)
    854  1.1  mrg 	    fld_worklist_push (ce->index, fld);
    855  1.1  mrg 	  fld_worklist_push (ce->value, fld);
    856  1.1  mrg 	}
    857  1.1  mrg       *ws = 0;
    858  1.1  mrg     }
    859  1.1  mrg 
    860  1.1  mrg   if (TREE_CODE (t) != IDENTIFIER_NODE
    861  1.1  mrg       && CODE_CONTAINS_STRUCT (TREE_CODE (t), TS_TYPED))
    862  1.1  mrg     fld_worklist_push (TREE_TYPE (t), fld);
    863  1.1  mrg 
    864  1.1  mrg   return NULL_TREE;
    865  1.1  mrg }
    866  1.1  mrg 
    867  1.1  mrg 
    868  1.1  mrg /* Find decls and types in T.  */
    869  1.1  mrg 
    870  1.1  mrg static void
    871  1.1  mrg find_decls_types (tree t, class free_lang_data_d *fld)
    872  1.1  mrg {
    873  1.1  mrg   while (1)
    874  1.1  mrg     {
    875  1.1  mrg       if (!fld->pset.contains (t))
    876  1.1  mrg 	walk_tree (&t, find_decls_types_r, fld, &fld->pset);
    877  1.1  mrg       if (fld->worklist.is_empty ())
    878  1.1  mrg 	break;
    879  1.1  mrg       t = fld->worklist.pop ();
    880  1.1  mrg     }
    881  1.1  mrg }
    882  1.1  mrg 
    883  1.1  mrg /* Translate all the types in LIST with the corresponding runtime
    884  1.1  mrg    types.  */
    885  1.1  mrg 
    886  1.1  mrg static tree
    887  1.1  mrg get_eh_types_for_runtime (tree list)
    888  1.1  mrg {
    889  1.1  mrg   tree head, prev;
    890  1.1  mrg 
    891  1.1  mrg   if (list == NULL_TREE)
    892  1.1  mrg     return NULL_TREE;
    893  1.1  mrg 
    894  1.1  mrg   head = build_tree_list (0, lookup_type_for_runtime (TREE_VALUE (list)));
    895  1.1  mrg   prev = head;
    896  1.1  mrg   list = TREE_CHAIN (list);
    897  1.1  mrg   while (list)
    898  1.1  mrg     {
    899  1.1  mrg       tree n = build_tree_list (0, lookup_type_for_runtime (TREE_VALUE (list)));
    900  1.1  mrg       TREE_CHAIN (prev) = n;
    901  1.1  mrg       prev = TREE_CHAIN (prev);
    902  1.1  mrg       list = TREE_CHAIN (list);
    903  1.1  mrg     }
    904  1.1  mrg 
    905  1.1  mrg   return head;
    906  1.1  mrg }
    907  1.1  mrg 
    908  1.1  mrg 
    909  1.1  mrg /* Find decls and types referenced in EH region R and store them in
    910  1.1  mrg    FLD->DECLS and FLD->TYPES.  */
    911  1.1  mrg 
    912  1.1  mrg static void
    913  1.1  mrg find_decls_types_in_eh_region (eh_region r, class free_lang_data_d *fld)
    914  1.1  mrg {
    915  1.1  mrg   switch (r->type)
    916  1.1  mrg     {
    917  1.1  mrg     case ERT_CLEANUP:
    918  1.1  mrg       break;
    919  1.1  mrg 
    920  1.1  mrg     case ERT_TRY:
    921  1.1  mrg       {
    922  1.1  mrg 	eh_catch c;
    923  1.1  mrg 
    924  1.1  mrg 	/* The types referenced in each catch must first be changed to the
    925  1.1  mrg 	   EH types used at runtime.  This removes references to FE types
    926  1.1  mrg 	   in the region.  */
    927  1.1  mrg 	for (c = r->u.eh_try.first_catch; c ; c = c->next_catch)
    928  1.1  mrg 	  {
    929  1.1  mrg 	    c->type_list = get_eh_types_for_runtime (c->type_list);
    930  1.1  mrg 	    walk_tree (&c->type_list, find_decls_types_r, fld, &fld->pset);
    931  1.1  mrg 	  }
    932  1.1  mrg       }
    933  1.1  mrg       break;
    934  1.1  mrg 
    935  1.1  mrg     case ERT_ALLOWED_EXCEPTIONS:
    936  1.1  mrg       r->u.allowed.type_list
    937  1.1  mrg 	= get_eh_types_for_runtime (r->u.allowed.type_list);
    938  1.1  mrg       walk_tree (&r->u.allowed.type_list, find_decls_types_r, fld, &fld->pset);
    939  1.1  mrg       break;
    940  1.1  mrg 
    941  1.1  mrg     case ERT_MUST_NOT_THROW:
    942  1.1  mrg       walk_tree (&r->u.must_not_throw.failure_decl,
    943  1.1  mrg 		 find_decls_types_r, fld, &fld->pset);
    944  1.1  mrg       break;
    945  1.1  mrg     }
    946  1.1  mrg }
    947  1.1  mrg 
    948  1.1  mrg 
    949  1.1  mrg /* Find decls and types referenced in cgraph node N and store them in
    950  1.1  mrg    FLD->DECLS and FLD->TYPES.  Unlike pass_referenced_vars, this will
    951  1.1  mrg    look for *every* kind of DECL and TYPE node reachable from N,
    952  1.1  mrg    including those embedded inside types and decls (i.e,, TYPE_DECLs,
    953  1.1  mrg    NAMESPACE_DECLs, etc).  */
    954  1.1  mrg 
    955  1.1  mrg static void
    956  1.1  mrg find_decls_types_in_node (struct cgraph_node *n, class free_lang_data_d *fld)
    957  1.1  mrg {
    958  1.1  mrg   basic_block bb;
    959  1.1  mrg   struct function *fn;
    960  1.1  mrg   unsigned ix;
    961  1.1  mrg   tree t;
    962  1.1  mrg 
    963  1.1  mrg   find_decls_types (n->decl, fld);
    964  1.1  mrg 
    965  1.1  mrg   if (!gimple_has_body_p (n->decl))
    966  1.1  mrg     return;
    967  1.1  mrg 
    968  1.1  mrg   gcc_assert (current_function_decl == NULL_TREE && cfun == NULL);
    969  1.1  mrg 
    970  1.1  mrg   fn = DECL_STRUCT_FUNCTION (n->decl);
    971  1.1  mrg 
    972  1.1  mrg   /* Traverse locals. */
    973  1.1  mrg   FOR_EACH_LOCAL_DECL (fn, ix, t)
    974  1.1  mrg     find_decls_types (t, fld);
    975  1.1  mrg 
    976  1.1  mrg   /* Traverse EH regions in FN.  */
    977  1.1  mrg   {
    978  1.1  mrg     eh_region r;
    979  1.1  mrg     FOR_ALL_EH_REGION_FN (r, fn)
    980  1.1  mrg       find_decls_types_in_eh_region (r, fld);
    981  1.1  mrg   }
    982  1.1  mrg 
    983  1.1  mrg   /* Traverse every statement in FN.  */
    984  1.1  mrg   FOR_EACH_BB_FN (bb, fn)
    985  1.1  mrg     {
    986  1.1  mrg       gphi_iterator psi;
    987  1.1  mrg       gimple_stmt_iterator si;
    988  1.1  mrg       unsigned i;
    989  1.1  mrg 
    990  1.1  mrg       for (psi = gsi_start_phis (bb); !gsi_end_p (psi); gsi_next (&psi))
    991  1.1  mrg 	{
    992  1.1  mrg 	  gphi *phi = psi.phi ();
    993  1.1  mrg 
    994  1.1  mrg 	  for (i = 0; i < gimple_phi_num_args (phi); i++)
    995  1.1  mrg 	    {
    996  1.1  mrg 	      tree *arg_p = gimple_phi_arg_def_ptr (phi, i);
    997  1.1  mrg 	      find_decls_types (*arg_p, fld);
    998  1.1  mrg 	    }
    999  1.1  mrg 	}
   1000  1.1  mrg 
   1001  1.1  mrg       for (si = gsi_start_bb (bb); !gsi_end_p (si); gsi_next (&si))
   1002  1.1  mrg 	{
   1003  1.1  mrg 	  gimple *stmt = gsi_stmt (si);
   1004  1.1  mrg 
   1005  1.1  mrg 	  if (is_gimple_call (stmt))
   1006  1.1  mrg 	    find_decls_types (gimple_call_fntype (stmt), fld);
   1007  1.1  mrg 
   1008  1.1  mrg 	  for (i = 0; i < gimple_num_ops (stmt); i++)
   1009  1.1  mrg 	    {
   1010  1.1  mrg 	      tree arg = gimple_op (stmt, i);
   1011  1.1  mrg 	      find_decls_types (arg, fld);
   1012  1.1  mrg 	      /* find_decls_types doesn't walk TREE_PURPOSE of TREE_LISTs,
   1013  1.1  mrg 		 which we need for asm stmts.  */
   1014  1.1  mrg 	      if (arg
   1015  1.1  mrg 		  && TREE_CODE (arg) == TREE_LIST
   1016  1.1  mrg 		  && TREE_PURPOSE (arg)
   1017  1.1  mrg 		  && gimple_code (stmt) == GIMPLE_ASM)
   1018  1.1  mrg 		find_decls_types (TREE_PURPOSE (arg), fld);
   1019  1.1  mrg 	    }
   1020  1.1  mrg 	}
   1021  1.1  mrg     }
   1022  1.1  mrg }
   1023  1.1  mrg 
   1024  1.1  mrg 
   1025  1.1  mrg /* Find decls and types referenced in varpool node N and store them in
   1026  1.1  mrg    FLD->DECLS and FLD->TYPES.  Unlike pass_referenced_vars, this will
   1027  1.1  mrg    look for *every* kind of DECL and TYPE node reachable from N,
   1028  1.1  mrg    including those embedded inside types and decls (i.e,, TYPE_DECLs,
   1029  1.1  mrg    NAMESPACE_DECLs, etc).  */
   1030  1.1  mrg 
   1031  1.1  mrg static void
   1032  1.1  mrg find_decls_types_in_var (varpool_node *v, class free_lang_data_d *fld)
   1033  1.1  mrg {
   1034  1.1  mrg   find_decls_types (v->decl, fld);
   1035  1.1  mrg }
   1036  1.1  mrg 
   1037  1.1  mrg /* Free language specific information for every operand and expression
   1038  1.1  mrg    in every node of the call graph.  This process operates in three stages:
   1039  1.1  mrg 
   1040  1.1  mrg    1- Every callgraph node and varpool node is traversed looking for
   1041  1.1  mrg    decls and types embedded in them.  This is a more exhaustive
   1042  1.1  mrg    search than that done by find_referenced_vars, because it will
   1043  1.1  mrg    also collect individual fields, decls embedded in types, etc.
   1044  1.1  mrg 
   1045  1.1  mrg    2- All the decls found are sent to free_lang_data_in_decl.
   1046  1.1  mrg 
   1047  1.1  mrg    3- All the types found are sent to free_lang_data_in_type.
   1048  1.1  mrg 
   1049  1.1  mrg    The ordering between decls and types is important because
   1050  1.1  mrg    free_lang_data_in_decl sets assembler names, which includes
   1051  1.1  mrg    mangling.  So types cannot be freed up until assembler names have
   1052  1.1  mrg    been set up.  */
   1053  1.1  mrg 
   1054  1.1  mrg static void
   1055  1.1  mrg free_lang_data_in_cgraph (class free_lang_data_d *fld)
   1056  1.1  mrg {
   1057  1.1  mrg   struct cgraph_node *n;
   1058  1.1  mrg   varpool_node *v;
   1059  1.1  mrg   tree t;
   1060  1.1  mrg   unsigned i;
   1061  1.1  mrg   alias_pair *p;
   1062  1.1  mrg 
   1063  1.1  mrg   /* Find decls and types in the body of every function in the callgraph.  */
   1064  1.1  mrg   FOR_EACH_FUNCTION (n)
   1065  1.1  mrg     find_decls_types_in_node (n, fld);
   1066  1.1  mrg 
   1067  1.1  mrg   FOR_EACH_VEC_SAFE_ELT (alias_pairs, i, p)
   1068  1.1  mrg     find_decls_types (p->decl, fld);
   1069  1.1  mrg 
   1070  1.1  mrg   /* Find decls and types in every varpool symbol.  */
   1071  1.1  mrg   FOR_EACH_VARIABLE (v)
   1072  1.1  mrg     find_decls_types_in_var (v, fld);
   1073  1.1  mrg 
   1074  1.1  mrg   /* Set the assembler name on every decl found.  We need to do this
   1075  1.1  mrg      now because free_lang_data_in_decl will invalidate data needed
   1076  1.1  mrg      for mangling.  This breaks mangling on interdependent decls.  */
   1077  1.1  mrg   FOR_EACH_VEC_ELT (fld->decls, i, t)
   1078  1.1  mrg     assign_assembler_name_if_needed (t);
   1079  1.1  mrg 
   1080  1.1  mrg   /* Traverse every decl found freeing its language data.  */
   1081  1.1  mrg   FOR_EACH_VEC_ELT (fld->decls, i, t)
   1082  1.1  mrg     free_lang_data_in_decl (t, fld);
   1083  1.1  mrg 
   1084  1.1  mrg   /* Traverse every type found freeing its language data.  */
   1085  1.1  mrg   FOR_EACH_VEC_ELT (fld->types, i, t)
   1086  1.1  mrg     free_lang_data_in_type (t, fld);
   1087  1.1  mrg }
   1088  1.1  mrg 
   1089  1.1  mrg 
   1090  1.1  mrg /* Free resources that are used by FE but are not needed once they are done. */
   1091  1.1  mrg 
   1092  1.1  mrg static unsigned
   1093  1.1  mrg free_lang_data (void)
   1094  1.1  mrg {
   1095  1.1  mrg   unsigned i;
   1096  1.1  mrg   class free_lang_data_d fld;
   1097  1.1  mrg 
   1098  1.1  mrg   /* If we are the LTO frontend we have freed lang-specific data already.  */
   1099  1.1  mrg   if (in_lto_p
   1100  1.1  mrg       || (!flag_generate_lto && !flag_generate_offload))
   1101  1.1  mrg     {
   1102  1.1  mrg       /* Rebuild type inheritance graph even when not doing LTO to get
   1103  1.1  mrg 	 consistent profile data.  */
   1104  1.1  mrg       rebuild_type_inheritance_graph ();
   1105  1.1  mrg       return 0;
   1106  1.1  mrg     }
   1107  1.1  mrg 
   1108  1.1  mrg   fld_incomplete_types = new hash_map<tree, tree>;
   1109  1.1  mrg   fld_simplified_types = new hash_map<tree, tree>;
   1110  1.1  mrg 
   1111  1.1  mrg   /* Provide a dummy TRANSLATION_UNIT_DECL if the FE failed to provide one.  */
   1112  1.1  mrg   if (vec_safe_is_empty (all_translation_units))
   1113  1.1  mrg     build_translation_unit_decl (NULL_TREE);
   1114  1.1  mrg 
   1115  1.1  mrg   /* Allocate and assign alias sets to the standard integer types
   1116  1.1  mrg      while the slots are still in the way the frontends generated them.  */
   1117  1.1  mrg   for (i = 0; i < itk_none; ++i)
   1118  1.1  mrg     if (integer_types[i])
   1119  1.1  mrg       TYPE_ALIAS_SET (integer_types[i]) = get_alias_set (integer_types[i]);
   1120  1.1  mrg 
   1121  1.1  mrg   /* Traverse the IL resetting language specific information for
   1122  1.1  mrg      operands, expressions, etc.  */
   1123  1.1  mrg   free_lang_data_in_cgraph (&fld);
   1124  1.1  mrg 
   1125  1.1  mrg   /* Create gimple variants for common types.  */
   1126  1.1  mrg   for (unsigned i = 0;
   1127  1.1  mrg        i < sizeof (builtin_structptr_types) / sizeof (builtin_structptr_type);
   1128  1.1  mrg        ++i)
   1129  1.1  mrg     builtin_structptr_types[i].node = builtin_structptr_types[i].base;
   1130  1.1  mrg 
   1131  1.1  mrg   /* Reset some langhooks.  Do not reset types_compatible_p, it may
   1132  1.1  mrg      still be used indirectly via the get_alias_set langhook.  */
   1133  1.1  mrg   lang_hooks.dwarf_name = lhd_dwarf_name;
   1134  1.1  mrg   lang_hooks.decl_printable_name = gimple_decl_printable_name;
   1135  1.1  mrg   lang_hooks.gimplify_expr = lhd_gimplify_expr;
   1136  1.1  mrg   lang_hooks.overwrite_decl_assembler_name = lhd_overwrite_decl_assembler_name;
   1137  1.1  mrg   lang_hooks.print_xnode = lhd_print_tree_nothing;
   1138  1.1  mrg   lang_hooks.print_decl = lhd_print_tree_nothing;
   1139  1.1  mrg   lang_hooks.print_type = lhd_print_tree_nothing;
   1140  1.1  mrg   lang_hooks.print_identifier = lhd_print_tree_nothing;
   1141  1.1  mrg 
   1142  1.1  mrg   lang_hooks.tree_inlining.var_mod_type_p = hook_bool_tree_tree_false;
   1143  1.1  mrg 
   1144  1.1  mrg   if (flag_checking)
   1145  1.1  mrg     {
   1146  1.1  mrg       int i;
   1147  1.1  mrg       tree t;
   1148  1.1  mrg 
   1149  1.1  mrg       FOR_EACH_VEC_ELT (fld.types, i, t)
   1150  1.1  mrg 	verify_type (t);
   1151  1.1  mrg     }
   1152  1.1  mrg 
   1153  1.1  mrg   /* We do not want the default decl_assembler_name implementation,
   1154  1.1  mrg      rather if we have fixed everything we want a wrapper around it
   1155  1.1  mrg      asserting that all non-local symbols already got their assembler
   1156  1.1  mrg      name and only produce assembler names for local symbols.  Or rather
   1157  1.1  mrg      make sure we never call decl_assembler_name on local symbols and
   1158  1.1  mrg      devise a separate, middle-end private scheme for it.  */
   1159  1.1  mrg 
   1160  1.1  mrg   /* Reset diagnostic machinery.  */
   1161  1.1  mrg   tree_diagnostics_defaults (global_dc);
   1162  1.1  mrg 
   1163  1.1  mrg   rebuild_type_inheritance_graph ();
   1164  1.1  mrg 
   1165  1.1  mrg   delete fld_incomplete_types;
   1166  1.1  mrg   delete fld_simplified_types;
   1167  1.1  mrg 
   1168  1.1  mrg   return 0;
   1169  1.1  mrg }
   1170  1.1  mrg 
   1171  1.1  mrg const pass_data pass_data_ipa_free_lang_data =
   1172  1.1  mrg   {
   1173  1.1  mrg    SIMPLE_IPA_PASS, /* type */
   1174  1.1  mrg    "*free_lang_data", /* name */
   1175  1.1  mrg    OPTGROUP_NONE, /* optinfo_flags */
   1176  1.1  mrg    TV_IPA_FREE_LANG_DATA, /* tv_id */
   1177  1.1  mrg    0, /* properties_required */
   1178  1.1  mrg    0, /* properties_provided */
   1179  1.1  mrg    0, /* properties_destroyed */
   1180  1.1  mrg    0, /* todo_flags_start */
   1181  1.1  mrg    0, /* todo_flags_finish */
   1182  1.1  mrg   };
   1183  1.1  mrg 
   1184  1.1  mrg class pass_ipa_free_lang_data : public simple_ipa_opt_pass
   1185  1.1  mrg {
   1186  1.1  mrg public:
   1187  1.1  mrg   pass_ipa_free_lang_data (gcc::context *ctxt)
   1188  1.1  mrg     : simple_ipa_opt_pass (pass_data_ipa_free_lang_data, ctxt)
   1189  1.1  mrg   {}
   1190  1.1  mrg 
   1191  1.1  mrg   /* opt_pass methods: */
   1192  1.1  mrg   virtual unsigned int execute (function *) { return free_lang_data (); }
   1193  1.1  mrg 
   1194  1.1  mrg }; // class pass_ipa_free_lang_data
   1195  1.1  mrg 
   1196  1.1  mrg } // anon namespace
   1197  1.1  mrg 
   1198  1.1  mrg simple_ipa_opt_pass *
   1199  1.1  mrg make_pass_ipa_free_lang_data (gcc::context *ctxt)
   1200  1.1  mrg {
   1201  1.1  mrg   return new pass_ipa_free_lang_data (ctxt);
   1202           }
   1203