summaryrefslogtreecommitdiff
path: root/gcc/cgraph.c
diff options
context:
space:
mode:
authorjamborm <jamborm@138bc75d-0d04-0410-961f-82ee72b054a4>2008-09-25 09:53:42 +0000
committerjamborm <jamborm@138bc75d-0d04-0410-961f-82ee72b054a4>2008-09-25 09:53:42 +0000
commit8325d2dee5168c751bed8eb36affe5bf794932ef (patch)
tree4f80610012b1958ec10e6a73c0c3f6d2fa3f64fe /gcc/cgraph.c
parent8d12fd47795fa7b16359dd8bc11ec13a7595f20e (diff)
downloadgcc-8325d2dee5168c751bed8eb36affe5bf794932ef.tar.gz
2008-09-25 Martin Jambor <mjambor@suse.cz>
* cgraph.c (free_nodes): New variable. (NEXT_FREE_NODE): New macro. (cgraph_create_node): Reuse nodes from the free list. Do not update uid if doing so. (cgraph_remove_node): Add the node to the free list. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@140660 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/cgraph.c')
-rw-r--r--gcc/cgraph.c29
1 files changed, 25 insertions, 4 deletions
diff --git a/gcc/cgraph.c b/gcc/cgraph.c
index 163ab9dd39f..73dbfb3aa8b 100644
--- a/gcc/cgraph.c
+++ b/gcc/cgraph.c
@@ -177,11 +177,16 @@ struct cgraph_2node_hook_list *first_cgraph_node_duplicated_hook;
/* List of hooks triggered when an function is inserted. */
struct cgraph_node_hook_list *first_cgraph_function_insertion_hook;
+/* Head of a linked list of unused (freed) call graph nodes.
+ Do not GTY((delete)) this list so UIDs gets reliably recycled. */
+static GTY(()) struct cgraph_node *free_nodes;
/* Head of a linked list of unused (freed) call graph edges.
Do not GTY((delete)) this list so UIDs gets reliably recycled. */
static GTY(()) struct cgraph_edge *free_edges;
-/* Macro to access the next item in the list of free cgraph edges. */
+/* Macros to access the next item in the list of free cgraph nodes and
+ edges. */
+#define NEXT_FREE_NODE(NODE) (NODE)->next
#define NEXT_FREE_EDGE(EDGE) (EDGE)->prev_caller
/* Register HOOK to be called with DATA on each removed edge. */
@@ -417,9 +422,18 @@ cgraph_create_node (void)
{
struct cgraph_node *node;
- node = GGC_CNEW (struct cgraph_node);
+ if (free_nodes)
+ {
+ node = free_nodes;
+ free_nodes = NEXT_FREE_NODE (node);
+ }
+ else
+ {
+ node = GGC_CNEW (struct cgraph_node);
+ node->uid = cgraph_max_uid++;
+ }
+
node->next = cgraph_nodes;
- node->uid = cgraph_max_uid++;
node->pid = -1;
node->order = cgraph_order++;
if (cgraph_nodes)
@@ -933,6 +947,7 @@ cgraph_remove_node (struct cgraph_node *node)
void **slot;
bool kill_body = false;
struct cgraph_node *n;
+ int uid = node->uid;
cgraph_call_node_removal_hooks (node);
cgraph_node_remove_callers (node);
@@ -1020,7 +1035,13 @@ cgraph_remove_node (struct cgraph_node *node)
node->call_site_hash = NULL;
}
cgraph_n_nodes--;
- /* Do not free the structure itself so the walk over chain can continue. */
+
+ /* Clear out the node to NULL all pointers and add the node to the free
+ list. */
+ memset (node, 0, sizeof(*node));
+ node->uid = uid;
+ NEXT_FREE_NODE (node) = free_nodes;
+ free_nodes = node;
}
/* Notify finalize_compilation_unit that given node is reachable. */