Commit 7b3376a0 by Jan Hubicka Committed by Jan Hubicka

ipa.c (symtab_remove_unreachable_nodes): Remove symbol from comdat group if its…

ipa.c (symtab_remove_unreachable_nodes): Remove symbol from comdat group if its body was eliminated.

	* ipa.c (symtab_remove_unreachable_nodes): Remove
	symbol from comdat group if its body was eliminated.
	(comdat_can_be_unshared_p_1): Static symbols can always
	be privatized.
	* symtab.c (symtab_remove_from_same_comdat_group): Break out
	from ...
	(symtab_unregister_node): ... this one.
	(verify_symtab_base): More strict checking of comdats.
	* cgraph.h (symtab_remove_from_same_comdat_group): Declare.

From-SVN: r210598
parent a04d9035
2014-05-17 Jan Hubicka <hubicka@ucw.cz> 2014-05-17 Jan Hubicka <hubicka@ucw.cz>
* ipa.c (symtab_remove_unreachable_nodes): Remove
symbol from comdat group if its body was eliminated.
(comdat_can_be_unshared_p_1): Static symbols can always
be privatized.
* symtab.c (symtab_remove_from_same_comdat_group): Break out
from ...
(symtab_unregister_node): ... this one.
(verify_symtab_base): More strict checking of comdats.
* cgraph.h (symtab_remove_from_same_comdat_group): Declare.
2014-05-17 Jan Hubicka <hubicka@ucw.cz>
* tree-pass.h (make_pass_ipa_comdats): New pass. * tree-pass.h (make_pass_ipa_comdats): New pass.
* timevar.def (TV_IPA_COMDATS): New timevar. * timevar.def (TV_IPA_COMDATS): New timevar.
* passes.def (pass_ipa_comdats): Add. * passes.def (pass_ipa_comdats): Add.
......
...@@ -725,6 +725,7 @@ enum symbol_partitioning_class ...@@ -725,6 +725,7 @@ enum symbol_partitioning_class
/* In symtab.c */ /* In symtab.c */
void symtab_register_node (symtab_node *); void symtab_register_node (symtab_node *);
void symtab_unregister_node (symtab_node *); void symtab_unregister_node (symtab_node *);
void symtab_remove_from_same_comdat_group (symtab_node *);
void symtab_remove_node (symtab_node *); void symtab_remove_node (symtab_node *);
symtab_node *symtab_get_node (const_tree); symtab_node *symtab_get_node (const_tree);
symtab_node *symtab_node_for_asm (const_tree asmname); symtab_node *symtab_node_for_asm (const_tree asmname);
......
...@@ -517,6 +517,7 @@ symtab_remove_unreachable_nodes (bool before_inlining_p, FILE *file) ...@@ -517,6 +517,7 @@ symtab_remove_unreachable_nodes (bool before_inlining_p, FILE *file)
if (!node->in_other_partition) if (!node->in_other_partition)
node->local.local = false; node->local.local = false;
cgraph_node_remove_callees (node); cgraph_node_remove_callees (node);
symtab_remove_from_same_comdat_group (node);
ipa_remove_all_references (&node->ref_list); ipa_remove_all_references (&node->ref_list);
changed = true; changed = true;
} }
...@@ -572,6 +573,8 @@ symtab_remove_unreachable_nodes (bool before_inlining_p, FILE *file) ...@@ -572,6 +573,8 @@ symtab_remove_unreachable_nodes (bool before_inlining_p, FILE *file)
vnode->analyzed = false; vnode->analyzed = false;
vnode->aux = NULL; vnode->aux = NULL;
symtab_remove_from_same_comdat_group (vnode);
/* Keep body if it may be useful for constant folding. */ /* Keep body if it may be useful for constant folding. */
if ((init = ctor_for_folding (vnode->decl)) == error_mark_node) if ((init = ctor_for_folding (vnode->decl)) == error_mark_node)
varpool_remove_initializer (vnode); varpool_remove_initializer (vnode);
...@@ -776,6 +779,8 @@ address_taken_from_non_vtable_p (symtab_node *node) ...@@ -776,6 +779,8 @@ address_taken_from_non_vtable_p (symtab_node *node)
static bool static bool
comdat_can_be_unshared_p_1 (symtab_node *node) comdat_can_be_unshared_p_1 (symtab_node *node)
{ {
if (!node->externally_visible)
return true;
/* When address is taken, we don't know if equality comparison won't /* When address is taken, we don't know if equality comparison won't
break eventually. Exception are virutal functions, C++ break eventually. Exception are virutal functions, C++
constructors/destructors and vtables, where this is not possible by constructors/destructors and vtables, where this is not possible by
......
...@@ -323,16 +323,11 @@ symtab_insert_node_to_hashtable (symtab_node *node) ...@@ -323,16 +323,11 @@ symtab_insert_node_to_hashtable (symtab_node *node)
*slot = node; *slot = node;
} }
/* Remove node from symbol table. This function is not used directly, but via /* Remove NODE from same comdat group. */
cgraph/varpool node removal routines. */
void void
symtab_unregister_node (symtab_node *node) symtab_remove_from_same_comdat_group (symtab_node *node)
{ {
void **slot;
ipa_remove_all_references (&node->ref_list);
ipa_remove_all_referring (&node->ref_list);
if (node->same_comdat_group) if (node->same_comdat_group)
{ {
symtab_node *prev; symtab_node *prev;
...@@ -346,6 +341,19 @@ symtab_unregister_node (symtab_node *node) ...@@ -346,6 +341,19 @@ symtab_unregister_node (symtab_node *node)
prev->same_comdat_group = node->same_comdat_group; prev->same_comdat_group = node->same_comdat_group;
node->same_comdat_group = NULL; node->same_comdat_group = NULL;
} }
}
/* Remove node from symbol table. This function is not used directly, but via
cgraph/varpool node removal routines. */
void
symtab_unregister_node (symtab_node *node)
{
void **slot;
ipa_remove_all_references (&node->ref_list);
ipa_remove_all_referring (&node->ref_list);
symtab_remove_from_same_comdat_group (node);
if (node->previous) if (node->previous)
node->previous->next = node->next; node->previous->next = node->next;
...@@ -829,6 +837,16 @@ verify_symtab_base (symtab_node *node) ...@@ -829,6 +837,16 @@ verify_symtab_base (symtab_node *node)
error ("non-DECL_ONE_ONLY node in a same_comdat_group list"); error ("non-DECL_ONE_ONLY node in a same_comdat_group list");
error_found = true; error_found = true;
} }
if (DECL_COMDAT_GROUP (n->decl) != DECL_COMDAT_GROUP (node->same_comdat_group->decl))
{
error ("same_comdat_group list across different groups");
error_found = true;
}
if (!n->definition)
{
error ("Node has same_comdat_group but it is not a definition");
error_found = true;
}
if (n->type != node->type) if (n->type != node->type)
{ {
error ("mixing different types of symbol in same comdat groups is not supported"); error ("mixing different types of symbol in same comdat groups is not supported");
......
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