struct cgraph_node * cgraph_clone_node (struct cgraph_node *n, tree decl, gcov_type count, int freq, bool update_original, vec<cgraph_edge_p> redirect_callers, bool call_duplication_hook, struct cgraph_node *new_inlined_to) { struct cgraph_node *new_node = cgraph_create_empty_node (); struct cgraph_edge *e; gcov_type count_scale; unsigned i; new_node->decl = decl; symtab_register_node (new_node); new_node->origin = n->origin; new_node->lto_file_data = n->lto_file_data; if (new_node->origin) { new_node->next_nested = new_node->origin->nested; new_node->origin->nested = new_node; } new_node->analyzed = n->analyzed; new_node->definition = n->definition; new_node->local = n->local; new_node->externally_visible = false; new_node->local.local = true; new_node->global = n->global; new_node->global.inlined_to = new_inlined_to; new_node->rtl = n->rtl; new_node->count = count; new_node->frequency = n->frequency; new_node->clone = n->clone; new_node->clone.tree_map = NULL; new_node->tp_first_run = n->tp_first_run; if (n->count) { if (new_node->count > n->count) count_scale = REG_BR_PROB_BASE; else count_scale = GCOV_COMPUTE_SCALE (new_node->count, n->count); } else count_scale = 0; if (update_original) { n->count -= count; if (n->count < 0) n->count = 0; } FOR_EACH_VEC_ELT (redirect_callers, i, e) { /* Redirect calls to the old version node to point to its new version. */ cgraph_redirect_edge_callee (e, new_node); }
The new clone will have decl set to DECL that may or may not be the same as decl of N. When UPDATE_ORIGINAL is true, the counts are subtracted from the original function's profile to reflect the fact that part of execution is handled by node. When CALL_DUPLICATOIN_HOOK is true, the ipa passes are acknowledged about the new clone. Otherwise the caller is responsible for doing so later. */ struct cgraph_node * cgraph_clone_node (struct cgraph_node *n, tree decl, gcov_type count, int freq, bool update_original, VEC(cgraph_edge_p,heap) *redirect_callers, bool call_duplication_hook) { struct cgraph_node *new_node = cgraph_create_empty_node (); struct cgraph_edge *e; gcov_type count_scale; unsigned i; new_node->symbol.decl = decl; symtab_register_node ((symtab_node)new_node); new_node->origin = n->origin; if (new_node->origin) { new_node->next_nested = new_node->origin->nested; new_node->origin->nested = new_node; } new_node->analyzed = n->analyzed; new_node->local = n->local; new_node->symbol.externally_visible = false;