diff options
author | Jan Hubicka <jh@suse.cz> | 2013-05-09 11:51:52 +0200 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2013-05-09 09:51:52 +0000 |
commit | c3167b004d64be32e926e053e83e34774ad0e2bd (patch) | |
tree | f04563384b910cbbbd0ca88f6ed37cdb2cd3fcbf /gcc/symtab.c | |
parent | 12dc6974799424cb128bd3c25d2bcb1d9f5492c7 (diff) | |
download | gcc-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.c | 40 |
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); } } |