+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.
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
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);
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);
{
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;
}
}
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);
}
};
-/* 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. */
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 ();
}