struct ipa_ref * ipa_record_reference (symtab_node referring_node, symtab_node referred_node, enum ipa_ref_use use_type, gimple stmt) { struct ipa_ref *ref; struct ipa_ref_list *list, *list2; ipa_ref_t *old_references; gcc_checking_assert (!stmt || is_a <cgraph_node> (referring_node)); gcc_checking_assert (use_type != IPA_REF_ALIAS || !stmt); list = &referring_node->symbol.ref_list; old_references = vec_safe_address (list->references); vec_safe_grow (list->references, vec_safe_length (list->references) + 1); ref = &list->references->last (); list2 = &referred_node->symbol.ref_list; list2->referring.safe_push (ref); ref->referred_index = list2->referring.length () - 1; ref->referring = referring_node; ref->referred = referred_node; ref->stmt = stmt; ref->use = use_type; /* If vector was moved in memory, update pointers. */ if (old_references != list->references->address ()) { int i; for (i = 0; ipa_ref_list_reference_iterate (list, i, ref); i++) ipa_ref_referred_ref_list (ref)->referring[ref->referred_index] = ref; } return ref; }
ipa_ref * symtab_node::create_reference (symtab_node *referred_node, enum ipa_ref_use use_type, gimple stmt) { ipa_ref *ref = NULL, *ref2 = NULL; ipa_ref_list *list, *list2; ipa_ref_t *old_references; gcc_checking_assert (!stmt || is_a <cgraph_node *> (this)); gcc_checking_assert (use_type != IPA_REF_ALIAS || !stmt); list = &ref_list; old_references = vec_safe_address (list->references); vec_safe_grow (list->references, vec_safe_length (list->references) + 1); ref = &list->references->last (); list2 = &referred_node->ref_list; /* IPA_REF_ALIAS is always inserted at the beginning of the list. */ if(use_type == IPA_REF_ALIAS) { list2->referring.safe_insert (0, ref); ref->referred_index = 0; for (unsigned int i = 1; i < list2->referring.length (); i++) list2->referring[i]->referred_index = i; } else { list2->referring.safe_push (ref); ref->referred_index = list2->referring.length () - 1; } ref->referring = this; ref->referred = referred_node; ref->stmt = stmt; ref->lto_stmt_uid = 0; ref->use = use_type; ref->speculative = 0; /* If vector was moved in memory, update pointers. */ if (old_references != list->references->address ()) { int i; for (i = 0; iterate_reference(i, ref2); i++) ref2->referred_ref_list ()->referring[ref2->referred_index] = ref2; } return ref; }