static void unlink_from_assembler_name_hash (symtab_node node) { if (assembler_name_hash) { if (node->symbol.next_sharing_asm_name) node->symbol.next_sharing_asm_name->symbol.previous_sharing_asm_name = node->symbol.previous_sharing_asm_name; if (node->symbol.previous_sharing_asm_name) { node->symbol.previous_sharing_asm_name->symbol.next_sharing_asm_name = node->symbol.next_sharing_asm_name; } else { tree name = DECL_ASSEMBLER_NAME (node->symbol.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->symbol.next_sharing_asm_name) htab_clear_slot (assembler_name_hash, slot); else *slot = node->symbol.next_sharing_asm_name; } } }
symtab_node symtab_node_for_asm (const_tree asmname) { symtab_node node; void **slot; if (!assembler_name_hash) { assembler_name_hash = htab_create_ggc (10, hash_node_by_assembler_name, eq_assembler_name, NULL); FOR_EACH_SYMBOL (node) insert_to_assembler_name_hash (node); } slot = htab_find_slot_with_hash (assembler_name_hash, asmname, decl_assembler_name_hash (asmname), NO_INSERT); if (slot) { node = (symtab_node) *slot; return node; } return NULL; }
static void insert_to_assembler_name_hash (symtab_node node, bool with_clones) { if (is_a <varpool_node> (node) && DECL_HARD_REGISTER (node->symbol.decl)) return; gcc_checking_assert (!node->symbol.previous_sharing_asm_name && !node->symbol.next_sharing_asm_name); 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, decl_assembler_name_hash (name), INSERT); gcc_assert (*aslot != node); node->symbol.next_sharing_asm_name = (symtab_node)*aslot; 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); } }
symtab_node symtab_node_for_asm (const_tree asmname) { symtab_node node; void **slot; symtab_initialize_asm_name_hash (); slot = htab_find_slot_with_hash (assembler_name_hash, asmname, decl_assembler_name_hash (asmname), NO_INSERT); if (slot) { node = (symtab_node) *slot; return node; } return NULL; }
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); } }
static void insert_to_assembler_name_hash (symtab_node node) { gcc_checking_assert (!node->symbol.previous_sharing_asm_name && !node->symbol.next_sharing_asm_name); if (assembler_name_hash) { void **aslot; tree name = DECL_ASSEMBLER_NAME (node->symbol.decl); aslot = htab_find_slot_with_hash (assembler_name_hash, name, decl_assembler_name_hash (name), INSERT); gcc_assert (*aslot != node); node->symbol.next_sharing_asm_name = (symtab_node)*aslot; if (*aslot != NULL) ((symtab_node)*aslot)->symbol.previous_sharing_asm_name = node; *aslot = node; } }
static hashval_t hash_node_by_assembler_name (const void *p) { const_symtab_node n = (const_symtab_node) p; return (hashval_t) decl_assembler_name_hash (DECL_ASSEMBLER_NAME (n->symbol.decl)); }
hashval_t symbol_table::hash_node_by_assembler_name (const void *p) { const symtab_node *n = (const symtab_node *) p; return (hashval_t) decl_assembler_name_hash (DECL_ASSEMBLER_NAME (n->decl)); }