aboutsummaryrefslogtreecommitdiff
path: root/gcc/cgraph.c
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2005-03-20 15:27:18 +0000
committerJan Hubicka <jh@suse.cz>2005-03-20 15:27:18 +0000
commit5a5ea09038007611e99457ac6fb48b26f3d7ae62 (patch)
tree9295919722e5f5a302f8ec2e11579c6b99f514ae /gcc/cgraph.c
parent11183e8fbac8f585643ca59cb68e1f13a4a015ad (diff)
* cgraph.h (cgraph_node): Add prev_clone pointer.
* cgraph.c (cgraph_remove_node): Remove from doubly linked chain. (cgraph_clone_node): Produce doubly linked chain. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@96761 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/cgraph.c')
-rw-r--r--gcc/cgraph.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/gcc/cgraph.c b/gcc/cgraph.c
index c7475c18eb3..3aabc4071fb 100644
--- a/gcc/cgraph.c
+++ b/gcc/cgraph.c
@@ -422,7 +422,10 @@ cgraph_remove_node (struct cgraph_node *node)
if (*slot == node)
{
if (node->next_clone)
+ {
*slot = node->next_clone;
+ node->next_clone->prev_clone = NULL;
+ }
else
{
htab_clear_slot (cgraph_hash, slot);
@@ -431,11 +434,9 @@ cgraph_remove_node (struct cgraph_node *node)
}
else
{
- struct cgraph_node *n;
-
- for (n = *slot; n->next_clone != node; n = n->next_clone)
- continue;
- n->next_clone = node->next_clone;
+ node->prev_clone->next_clone = node->next_clone;
+ if (node->next_clone)
+ node->next_clone->prev_clone = node->prev_clone;
}
/* While all the clones are removed after being proceeded, the function
@@ -779,7 +780,10 @@ cgraph_clone_node (struct cgraph_node *n)
cgraph_clone_edge (e, new, e->call_expr);
new->next_clone = n->next_clone;
+ new->prev_clone = n;
n->next_clone = new;
+ if (new->next_clone)
+ new->next_clone->prev_clone = new;
return new;
}