re PR lto/54095 (Unnecessary static variable renaming)
authorJan Hubicka <jh@suse.cz>
Thu, 9 May 2013 09:51:52 +0000 (11:51 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Thu, 9 May 2013 09:51:52 +0000 (09:51 +0000)
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
gcc/symtab.c

index 4c04ea4a6130d64ac6cfe9f572def8696ec0ae5d..94ed1690f8d828f2f47ddcfb97d8645da9be78a3 100644 (file)
@@ -1,3 +1,12 @@
+2013-05-09  Jan Hubicka  <jh@suse.cz>
+
+       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  <sofiane.naci@arm.com>
 
        * config/aarch64/aarch64.md: New movtf split.
index 7388b2c046a899c14f31694e303a13797d363c4e..a474bfe96f0ac4fc8bfd2c9459d38f243c2a3e02 100644 (file)
@@ -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);
     }
 }