From: Jan Hubicka Date: Tue, 21 Aug 2018 10:36:37 +0000 (+0200) Subject: tree.c (free_lang_data_in_decl): Remove types from DECL_CONTEXT when possible. X-Git-Tag: basepoints/gcc-10~4659 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=143b379d89b12cccab345d3e424728b1b58af3e8;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 66ca10b96b9f..c19038bc31cd 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2018-08-21 Jan Hubicka + + * tree.c (free_lang_data_in_decl): Remove types from DECL_CONTEXT + when possible. + 2018-08-21 Tamar Christina * expmed.c (extract_low_bits): Reject invalid subregs early. diff --git a/gcc/tree.c b/gcc/tree.c index dd3439f60c96..8d1e010d7a2d 100644 --- a/gcc/tree.c +++ b/gcc/tree.c @@ -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; + } + } }