/* 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;
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,
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);
}
}
/* 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;
}
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);
}
}
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);
}
/* 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
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,
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);
}
}
{
SET_DECL_ASSEMBLER_NAME (decl, name);
if (node)
- insert_to_assembler_name_hash (node);
+ insert_to_assembler_name_hash (node, true);
}
else
{
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);
}
}