From 36a3e498a9fb25ea1c9344f1bb87e4093e60a954 Mon Sep 17 00:00:00 2001 From: hubicka Date: Sun, 2 Mar 2014 22:19:37 +0000 Subject: [PATCH] PR ipa/60150 * ipa.c (function_and_variable_visibility): When dissolving comdat group, also set all symbols to local. * g++.dg/lto/pr60150.H: New testcase. * g++.dg/lto/pr60150_0.C: New testcase. * g++.dg/lto/pr60150_1.C: New testcase. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@208262 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 6 ++++++ gcc/ipa.c | 31 ++++++++++++++++++++++++------- gcc/testsuite/ChangeLog | 7 +++++++ gcc/testsuite/g++.dg/lto/pr60150.H | 20 ++++++++++++++++++++ gcc/testsuite/g++.dg/lto/pr60150_0.C | 8 ++++++++ gcc/testsuite/g++.dg/lto/pr60150_1.C | 4 ++++ 6 files changed, 69 insertions(+), 7 deletions(-) create mode 100644 gcc/testsuite/g++.dg/lto/pr60150.H create mode 100644 gcc/testsuite/g++.dg/lto/pr60150_0.C create mode 100644 gcc/testsuite/g++.dg/lto/pr60150_1.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b6f1dac00ad..c05694693b0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,4 +1,10 @@ 2014-03-02 Jan Hubicka + + PR ipa/60150 + * ipa.c (function_and_variable_visibility): When dissolving comdat + group, also set all symbols to local. + +2014-03-02 Jan Hubicka PR ipa/60306 diff --git a/gcc/ipa.c b/gcc/ipa.c index 405ee644c36..da9755425c5 100644 --- a/gcc/ipa.c +++ b/gcc/ipa.c @@ -970,15 +970,32 @@ function_and_variable_visibility (bool whole_program) gcc_assert (whole_program || in_lto_p || !TREE_PUBLIC (node->decl)); node->unique_name = ((node->resolution == LDPR_PREVAILING_DEF_IRONLY - || node->resolution == LDPR_PREVAILING_DEF_IRONLY_EXP) - && TREE_PUBLIC (node->decl)); + || node->unique_name + || node->resolution == LDPR_PREVAILING_DEF_IRONLY_EXP) + && TREE_PUBLIC (node->decl)); node->resolution = LDPR_PREVAILING_DEF_IRONLY; if (node->same_comdat_group && TREE_PUBLIC (node->decl)) - /* cgraph_externally_visible_p has already checked all other nodes - in the group and they will all be made local. We need to - dissolve the group at once so that the predicate does not - segfault though. */ - symtab_dissolve_same_comdat_group_list (node); + { + symtab_node *next = node; + + /* Set all members of comdat group local. */ + if (node->same_comdat_group) + for (next = node->same_comdat_group; + next != node; + next = next->same_comdat_group) + { + symtab_make_decl_local (next->decl); + next->unique_name = ((next->resolution == LDPR_PREVAILING_DEF_IRONLY + || next->unique_name + || next->resolution == LDPR_PREVAILING_DEF_IRONLY_EXP) + && TREE_PUBLIC (next->decl)); + } + /* cgraph_externally_visible_p has already checked all other nodes + in the group and they will all be made local. We need to + dissolve the group at once so that the predicate does not + segfault though. */ + symtab_dissolve_same_comdat_group_list (node); + } symtab_make_decl_local (node->decl); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 864057e435d..7db73e40675 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,12 @@ 2014-03-02 Jan Hubicka + PR ipa/60150 + * g++.dg/lto/pr60150.H: New testcase. + * g++.dg/lto/pr60150_0.C: New testcase. + * g++.dg/lto/pr60150_1.C: New testcase. + +2014-03-02 Jan Hubicka + PR ipa/60306 * testsuite/g++.dg/ipa/devirt-29.C: New testcase diff --git a/gcc/testsuite/g++.dg/lto/pr60150.H b/gcc/testsuite/g++.dg/lto/pr60150.H new file mode 100644 index 00000000000..6afe37acc9c --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/pr60150.H @@ -0,0 +1,20 @@ +struct Base { + virtual void f() = 0; +}; + +struct X : public Base { }; +struct Y : public Base { }; +struct Z : public Base { }; +struct T : public Base { }; + +struct S : public X, public Y, public Z +#ifdef XXX +, public T +#endif +{ + void f() +#ifdef XXX + { } +#endif + ; +}; diff --git a/gcc/testsuite/g++.dg/lto/pr60150_0.C b/gcc/testsuite/g++.dg/lto/pr60150_0.C new file mode 100644 index 00000000000..cc21820a87b --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/pr60150_0.C @@ -0,0 +1,8 @@ +// { dg-lto-do run } +#include "pr60150.H" + +int main() +{ + S s; + return 0; +} diff --git a/gcc/testsuite/g++.dg/lto/pr60150_1.C b/gcc/testsuite/g++.dg/lto/pr60150_1.C new file mode 100644 index 00000000000..294e5f00fe6 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/pr60150_1.C @@ -0,0 +1,4 @@ +// { dg-options "-fno-lto" } +#include "pr60150.H" + +void S::f() { } -- 2.11.4.GIT