aboutsummaryrefslogtreecommitdiff
path: root/gcc/symtab.c
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2013-05-09 11:51:52 +0200
committerJan Hubicka <hubicka@gcc.gnu.org>2013-05-09 09:51:52 +0000
commitc3167b004d64be32e926e053e83e34774ad0e2bd (patch)
treef04563384b910cbbbd0ca88f6ed37cdb2cd3fcbf /gcc/symtab.c
parent12dc6974799424cb128bd3c25d2bcb1d9f5492c7 (diff)
downloadgcc-c3167b004d64be32e926e053e83e34774ad0e2bd.zip
gcc-c3167b004d64be32e926e053e83e34774ad0e2bd.tar.gz
gcc-c3167b004d64be32e926e053e83e34774ad0e2bd.tar.bz2
re PR lto/54095 (Unnecessary static variable renaming)
PR lto/54095 * symtab.c (insert_to_assembler_name_hash): Handle clones. (unlink_from_assembler_name_hash): Likewise. (symtab_prevail_in_asm_name_hash, symtab_register_node, symtab_unregister_node, symtab_initialize_asm_name_hash, change_decl_assembler_name): Update. From-SVN: r198736
Diffstat (limited to 'gcc/symtab.c')
-rw-r--r--gcc/symtab.c40
1 files changed, 30 insertions, 10 deletions
diff --git a/gcc/symtab.c b/gcc/symtab.c
index 7388b2c..a474bfe 100644
--- a/gcc/symtab.c
+++ b/gcc/symtab.c
@@ -102,7 +102,7 @@ eq_assembler_name (const void *p1, const void *p2)
/* Insert NODE to assembler name hash. */
static void
-insert_to_assembler_name_hash (symtab_node node)
+insert_to_assembler_name_hash (symtab_node node, bool with_clones)
{
if (is_a <varpool_node> (node) && DECL_HARD_REGISTER (node->symbol.decl))
return;
@@ -111,6 +111,9 @@ insert_to_assembler_name_hash (symtab_node node)
if (assembler_name_hash)
{
void **aslot;
+ struct cgraph_node *cnode;
+ tree decl = node->symbol.decl;
+
tree name = DECL_ASSEMBLER_NAME (node->symbol.decl);
aslot = htab_find_slot_with_hash (assembler_name_hash, name,
@@ -121,6 +124,13 @@ insert_to_assembler_name_hash (symtab_node node)
if (*aslot != NULL)
((symtab_node)*aslot)->symbol.previous_sharing_asm_name = node;
*aslot = node;
+
+ /* Update also possible inline clones sharing a decl. */
+ cnode = dyn_cast <cgraph_node> (node);
+ if (cnode && cnode->clones && with_clones)
+ for (cnode = cnode->clones; cnode; cnode = cnode->next_sibling_clone)
+ if (cnode->symbol.decl == decl)
+ insert_to_assembler_name_hash ((symtab_node) cnode, true);
}
}
@@ -128,10 +138,13 @@ insert_to_assembler_name_hash (symtab_node node)
/* Remove NODE from assembler name hash. */
static void
-unlink_from_assembler_name_hash (symtab_node node)
+unlink_from_assembler_name_hash (symtab_node node, bool with_clones)
{
if (assembler_name_hash)
{
+ struct cgraph_node *cnode;
+ tree decl = node->symbol.decl;
+
if (node->symbol.next_sharing_asm_name)
node->symbol.next_sharing_asm_name->symbol.previous_sharing_asm_name
= node->symbol.previous_sharing_asm_name;
@@ -155,6 +168,13 @@ unlink_from_assembler_name_hash (symtab_node node)
}
node->symbol.next_sharing_asm_name = NULL;
node->symbol.previous_sharing_asm_name = NULL;
+
+ /* Update also possible inline clones sharing a decl. */
+ cnode = dyn_cast <cgraph_node> (node);
+ if (cnode && cnode->clones && with_clones)
+ for (cnode = cnode->clones; cnode; cnode = cnode->next_sibling_clone)
+ if (cnode->symbol.decl == decl)
+ unlink_from_assembler_name_hash ((symtab_node) cnode, true);
}
}
@@ -163,8 +183,8 @@ unlink_from_assembler_name_hash (symtab_node node)
void
symtab_prevail_in_asm_name_hash (symtab_node node)
{
- unlink_from_assembler_name_hash (node);
- insert_to_assembler_name_hash (node);
+ unlink_from_assembler_name_hash (node, false);
+ insert_to_assembler_name_hash (node, false);
}
@@ -196,7 +216,7 @@ symtab_register_node (symtab_node node)
/* Be sure to do this last; C++ FE might create new nodes via
DECL_ASSEMBLER_NAME langhook! */
- insert_to_assembler_name_hash (node);
+ insert_to_assembler_name_hash (node, false);
}
/* Make NODE to be the one symtab hash is pointing to. Used when reshaping tree
@@ -259,7 +279,7 @@ symtab_unregister_node (symtab_node node)
else
*slot = replacement_node;
}
- unlink_from_assembler_name_hash (node);
+ unlink_from_assembler_name_hash (node, false);
}
/* Return symbol table node associated with DECL, if any,
@@ -312,7 +332,7 @@ symtab_initialize_asm_name_hash (void)
htab_create_ggc (10, hash_node_by_assembler_name, eq_assembler_name,
NULL);
FOR_EACH_SYMBOL (node)
- insert_to_assembler_name_hash (node);
+ insert_to_assembler_name_hash (node, false);
}
}
@@ -355,7 +375,7 @@ change_decl_assembler_name (tree decl, tree name)
{
SET_DECL_ASSEMBLER_NAME (decl, name);
if (node)
- insert_to_assembler_name_hash (node);
+ insert_to_assembler_name_hash (node, true);
}
else
{
@@ -363,14 +383,14 @@ change_decl_assembler_name (tree decl, tree name)
return;
if (node)
- unlink_from_assembler_name_hash (node);
+ unlink_from_assembler_name_hash (node, true);
if (TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl))
&& DECL_RTL_SET_P (decl))
warning (0, "%D renamed after being referenced in assembly", decl);
SET_DECL_ASSEMBLER_NAME (decl, name);
if (node)
- insert_to_assembler_name_hash (node);
+ insert_to_assembler_name_hash (node, true);
}
}