re PR lto/83804 ([meta] LTO memory consumption)
authorRichard Biener <rguenther@suse.de>
Mon, 15 Jan 2018 08:57:28 +0000 (08:57 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Mon, 15 Jan 2018 08:57:28 +0000 (08:57 +0000)
2018-01-15  Richard Biener  <rguenther@suse.de>

PR lto/83804
* tree.c (free_lang_data_in_type): Always unlink TYPE_DECLs
from TYPE_FIELDS.  Free TYPE_BINFO if not used by devirtualization.
Reset type names to their identifier if their TYPE_DECL doesn't
have linkage (and thus is used for ODR and devirt).
(save_debug_info_for_decl): Remove.
(save_debug_info_for_type): Likewise.
(add_tree_to_fld_list): Adjust.
* tree-pretty-print.c (dump_generic_node): Make dumping of
type names more robust.

From-SVN: r256685

gcc/ChangeLog
gcc/tree-pretty-print.c
gcc/tree.c

index 42be9b6dbc1623923f2f9fa580913be1c42991aa..43c9cfa0ee83f9b79afc98444c54380cdfa808b7 100644 (file)
@@ -1,3 +1,16 @@
+2018-01-15  Richard Biener  <rguenther@suse.de>
+
+       PR lto/83804
+       * tree.c (free_lang_data_in_type): Always unlink TYPE_DECLs
+       from TYPE_FIELDS.  Free TYPE_BINFO if not used by devirtualization.
+       Reset type names to their identifier if their TYPE_DECL doesn't
+       have linkage (and thus is used for ODR and devirt).
+       (save_debug_info_for_decl): Remove.
+       (save_debug_info_for_type): Likewise.
+       (add_tree_to_fld_list): Adjust.
+       * tree-pretty-print.c (dump_generic_node): Make dumping of
+       type names more robust.
+
 2018-01-15  Richard Biener  <rguenther@suse.de>
 
        * BASE-VER: Bump to 8.0.1.
index c6cd65fbe79c142052beb299e3787514e13fa9e7..54a8dfa3b6f68d62630484c5373deefa95684469 100644 (file)
@@ -1412,8 +1412,8 @@ dump_generic_node (pretty_printer *pp, tree node, int spc, dump_flags_t flags,
          pp_space (pp);
          pp_left_paren (pp);
          pp_string (pp, str);
-         if (TYPE_NAME (node) && DECL_NAME (TYPE_NAME (node)))
-           dump_decl_name (pp, TYPE_NAME (node), flags);
+         if (TYPE_IDENTIFIER (node))
+           dump_generic_node (pp, TYPE_NAME (node), spc, flags, false);
          else if (flags & TDF_NOUID)
            pp_printf (pp, "<Txxxx>");
          else
@@ -1816,8 +1816,8 @@ dump_generic_node (pretty_printer *pp, tree node, int spc, dump_flags_t flags,
       if (TREE_CODE (node) == METHOD_TYPE)
        {
          if (TYPE_METHOD_BASETYPE (node))
-           dump_decl_name (pp, TYPE_NAME (TYPE_METHOD_BASETYPE (node)),
-                           flags);
+           dump_generic_node (pp, TYPE_NAME (TYPE_METHOD_BASETYPE (node)),
+                              spc, flags, false);
          else
            pp_string (pp, "<null method basetype>");
          pp_colon_colon (pp);
index c008a55804c1e342eb8e2c0c6658ef9e8a831d3b..3c1403b429a45262b59dfda262c303571d103f38 100644 (file)
@@ -5128,15 +5128,10 @@ free_lang_data_in_type (tree type)
       TREE_PURPOSE (p) = NULL;
   else if (RECORD_OR_UNION_TYPE_P (type))
     {
-      /* Remove members that are not FIELD_DECLs (and maybe
-        TYPE_DECLs) from the field list of an aggregate.  These occur
-        in C++.  */
+      /* Remove members that are not FIELD_DECLs from the field list
+        of an aggregate.  These occur in C++.  */
       for (tree *prev = &TYPE_FIELDS (type), member; (member = *prev);)
-       if (TREE_CODE (member) == FIELD_DECL
-           || (TREE_CODE (member) == TYPE_DECL
-               && !DECL_IGNORED_P (member)
-               && debug_info_level > DINFO_LEVEL_TERSE
-               && !is_redundant_typedef (member)))
+       if (TREE_CODE (member) == FIELD_DECL)
          prev = &DECL_CHAIN (member);
        else
          *prev = DECL_CHAIN (member);
@@ -5150,15 +5145,9 @@ free_lang_data_in_type (tree type)
        {
          free_lang_data_in_binfo (TYPE_BINFO (type));
          /* We need to preserve link to bases and virtual table for all
-            polymorphic types to make devirtualization machinery working.
-            Debug output cares only about bases, but output also
-            virtual table pointers so merging of -fdevirtualize and
-            -fno-devirtualize units is easier.  */
-         if ((!BINFO_VTABLE (TYPE_BINFO (type))
-              || !flag_devirtualize)
-             && ((!BINFO_N_BASE_BINFOS (TYPE_BINFO (type))
-                  && !BINFO_VTABLE (TYPE_BINFO (type)))
-                 || debug_info_level != DINFO_LEVEL_NONE))
+            polymorphic types to make devirtualization machinery working.  */
+         if (!BINFO_VTABLE (TYPE_BINFO (type))
+             || !flag_devirtualize)
            TYPE_BINFO (type) = NULL;
        }
     }
@@ -5186,6 +5175,11 @@ free_lang_data_in_type (tree type)
       while (ctx && TREE_CODE (ctx) == BLOCK);
       TYPE_CONTEXT (type) = ctx;
     }
+
+  /* Drop TYPE_DECLs in TYPE_NAME in favor of the identifier in the
+     TYPE_DECL if the type doesn't have linkage.  */
+  if (! type_with_linkage_p (type))
+    TYPE_NAME (type) = TYPE_IDENTIFIER (type);
 }
 
 
@@ -5408,34 +5402,6 @@ struct free_lang_data_d
 };
 
 
-/* Save all language fields needed to generate proper debug information
-   for DECL.  This saves most fields cleared out by free_lang_data_in_decl.  */
-
-static void
-save_debug_info_for_decl (tree t)
-{
-  /*struct saved_debug_info_d *sdi;*/
-
-  gcc_assert (debug_info_level > DINFO_LEVEL_TERSE && t && DECL_P (t));
-
-  /* FIXME.  Partial implementation for saving debug info removed.  */
-}
-
-
-/* Save all language fields needed to generate proper debug information
-   for TYPE.  This saves most fields cleared out by free_lang_data_in_type.  */
-
-static void
-save_debug_info_for_type (tree t)
-{
-  /*struct saved_debug_info_d *sdi;*/
-
-  gcc_assert (debug_info_level > DINFO_LEVEL_TERSE && t && TYPE_P (t));
-
-  /* FIXME.  Partial implementation for saving debug info removed.  */
-}
-
-
 /* Add type or decl T to one of the list of tree nodes that need their
    language data removed.  The lists are held inside FLD.  */
 
@@ -5443,17 +5409,9 @@ static void
 add_tree_to_fld_list (tree t, struct free_lang_data_d *fld)
 {
   if (DECL_P (t))
-    {
-      fld->decls.safe_push (t);
-      if (debug_info_level > DINFO_LEVEL_TERSE)
-       save_debug_info_for_decl (t);
-    }
+    fld->decls.safe_push (t);
   else if (TYPE_P (t))
-    {
-      fld->types.safe_push (t);
-      if (debug_info_level > DINFO_LEVEL_TERSE)
-       save_debug_info_for_type (t);
-    }
+    fld->types.safe_push (t);
   else
     gcc_unreachable ();
 }