From b8e99d033082f69bc672ada056cb9676a8b6cf64 Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Sat, 12 Dec 2015 22:41:31 +0100 Subject: [PATCH] tree.c (free_lang_data_in_type, [...]): Also free unnecesary type decls. * tree.c (free_lang_data_in_type, find_decls_types_r): Also free unnecesary type decls. * tree.h (is_redundant_typedef): Declare. * dwarf2out.c (is_redundant_typedef): Export; booleanize From-SVN: r231588 --- gcc/ChangeLog | 7 +++++++ gcc/dwarf2out.c | 9 ++++----- gcc/tree.c | 12 +++++++++--- gcc/tree.h | 1 + 4 files changed, 21 insertions(+), 8 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0dd02c702b5..2ec0e5b4d5e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2015-12-10 Jan Hubicka + + * tree.c (free_lang_data_in_type, find_decls_types_r): Also free + unnecesary type decls. + * tree.h (is_redundant_typedef): Declare. + * dwarf2out.c (is_redundant_typedef): Export; booleanize + 2015-12-12 Eric Botcazou * config/sparc/sparc.h (TARGET_SUPPORTS_WIDE_INT): Define to 1. diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 6af57b58864..fe5cab5ca71 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -3319,7 +3319,6 @@ static void gen_typedef_die (tree, dw_die_ref); static void gen_type_die (tree, dw_die_ref); static void gen_block_die (tree, dw_die_ref); static void decls_for_scope (tree, dw_die_ref); -static inline int is_redundant_typedef (const_tree); static bool is_naming_typedef_decl (const_tree); static inline dw_die_ref get_context_die (tree); static void gen_namespace_die (tree, dw_die_ref); @@ -21117,11 +21116,11 @@ decls_for_scope (tree stmt, dw_die_ref context_die) /* Is this a typedef we can avoid emitting? */ -static inline int +bool is_redundant_typedef (const_tree decl) { if (TYPE_DECL_IS_STUB (decl)) - return 1; + return true; if (DECL_ARTIFICIAL (decl) && DECL_CONTEXT (decl) @@ -21129,9 +21128,9 @@ is_redundant_typedef (const_tree decl) && TREE_CODE (TYPE_NAME (DECL_CONTEXT (decl))) == TYPE_DECL && DECL_NAME (decl) == DECL_NAME (TYPE_NAME (DECL_CONTEXT (decl)))) /* Also ignore the artificial member typedef for the class name. */ - return 1; + return true; - return 0; + return false; } /* Return TRUE if TYPE is a typedef that names a type for linkage diff --git a/gcc/tree.c b/gcc/tree.c index de67c4fdd87..21c5fe1652e 100644 --- a/gcc/tree.c +++ b/gcc/tree.c @@ -5191,7 +5191,10 @@ free_lang_data_in_type (tree type) while (member) { if (TREE_CODE (member) == FIELD_DECL - || TREE_CODE (member) == TYPE_DECL) + || (TREE_CODE (member) == TYPE_DECL + && !DECL_IGNORED_P (member) + && debug_info_level > DINFO_LEVEL_TERSE + && !is_redundant_typedef (member))) { if (prev) TREE_CHAIN (prev) = member; @@ -5216,7 +5219,7 @@ free_lang_data_in_type (tree type) /* Remove TYPE_METHODS list. While it would be nice to keep it to enable ODR warnings about different method lists, doing so seems to impractically increase size of LTO data streamed. - Keep the infrmation if TYPE_METHODS was non-NULL. This is used + Keep the information if TYPE_METHODS was non-NULL. This is used by function.c and pretty printers. */ if (TYPE_METHODS (type)) TYPE_METHODS (type) = error_mark_node; @@ -5666,7 +5669,10 @@ find_decls_types_r (tree *tp, int *ws, void *data) while (tem) { if (TREE_CODE (tem) == FIELD_DECL - || TREE_CODE (tem) == TYPE_DECL) + || (TREE_CODE (tem) == TYPE_DECL + && !DECL_IGNORED_P (tem) + && debug_info_level > DINFO_LEVEL_TERSE + && !is_redundant_typedef (tem))) fld_worklist_push (tem, fld); tem = TREE_CHAIN (tem); } diff --git a/gcc/tree.h b/gcc/tree.h index aef825d092f..96ffa83cdf9 100644 --- a/gcc/tree.h +++ b/gcc/tree.h @@ -5386,6 +5386,7 @@ extern void gt_pch_nx (tree &); extern void gt_pch_nx (tree &, gt_pointer_operator, void *); extern bool nonnull_arg_p (const_tree); +extern bool is_redundant_typedef (const_tree); extern location_t set_source_range (tree expr, location_t start, location_t finish); -- 2.30.2