tree.c (free_lang_data_in_decl): Remove types from DECL_CONTEXT when possible.

* tree.c (free_lang_data_in_decl): Remove types from DECL_CONTEXT
	when possible.

From-SVN: r263697
This commit is contained in:
Jan Hubicka 2018-08-21 12:36:37 +02:00 committed by Jan Hubicka
parent daa9715842
commit 143b379d89
2 changed files with 28 additions and 0 deletions

View File

@ -1,3 +1,8 @@
2018-08-21 Jan Hubicka <jh@suse.cz>
* tree.c (free_lang_data_in_decl): Remove types from DECL_CONTEXT
when possible.
2018-08-21 Tamar Christina <tamar.christina@arm.com>
* expmed.c (extract_low_bits): Reject invalid subregs early.

View File

@ -5380,6 +5380,29 @@ free_lang_data_in_decl (tree decl)
nextp = &TREE_CHAIN (var);
}
}
/* We need to keep field decls associated with their trees. Otherwise tree
merging may merge some fileds and keep others disjoint wich in turn will
not do well with TREE_CHAIN pointers linking them.
Also do not drop containing types for virtual methods and tables because
these are needed by devirtualization. */
if (TREE_CODE (decl) != FIELD_DECL
&& ((TREE_CODE (decl) != VAR_DECL && TREE_CODE (decl) != FUNCTION_DECL)
|| !DECL_VIRTUAL_P (decl)))
{
tree ctx = DECL_CONTEXT (decl);
/* Variably modified types are needed for tree_is_indexable to decide
whether the type needs to go to local or global section.
This code is semi-broken but for now it is easiest to keep contexts
as expected. */
if (ctx && TYPE_P (ctx)
&& !variably_modified_type_p (ctx, NULL_TREE))
{
while (ctx && TYPE_P (ctx))
ctx = TYPE_CONTEXT (ctx);
DECL_CONTEXT (decl) = ctx;
}
}
}