From: Jakub Jelinek Date: Fri, 20 Nov 2015 09:03:45 +0000 (+0100) Subject: re PR c++/67354 (internal compiler error: in add_to_same_comdat_group, at symtab... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=ec5a0fe0422d6f472d75528a14bd22511914e240;p=gcc.git re PR c++/67354 (internal compiler error: in add_to_same_comdat_group, at symtab.c:421) PR c++/67354 * cp-tree.h (defer_mangling_aliases): Declare. (generate_mangling_aliases): New prototype. * decl2.c (defer_mangling_aliases): New variable. (note_mangling_alias): Use !defer_mangling_aliases instead of at_eof. (generate_mangling_aliases): No longer static. Clear defer_mangling_aliases. * optimize.c (maybe_thunk_body): Defer emitting mangling aliases if !defer_mangling_aliases until the fns are put into the same comdat group. * g++.dg/abi/mangle67.C: New test. From-SVN: r230646 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index cf436d7d106..0428c3c93ae 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,17 @@ +2015-11-20 Jakub Jelinek + + PR c++/67354 + * cp-tree.h (defer_mangling_aliases): Declare. + (generate_mangling_aliases): New prototype. + * decl2.c (defer_mangling_aliases): New variable. + (note_mangling_alias): Use !defer_mangling_aliases + instead of at_eof. + (generate_mangling_aliases): No longer static. Clear + defer_mangling_aliases. + * optimize.c (maybe_thunk_body): Defer emitting mangling aliases + if !defer_mangling_aliases until the fns are put into the same + comdat group. + 2015-11-19 David Malcolm * cp-tree.h (lookup_member_fuzzy): New decl. diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 38bd7dd614f..1672291f9b6 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -4846,6 +4846,11 @@ extern GTY(()) vec *local_classes; extern int at_eof; +/* True if note_mangling_alias should enqueue mangling aliases for + later generation, rather than emitting them right away. */ + +extern bool defer_mangling_aliases; + /* A list of namespace-scope objects which have constructors or destructors which reside in the global scope. The decl is stored in the TREE_VALUE slot and the initializer is stored in the @@ -5772,6 +5777,7 @@ extern tree cxx_maybe_build_cleanup (tree, tsubst_flags_t); /* in decl2.c */ extern void note_mangling_alias (tree, tree); +extern void generate_mangling_aliases (void); extern bool check_java_method (tree); extern tree build_memfn_type (tree, tree, cp_cv_quals, cp_ref_qualifier); extern tree build_pointer_ptrmemfn_type (tree); diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index 47c9ec96d24..2cc51d6d428 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -102,6 +102,11 @@ static GTY(()) vec *mangling_aliases; /* Nonzero if we're done parsing and into end-of-file activities. */ int at_eof; + +/* True if note_mangling_alias should enqueue mangling aliases for + later generation, rather than emitting them right away. */ + +bool defer_mangling_aliases = true; /* Return a member function type (a METHOD_TYPE), given FNTYPE (a @@ -4389,7 +4394,7 @@ void note_mangling_alias (tree decl ATTRIBUTE_UNUSED, tree id2 ATTRIBUTE_UNUSED) { #ifdef ASM_OUTPUT_DEF - if (at_eof) + if (!defer_mangling_aliases) generate_mangling_alias (decl, id2); else { @@ -4399,7 +4404,9 @@ note_mangling_alias (tree decl ATTRIBUTE_UNUSED, tree id2 ATTRIBUTE_UNUSED) #endif } -static void +/* Emit all mangling aliases that were deferred up to this point. */ + +void generate_mangling_aliases () { while (!vec_safe_is_empty (mangling_aliases)) @@ -4408,6 +4415,7 @@ generate_mangling_aliases () tree decl = mangling_aliases->pop(); generate_mangling_alias (decl, id2); } + defer_mangling_aliases = false; } /* The entire file is now complete. If requested, dump everything diff --git a/gcc/cp/optimize.c b/gcc/cp/optimize.c index c4e70206f21..a5f84a0a4b5 100644 --- a/gcc/cp/optimize.c +++ b/gcc/cp/optimize.c @@ -270,7 +270,11 @@ maybe_thunk_body (tree fn, bool force) } else if (HAVE_COMDAT_GROUP) { + /* At eof, defer creation of mangling aliases temporarily. */ + bool save_defer_mangling_aliases = defer_mangling_aliases; + defer_mangling_aliases = true; tree comdat_group = cdtor_comdat_group (fns[1], fns[0]); + defer_mangling_aliases = save_defer_mangling_aliases; cgraph_node::get_create (fns[0])->set_comdat_group (comdat_group); cgraph_node::get_create (fns[1])->add_to_same_comdat_group (cgraph_node::get_create (fns[0])); @@ -281,6 +285,9 @@ maybe_thunk_body (tree fn, bool force) virtual, it goes into the same comdat group as well. */ cgraph_node::get_create (fns[2])->add_to_same_comdat_group (symtab_node::get (fns[0])); + /* Emit them now that the thunks are same comdat group aliases. */ + if (!save_defer_mangling_aliases) + generate_mangling_aliases (); TREE_PUBLIC (fn) = false; DECL_EXTERNAL (fn) = false; DECL_INTERFACE_KNOWN (fn) = true; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e1e88fa5e70..75ea160d76c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-11-20 Jakub Jelinek + + PR c++/67354 + * g++.dg/abi/mangle67.C: New test. + 2015-11-20 Andreas Krebbel * gcc.target/s390/bswap-1.c: New test. diff --git a/gcc/testsuite/g++.dg/abi/mangle67.C b/gcc/testsuite/g++.dg/abi/mangle67.C new file mode 100644 index 00000000000..69ca90b029d --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/mangle67.C @@ -0,0 +1,21 @@ +// PR c++/67354 +// { dg-do compile { target c++11 } } +// { dg-options "-fabi-version=5 -Os" } + +class A +{ +}; + +template +void +foo () +{ + T (); +} + +struct B : virtual A +{ + template B () {} +}; + +auto f = foo;