tree.c (free_lang_data_in_type, [...]): Also free unnecesary type decls.
authorJan Hubicka <hubicka@ucw.cz>
Sat, 12 Dec 2015 21:41:31 +0000 (22:41 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Sat, 12 Dec 2015 21:41:31 +0000 (21:41 +0000)
* 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
gcc/dwarf2out.c
gcc/tree.c
gcc/tree.h

index 0dd02c702b5b1cdbf1602df8069957946517de52..2ec0e5b4d5ef197733a95b991dd918a7e7dfea2d 100644 (file)
@@ -1,3 +1,10 @@
+2015-12-10  Jan Hubicka  <hubicka@ucw.cz>
+
+       * 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  <ebotcazou@adacore.com>
 
        * config/sparc/sparc.h (TARGET_SUPPORTS_WIDE_INT): Define to 1.
index 6af57b58864317dc7f47c355c74e0049b1de968f..fe5cab5ca7115341411668576583059396ae9ce0 100644 (file)
@@ -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
index de67c4fdd8734d99f43a932dc053d8b3b22402bd..21c5fe1652ea13a215b69d6f6371677322c67e91 100644 (file)
@@ -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);
            }
index aef825d092f450100369dc40681b65faad9a7b11..96ffa83cdf94bbe3ca0031098001562646151169 100644 (file)
@@ -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);