void change_decl_assembler_name (tree decl, tree name) { symtab_node node = NULL; /* We can have user ASM names on things, like global register variables, that are not in the symbol table. */ if ((TREE_CODE (decl) == VAR_DECL && (TREE_STATIC (decl) || DECL_EXTERNAL (decl))) || TREE_CODE (decl) == FUNCTION_DECL) node = symtab_get_node (decl); if (!DECL_ASSEMBLER_NAME_SET_P (decl)) { SET_DECL_ASSEMBLER_NAME (decl, name); if (node) insert_to_assembler_name_hash (node); } else { if (name == DECL_ASSEMBLER_NAME (decl)) return; if (node) unlink_from_assembler_name_hash (node); 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); } }
void symtab_unregister_node (symtab_node *node) { void **slot; ipa_remove_all_references (&node->ref_list); ipa_remove_all_referring (&node->ref_list); if (node->same_comdat_group) { symtab_node *prev; for (prev = node->same_comdat_group; prev->same_comdat_group != node; prev = prev->same_comdat_group) ; if (node->same_comdat_group == prev) prev->same_comdat_group = NULL; else prev->same_comdat_group = node->same_comdat_group; node->same_comdat_group = NULL; } if (node->previous) node->previous->next = node->next; else symtab_nodes = node->next; if (node->next) node->next->previous = node->previous; node->next = NULL; node->previous = NULL; slot = htab_find_slot (symtab_hash, node, NO_INSERT); /* During LTO symtab merging we temporarily corrupt decl to symtab node hash. */ gcc_assert ((slot && *slot) || in_lto_p); if (slot && *slot && *slot == node) { symtab_node *replacement_node = NULL; if (cgraph_node *cnode = dyn_cast <cgraph_node> (node)) replacement_node = cgraph_find_replacement_node (cnode); if (!replacement_node) htab_clear_slot (symtab_hash, slot); else *slot = replacement_node; } if (!is_a <varpool_node> (node) || !DECL_HARD_REGISTER (node->decl)) unlink_from_assembler_name_hash (node, false); }
void symtab_unregister_node (symtab_node node) { void **slot; ipa_remove_all_references (&node->symbol.ref_list); ipa_remove_all_referring (&node->symbol.ref_list); if (node->symbol.same_comdat_group) { symtab_node prev; for (prev = node->symbol.same_comdat_group; prev->symbol.same_comdat_group != node; prev = prev->symbol.same_comdat_group) ; if (node->symbol.same_comdat_group == prev) prev->symbol.same_comdat_group = NULL; else prev->symbol.same_comdat_group = node->symbol.same_comdat_group; node->symbol.same_comdat_group = NULL; } if (node->symbol.previous) node->symbol.previous->symbol.next = node->symbol.next; else symtab_nodes = node->symbol.next; if (node->symbol.next) node->symbol.next->symbol.previous = node->symbol.previous; node->symbol.next = NULL; node->symbol.previous = NULL; slot = htab_find_slot (symtab_hash, node, NO_INSERT); if (*slot == node) { symtab_node replacement_node = NULL; if (symtab_function_p (node)) replacement_node = (symtab_node)cgraph_find_replacement_node (cgraph (node)); if (!replacement_node) htab_clear_slot (symtab_hash, slot); else *slot = replacement_node; } unlink_from_assembler_name_hash (node); }
void symbol_table::change_decl_assembler_name (tree decl, tree name) { symtab_node *node = NULL; /* We can have user ASM names on things, like global register variables, that are not in the symbol table. */ if ((TREE_CODE (decl) == VAR_DECL && (TREE_STATIC (decl) || DECL_EXTERNAL (decl))) || TREE_CODE (decl) == FUNCTION_DECL) node = symtab_node::get (decl); if (!DECL_ASSEMBLER_NAME_SET_P (decl)) { SET_DECL_ASSEMBLER_NAME (decl, name); if (node) insert_to_assembler_name_hash (node, true); } else { if (name == DECL_ASSEMBLER_NAME (decl)) return; tree alias = (IDENTIFIER_TRANSPARENT_ALIAS (DECL_ASSEMBLER_NAME (decl)) ? TREE_CHAIN (DECL_ASSEMBLER_NAME (decl)) : NULL); if (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 (alias) { IDENTIFIER_TRANSPARENT_ALIAS (name) = 1; TREE_CHAIN (name) = alias; } if (node) insert_to_assembler_name_hash (node, true); } }
void symbol_table::unlink_from_assembler_name_hash (symtab_node *node, bool with_clones) { if (assembler_name_hash) { cgraph_node *cnode; tree decl = node->decl; if (node->next_sharing_asm_name) node->next_sharing_asm_name->previous_sharing_asm_name = node->previous_sharing_asm_name; if (node->previous_sharing_asm_name) { node->previous_sharing_asm_name->next_sharing_asm_name = node->next_sharing_asm_name; } else { tree name = DECL_ASSEMBLER_NAME (node->decl); void **slot; slot = htab_find_slot_with_hash (assembler_name_hash, name, decl_assembler_name_hash (name), NO_INSERT); gcc_assert (*slot == node); if (!node->next_sharing_asm_name) htab_clear_slot (assembler_name_hash, slot); else *slot = node->next_sharing_asm_name; } node->next_sharing_asm_name = NULL; node->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->decl == decl) unlink_from_assembler_name_hash (cnode, true); } }
void symtab_prevail_in_asm_name_hash (symtab_node node) { unlink_from_assembler_name_hash (node, false); insert_to_assembler_name_hash (node, false); }