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
This commit is contained in:
parent
a55e8b53d0
commit
2aa89839f5
@ -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.
|
||||
|
@ -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);
|
||||
|
68
gcc/tree.c
68
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 ();
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user