cgraph.c (free_nodes): New variable.

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.

From-SVN: r140660
This commit is contained in:
Martin Jambor 2008-09-25 11:53:42 +02:00 committed by Martin Jambor
parent 1f243c2275
commit 2fb16412ad
2 changed files with 33 additions and 4 deletions

View File

@ -1,3 +1,11 @@
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.
2008-09-25 Gerald Pfeifer <gerald@pfeifer.com>
* config/freebsd.h (HANDLE_PRAGMA_PACK_PUSH_POP): Define.

View File

@ -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. */