From: Richard Biener Date: Mon, 15 Jan 2018 08:57:28 +0000 (+0000) Subject: re PR lto/83804 ([meta] LTO memory consumption) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=2aa89839f557b7467704ddffa4dc43a130e8d027;p=gcc.git re PR lto/83804 ([meta] LTO memory consumption) 2018-01-15 Richard Biener 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 42be9b6dbc1..43c9cfa0ee8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,16 @@ +2018-01-15 Richard Biener + + 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 * BASE-VER: Bump to 8.0.1. diff --git a/gcc/tree-pretty-print.c b/gcc/tree-pretty-print.c index c6cd65fbe79..54a8dfa3b6f 100644 --- a/gcc/tree-pretty-print.c +++ b/gcc/tree-pretty-print.c @@ -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, ""); 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, ""); pp_colon_colon (pp); diff --git a/gcc/tree.c b/gcc/tree.c index c008a55804c..3c1403b429a 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 (); }