From c1b8f25d8090e778b330555005c81bc0c582a6b8 Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Tue, 10 Apr 2018 08:33:38 +0200 Subject: [PATCH] re PR lto/85078 (LTO ICE: tree check: expected tree that contains 'decl minimal' structure, have 'identifier_node' in decl_mangling_context, at cp/mangle.c:878) PR lto/85078 * ipa-devirt.c (rebuild_type_inheritance-hash): New. * ipa-utils.h (rebuild_type_inheritance-hash): Declare. * tree.c (free_lang_data_in_type): Fix handling of binfos; walk basetypes. (free_lang_data): Rebuild type inheritance graph. * g++.dg/torture/pr85078.C: New. From-SVN: r259264 --- gcc/ChangeLog | 9 ++++++ gcc/ipa-devirt.c | 18 ++++++++++++ gcc/ipa-utils.h | 1 + gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/g++.dg/torture/pr85078.C | 40 ++++++++++++++++++++++++++ gcc/tree.c | 7 ++++- 6 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/torture/pr85078.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 368db649e16..0f5a8b25c0d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2018-04-09 Jan Hubicka + + PR lto/85078 + * ipa-devirt.c (rebuild_type_inheritance-hash): New. + * ipa-utils.h (rebuild_type_inheritance-hash): Declare. + * tree.c (free_lang_data_in_type): Fix handling of binfos; + walk basetypes. + (free_lang_data): Rebuild type inheritance graph. + 2018-04-09 Martin Sebor * invoke.texi (-finline-small-functions): Mention other optimization diff --git a/gcc/ipa-devirt.c b/gcc/ipa-devirt.c index 30d37574bbe..fa9380cce80 100644 --- a/gcc/ipa-devirt.c +++ b/gcc/ipa-devirt.c @@ -2702,6 +2702,24 @@ free_polymorphic_call_targets_hash () } } +/* Force rebuilding type inheritance graph from scratch. + This is use to make sure that we do not keep references to types + which was not visible to free_lang_data. */ + +void +rebuild_type_inheritance_graph () +{ + if (!odr_hash) + return; + delete odr_hash; + if (in_lto_p) + delete odr_vtable_hash; + odr_hash = NULL; + odr_vtable_hash = NULL; + odr_types_ptr = NULL; + free_polymorphic_call_targets_hash (); +} + /* When virtual function is removed, we may need to flush the cache. */ static void diff --git a/gcc/ipa-utils.h b/gcc/ipa-utils.h index 61761895c5c..1609ac14d7f 100644 --- a/gcc/ipa-utils.h +++ b/gcc/ipa-utils.h @@ -55,6 +55,7 @@ bool ipa_propagate_frequency (struct cgraph_node *node); struct odr_type_d; typedef odr_type_d *odr_type; void build_type_inheritance_graph (void); +void rebuild_type_inheritance_graph (void); void update_type_inheritance_graph (void); vec possible_polymorphic_call_targets (tree, HOST_WIDE_INT, diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 260150c3da2..85392f68f29 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-04-09 Jan Hubicka + + PR lto/85078 + * g++.dg/torture/pr85078.C: New. + 2018-04-09 Paolo Carlini PR c++/85227 diff --git a/gcc/testsuite/g++.dg/torture/pr85078.C b/gcc/testsuite/g++.dg/torture/pr85078.C new file mode 100644 index 00000000000..de512bdfd31 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr85078.C @@ -0,0 +1,40 @@ +typedef __builtin_va_list a; + +class b +{ +public: + virtual void c (int, const char *, a &); + char d; + void m_fn2 () + { + a a; + c (2, &d, a); + } +}; + +class e:b +{ + virtual void f () + { + } + void c (int, const char *, a &); +}; + +class g +{ +protected: + b h; +}; + +class i:g +{ + int j (); +}; + +int +i::j () +{ + h.m_fn2 (); + return 0; +} + diff --git a/gcc/tree.c b/gcc/tree.c index 8ae9ec800b8..e93f24dd4d3 100644 --- a/gcc/tree.c +++ b/gcc/tree.c @@ -5521,7 +5521,8 @@ find_decls_types_r (tree *tp, int *ws, void *data) tree tem; FOR_EACH_VEC_ELT (*BINFO_BASE_BINFOS (TYPE_BINFO (t)), i, tem) fld_worklist_push (TREE_TYPE (tem), fld); - fld_worklist_push (BINFO_VIRTUALS (TYPE_BINFO (t)), fld); + fld_worklist_push (BINFO_TYPE (TYPE_BINFO (t)), fld); + fld_worklist_push (BINFO_VTABLE (TYPE_BINFO (t)), fld); } if (RECORD_OR_UNION_TYPE_P (t)) { @@ -5540,6 +5541,8 @@ find_decls_types_r (tree *tp, int *ws, void *data) tem = TREE_CHAIN (tem); } } + if (FUNC_OR_METHOD_TYPE_P (t)) + fld_worklist_push (TYPE_METHOD_BASETYPE (t), fld); fld_worklist_push (TYPE_STUB_DECL (t), fld); *ws = 0; @@ -5859,6 +5862,8 @@ free_lang_data (void) /* Reset diagnostic machinery. */ tree_diagnostics_defaults (global_dc); + rebuild_type_inheritance_graph (); + return 0; } -- 2.30.2