From c3167b004d64be32e926e053e83e34774ad0e2bd Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Thu, 9 May 2013 11:51:52 +0200 Subject: [PATCH] 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 --- gcc/ChangeLog | 9 +++++++++ gcc/symtab.c | 40 ++++++++++++++++++++++++++++++---------- 2 files changed, 39 insertions(+), 10 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4c04ea4a613..94ed1690f8d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2013-05-09 Jan Hubicka + + 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. + 2013-05-09 Sofiane Naci * config/aarch64/aarch64.md: New movtf split. diff --git a/gcc/symtab.c b/gcc/symtab.c index 7388b2c046a..a474bfe96f0 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 (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 (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 (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); } } -- 2.30.2