aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2018-01-15 08:57:28 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2018-01-15 08:57:28 +0000
commit2aa89839f557b7467704ddffa4dc43a130e8d027 (patch)
treea99b33d1bcb9e41f26e0dd07602f589777237722 /gcc/tree.c
parenta55e8b53d059fbe33c5f016d8d9aca9731322ab7 (diff)
downloadgcc-2aa89839f557b7467704ddffa4dc43a130e8d027.zip
gcc-2aa89839f557b7467704ddffa4dc43a130e8d027.tar.gz
gcc-2aa89839f557b7467704ddffa4dc43a130e8d027.tar.bz2
re PR lto/83804 ([meta] LTO memory consumption)
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
Diffstat (limited to 'gcc/tree.c')
-rw-r--r--gcc/tree.c68
1 files changed, 13 insertions, 55 deletions
diff --git a/gcc/tree.c b/gcc/tree.c
index c008a55..3c1403b 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -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 ();
}