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)); }
void symtab_remove_node (symtab_node node) { if (cgraph_node *cnode = dyn_cast <cgraph_node> (node)) cgraph_remove_node (cnode); else if (varpool_node *vnode = dyn_cast <varpool_node> (node)) varpool_remove_node (vnode); }
static void lto_varpool_replace_node (struct varpool_node *vnode, struct varpool_node *prevailing_node) { gcc_assert (!vnode->symbol.definition || prevailing_node->symbol.definition); gcc_assert (!vnode->symbol.analyzed || prevailing_node->symbol.analyzed); ipa_clone_referring ((symtab_node)prevailing_node, &vnode->symbol.ref_list); /* Be sure we can garbage collect the initializer. */ if (DECL_INITIAL (vnode->symbol.decl) && vnode->symbol.decl != prevailing_node->symbol.decl) DECL_INITIAL (vnode->symbol.decl) = error_mark_node; /* Finally remove the replaced node. */ varpool_remove_node (vnode); }
static void lto_varpool_replace_node (struct varpool_node *vnode, struct varpool_node *prevailing_node) { /* Merge node flags. */ if (vnode->needed) { gcc_assert (!vnode->analyzed || prevailing_node->analyzed); varpool_mark_needed_node (prevailing_node); } gcc_assert (!vnode->finalized || prevailing_node->finalized); gcc_assert (!vnode->analyzed || prevailing_node->analyzed); ipa_clone_refering (NULL, prevailing_node, &vnode->ref_list); /* Be sure we can garbage collect the initializer. */ if (DECL_INITIAL (vnode->decl)) DECL_INITIAL (vnode->decl) = error_mark_node; /* Finally remove the replaced node. */ varpool_remove_node (vnode); }
static void varpool_remove_unreferenced_decls (void) { varpool_node *next, *node; varpool_node *first = (varpool_node *)(void *)1; int i; struct ipa_ref *ref; struct pointer_set_t *referenced = pointer_set_create (); if (seen_error ()) return; if (cgraph_dump_file) fprintf (cgraph_dump_file, "Trivially needed variables:"); FOR_EACH_DEFINED_VARIABLE (node) { if (node->analyzed && (!varpool_can_remove_if_no_refs (node) /* We just expanded all function bodies. See if any of them needed the variable. */ || DECL_RTL_SET_P (node->decl))) { enqueue_node (node, &first); if (cgraph_dump_file) fprintf (cgraph_dump_file, " %s", node->asm_name ()); } } while (first != (varpool_node *)(void *)1) { node = first; first = (varpool_node *)first->aux; if (node->same_comdat_group) { symtab_node *next; for (next = node->same_comdat_group; next != node; next = next->same_comdat_group) { varpool_node *vnext = dyn_cast <varpool_node *> (next); if (vnext && vnext->analyzed && !symtab_comdat_local_p (next)) enqueue_node (vnext, &first); } } for (i = 0; ipa_ref_list_reference_iterate (&node->ref_list, i, ref); i++) { varpool_node *vnode = dyn_cast <varpool_node *> (ref->referred); if (vnode && !vnode->in_other_partition && (!DECL_EXTERNAL (ref->referred->decl) || vnode->alias) && vnode->analyzed) enqueue_node (vnode, &first); else pointer_set_insert (referenced, node); } } if (cgraph_dump_file) fprintf (cgraph_dump_file, "\nRemoving variables:"); for (node = varpool_first_defined_variable (); node; node = next) { next = varpool_next_defined_variable (node); if (!node->aux) { if (cgraph_dump_file) fprintf (cgraph_dump_file, " %s", node->asm_name ()); if (pointer_set_contains (referenced, node)) varpool_remove_initializer (node); else varpool_remove_node (node); } } pointer_set_destroy (referenced); if (cgraph_dump_file) fprintf (cgraph_dump_file, "\n"); }
/* Remove node from the varpool. */ void varpool_remove_node (struct varpool_node *node) { void **slot; slot = htab_find_slot (varpool_hash, node, NO_INSERT); gcc_assert (*slot == node); htab_clear_slot (varpool_hash, slot); gcc_assert (!varpool_assembled_nodes_queue); if (!node->alias) while (node->extra_name) varpool_remove_node (node->extra_name); if (node->next) node->next->prev = node->prev; if (node->prev) node->prev->next = node->next; else { if (node->alias && node->extra_name) { gcc_assert (node->extra_name->extra_name == node); node->extra_name->extra_name = node->next; } else { gcc_assert (varpool_nodes == node); varpool_nodes = node->next; } } if (varpool_first_unanalyzed_node == node) varpool_first_unanalyzed_node = node->next_needed; if (node->next_needed) node->next_needed->prev_needed = node->prev_needed; else if (node->prev_needed) { gcc_assert (varpool_last_needed_node); varpool_last_needed_node = node->prev_needed; } if (node->prev_needed) node->prev_needed->next_needed = node->next_needed; else if (node->next_needed) { gcc_assert (varpool_nodes_queue == node); varpool_nodes_queue = node->next_needed; } if (node->same_comdat_group) { struct varpool_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; } ipa_remove_all_references (&node->ref_list); ipa_remove_all_refering (&node->ref_list); ggc_free (node); }
static void varpool_remove_unreferenced_decls (void) { struct varpool_node *next, *node; struct varpool_node *first = (struct varpool_node *)(void *)1; int i; struct ipa_ref *ref; if (seen_error ()) return; if (cgraph_dump_file) fprintf (cgraph_dump_file, "Trivially needed variables:"); FOR_EACH_DEFINED_VARIABLE (node) { if (node->analyzed && (!varpool_can_remove_if_no_refs (node) /* We just expanded all function bodies. See if any of them needed the variable. */ || (!DECL_EXTERNAL (node->symbol.decl) && DECL_RTL_SET_P (node->symbol.decl)))) { enqueue_node (node, &first); if (cgraph_dump_file) fprintf (cgraph_dump_file, " %s", varpool_node_asm_name (node)); } } while (first != (struct varpool_node *)(void *)1) { node = first; first = (struct varpool_node *)first->symbol.aux; if (node->symbol.same_comdat_group) { symtab_node next; for (next = node->symbol.same_comdat_group; next != (symtab_node)node; next = next->symbol.same_comdat_group) { varpool_node *vnext = dyn_cast <varpool_node> (next); if (vnext && vnext->analyzed) enqueue_node (vnext, &first); } } for (i = 0; ipa_ref_list_reference_iterate (&node->symbol.ref_list, i, ref); i++) { varpool_node *vnode = dyn_cast <varpool_node> (ref->referred); if (vnode && (!DECL_EXTERNAL (ref->referred->symbol.decl) || vnode->alias) && vnode->analyzed) enqueue_node (vnode, &first); } } if (cgraph_dump_file) fprintf (cgraph_dump_file, "\nRemoving variables:"); for (node = varpool_first_defined_variable (); node; node = next) { next = varpool_next_defined_variable (node); if (!node->symbol.aux) { if (cgraph_dump_file) fprintf (cgraph_dump_file, " %s", varpool_node_asm_name (node)); varpool_remove_node (node); } } if (cgraph_dump_file) fprintf (cgraph_dump_file, "\n"); }