1*38fd1498Szrj /* Interprocedural reference lists. 2*38fd1498Szrj Copyright (C) 2010-2018 Free Software Foundation, Inc. 3*38fd1498Szrj Contributed by Jan Hubicka 4*38fd1498Szrj 5*38fd1498Szrj This file is part of GCC. 6*38fd1498Szrj 7*38fd1498Szrj GCC is free software; you can redistribute it and/or modify it under 8*38fd1498Szrj the terms of the GNU General Public License as published by the Free 9*38fd1498Szrj Software Foundation; either version 3, or (at your option) any later 10*38fd1498Szrj version. 11*38fd1498Szrj 12*38fd1498Szrj GCC is distributed in the hope that it will be useful, but WITHOUT ANY 13*38fd1498Szrj WARRANTY; without even the implied warranty of MERCHANTABILITY or 14*38fd1498Szrj FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 15*38fd1498Szrj for more details. 16*38fd1498Szrj 17*38fd1498Szrj You should have received a copy of the GNU General Public License 18*38fd1498Szrj along with GCC; see the file COPYING3. If not see 19*38fd1498Szrj <http://www.gnu.org/licenses/>. */ 20*38fd1498Szrj 21*38fd1498Szrj #include "config.h" 22*38fd1498Szrj #include "system.h" 23*38fd1498Szrj #include "coretypes.h" 24*38fd1498Szrj #include "target.h" 25*38fd1498Szrj #include "tree.h" 26*38fd1498Szrj #include "cgraph.h" 27*38fd1498Szrj 28*38fd1498Szrj /* Remove reference. */ 29*38fd1498Szrj 30*38fd1498Szrj void remove_reference()31*38fd1498Szrjipa_ref::remove_reference () 32*38fd1498Szrj { 33*38fd1498Szrj struct ipa_ref_list *list = referred_ref_list (); 34*38fd1498Szrj struct ipa_ref_list *list2 = referring_ref_list (); 35*38fd1498Szrj vec<ipa_ref_t, va_gc> *old_references = list2->references; 36*38fd1498Szrj struct ipa_ref *last; 37*38fd1498Szrj 38*38fd1498Szrj gcc_assert (list->referring[referred_index] == this); 39*38fd1498Szrj 40*38fd1498Szrj last = list->referring.last (); 41*38fd1498Szrj if (this != last) 42*38fd1498Szrj { 43*38fd1498Szrj if (use == IPA_REF_ALIAS) 44*38fd1498Szrj { 45*38fd1498Szrj /* If deleted item is IPA_REF_ALIAS, we have to move last 46*38fd1498Szrj item of IPA_REF_LIST type to the deleted position. After that 47*38fd1498Szrj we replace last node with deletion slot. */ 48*38fd1498Szrj struct ipa_ref *last_alias = list->last_alias (); 49*38fd1498Szrj 50*38fd1498Szrj if (last_alias && referred_index < last_alias->referred_index 51*38fd1498Szrj && last_alias != last) 52*38fd1498Szrj { 53*38fd1498Szrj unsigned last_alias_index = last_alias->referred_index; 54*38fd1498Szrj 55*38fd1498Szrj list->referring[referred_index] = last_alias; 56*38fd1498Szrj list->referring[referred_index]->referred_index = referred_index; 57*38fd1498Szrj 58*38fd1498Szrj /* New position for replacement is previous index 59*38fd1498Szrj of the last_alias. */ 60*38fd1498Szrj referred_index = last_alias_index; 61*38fd1498Szrj } 62*38fd1498Szrj } 63*38fd1498Szrj 64*38fd1498Szrj list->referring[referred_index] = list->referring.last (); 65*38fd1498Szrj list->referring[referred_index]->referred_index= referred_index; 66*38fd1498Szrj } 67*38fd1498Szrj list->referring.pop (); 68*38fd1498Szrj 69*38fd1498Szrj last = &list2->references->last (); 70*38fd1498Szrj 71*38fd1498Szrj struct ipa_ref *ref = this; 72*38fd1498Szrj 73*38fd1498Szrj if (ref != last) 74*38fd1498Szrj { 75*38fd1498Szrj *ref = *last; 76*38fd1498Szrj ref->referred_ref_list ()->referring[referred_index] = ref; 77*38fd1498Szrj } 78*38fd1498Szrj list2->references->pop (); 79*38fd1498Szrj gcc_assert (list2->references == old_references); 80*38fd1498Szrj } 81*38fd1498Szrj 82*38fd1498Szrj /* Return true when execution of reference can lead to return from 83*38fd1498Szrj function. */ 84*38fd1498Szrj 85*38fd1498Szrj bool cannot_lead_to_return()86*38fd1498Szrjipa_ref::cannot_lead_to_return () 87*38fd1498Szrj { 88*38fd1498Szrj return dyn_cast <cgraph_node *> (referring)->cannot_return_p (); 89*38fd1498Szrj } 90*38fd1498Szrj 91*38fd1498Szrj /* Return reference list this reference is in. */ 92*38fd1498Szrj 93*38fd1498Szrj struct ipa_ref_list * referring_ref_list(void)94*38fd1498Szrjipa_ref::referring_ref_list (void) 95*38fd1498Szrj { 96*38fd1498Szrj return &referring->ref_list; 97*38fd1498Szrj } 98*38fd1498Szrj 99*38fd1498Szrj /* Return reference list this reference is in. */ 100*38fd1498Szrj 101*38fd1498Szrj struct ipa_ref_list * referred_ref_list(void)102*38fd1498Szrjipa_ref::referred_ref_list (void) 103*38fd1498Szrj { 104*38fd1498Szrj return &referred->ref_list; 105*38fd1498Szrj } 106