diff options
author | jamborm <jamborm@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-09-25 09:53:42 +0000 |
---|---|---|
committer | jamborm <jamborm@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-09-25 09:53:42 +0000 |
commit | 8325d2dee5168c751bed8eb36affe5bf794932ef (patch) | |
tree | 4f80610012b1958ec10e6a73c0c3f6d2fa3f64fe /gcc/cgraph.c | |
parent | 8d12fd47795fa7b16359dd8bc11ec13a7595f20e (diff) | |
download | gcc-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.c | 29 |
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. */ |