Commit 9ffbf271 by Jan Hubicka Committed by Jan Hubicka

re PR lto/60150 (ICE in function_and_variable_visibility, at ipa.c:1000)

	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.

From-SVN: r208262
parent 993df21e
2014-03-02 Jan Hubicka <hubicka@ucw.cz>
PR ipa/60150
* ipa.c (function_and_variable_visibility): When dissolving comdat
group, also set all symbols to local.
2014-03-02 Jan Hubicka <hubicka@ucw.cz>
PR ipa/60306
......
......@@ -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);
}
......
2014-03-02 Jan Hubicka <hubicka@ucw.cz>
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 <hubicka@ucw.cz>
PR ipa/60306
* testsuite/g++.dg/ipa/devirt-29.C: New testcase
......
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
;
};
// { dg-lto-do run }
#include "pr60150.H"
int main()
{
S s;
return 0;
}
// { dg-options "-fno-lto" }
#include "pr60150.H"
void S::f() { }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment