void dump_symtab_node (FILE *f, symtab_node node) { if (symtab_function_p (node)) dump_cgraph_node (f, cgraph (node)); else if (symtab_variable_p (node)) dump_varpool_node (f, varpool (node)); }
void symtab_remove_node (symtab_node node) { if (symtab_function_p (node)) cgraph_remove_node (cgraph (node)); else if (symtab_variable_p (node)) varpool_remove_node (varpool (node)); }
/* Given an assembler name, lookup node. */ struct varpool_node * varpool_node_for_asm (tree asmname) { symtab_node node = symtab_node_for_asm (asmname); if (node && symtab_variable_p (node)) return varpool (node); return NULL; }
enum availability symtab_node_availability (symtab_node node) { if (is_a <cgraph_node> (node)) return cgraph_function_body_availability (cgraph (node)); else return cgraph_variable_initializer_availability (varpool (node)); }
static void lto_symtab_merge_symbols_1 (symtab_node prevailing) { symtab_node e, next; /* Replace the cgraph node of each entry with the prevailing one. */ for (e = prevailing->symbol.next_sharing_asm_name; e; e = next) { next = e->symbol.next_sharing_asm_name; if (!lto_symtab_symbol_p (e)) continue; cgraph_node *ce = dyn_cast <cgraph_node> (e); if (ce && !DECL_BUILT_IN (e->symbol.decl)) lto_cgraph_replace_node (ce, cgraph (prevailing)); if (varpool_node *ve = dyn_cast <varpool_node> (e)) lto_varpool_replace_node (ve, varpool (prevailing)); } return; }
/* Walk the decls we marked as necessary and see if they reference new variables or functions and add them into the worklists. */ bool varpool_analyze_pending_decls (void) { bool changed = false; timevar_push (TV_VARPOOL); while (varpool_first_unanalyzed_node) { struct varpool_node *node = varpool_first_unanalyzed_node, *next; tree decl = node->symbol.decl; bool analyzed = node->analyzed; varpool_first_unanalyzed_node->analyzed = true; x_varpool_first_unanalyzed_node = (symtab_node)varpool_first_unanalyzed_node->next_needed; /* When reading back varpool at LTO time, we re-construct the queue in order to have "needed" list right by inserting all needed nodes into varpool. We however don't want to re-analyze already analyzed nodes. */ if (!analyzed) { gcc_assert (!in_lto_p || cgraph_function_flags_ready); /* Compute the alignment early so function body expanders are already informed about increased alignment. */ align_variable (decl, 0); } if (node->alias && node->alias_of) { struct varpool_node *tgt = varpool_node (node->alias_of); struct varpool_node *n; for (n = tgt; n && n->alias; n = n->analyzed ? varpool_alias_aliased_node (n) : NULL) if (n == node) { error ("variable %q+D part of alias cycle", node->symbol.decl); node->alias = false; continue; } if (!VEC_length (ipa_ref_t, node->symbol.ref_list.references)) ipa_record_reference ((symtab_node)node, (symtab_node)tgt, IPA_REF_ALIAS, NULL); /* C++ FE sometimes change linkage flags after producing same body aliases. */ if (node->extra_name_alias) { DECL_WEAK (node->symbol.decl) = DECL_WEAK (node->alias_of); TREE_PUBLIC (node->symbol.decl) = TREE_PUBLIC (node->alias_of); DECL_EXTERNAL (node->symbol.decl) = DECL_EXTERNAL (node->alias_of); DECL_VISIBILITY (node->symbol.decl) = DECL_VISIBILITY (node->alias_of); if (TREE_PUBLIC (node->symbol.decl)) { DECL_COMDAT (node->symbol.decl) = DECL_COMDAT (node->alias_of); DECL_COMDAT_GROUP (node->symbol.decl) = DECL_COMDAT_GROUP (node->alias_of); if (DECL_ONE_ONLY (node->alias_of) && !node->symbol.same_comdat_group) { node->symbol.same_comdat_group = (symtab_node)tgt; if (!tgt->symbol.same_comdat_group) tgt->symbol.same_comdat_group = (symtab_node)node; else { symtab_node n; for (n = tgt->symbol.same_comdat_group; n->symbol.same_comdat_group != (symtab_node)tgt; n = n->symbol.same_comdat_group) ; n->symbol.same_comdat_group = (symtab_node)node; } } } } varpool_mark_needed_node (tgt); } else if (DECL_INITIAL (decl)) record_references_in_initializer (decl, analyzed); if (node->symbol.same_comdat_group) { for (next = varpool (node->symbol.same_comdat_group); next != node; next = varpool (next->symbol.same_comdat_group)) varpool_mark_needed_node (next); } changed = true; } timevar_pop (TV_VARPOOL); return changed; }