diff options
author | hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-03-18 10:00:53 +0000 |
---|---|---|
committer | hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-03-18 10:00:53 +0000 |
commit | 5830087fdfb01e798d030e458afddbdec3c55550 (patch) | |
tree | 8e3f1acc0058440927b7f644fdf8d1a2972329fc /gcc/cgraph.c | |
parent | bfba719e9ceea86ee549422075948b02d2161710 (diff) | |
download | gcc-5830087fdfb01e798d030e458afddbdec3c55550.tar.gz |
* cgraph.c (cgraph_remove_node): Avoid loop in code deciding whether
function body should be released; do not proactively release function
bodies in non-unit-at-a-time mode.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@96654 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/cgraph.c')
-rw-r--r-- | gcc/cgraph.c | 39 |
1 files changed, 17 insertions, 22 deletions
diff --git a/gcc/cgraph.c b/gcc/cgraph.c index 11953b46f85..dacc70dfb30 100644 --- a/gcc/cgraph.c +++ b/gcc/cgraph.c @@ -398,7 +398,7 @@ void cgraph_remove_node (struct cgraph_node *node) { void **slot; - bool check_dead = 1; + bool kill_body = false; cgraph_node_remove_callers (node); cgraph_node_remove_callees (node); @@ -426,12 +426,7 @@ cgraph_remove_node (struct cgraph_node *node) else { htab_clear_slot (cgraph_hash, slot); - if (!dump_enabled_p (TDI_tree_all)) - { - DECL_SAVED_TREE (node->decl) = NULL; - DECL_STRUCT_FUNCTION (node->decl) = NULL; - } - check_dead = false; + kill_body = true; } } else @@ -443,23 +438,23 @@ cgraph_remove_node (struct cgraph_node *node) n->next_clone = node->next_clone; } - /* Work out whether we still need a function body (either there is inline - clone or there is out of line function whose body is not written). */ - if (check_dead && flag_unit_at_a_time) + /* While all the clones are removed after being proceeded, the function + itself is kept in the cgraph even after it is compiled. Check whether + we are done with this body and reclaim it proactively if this is the case. + */ + if (!kill_body && *slot) { - struct cgraph_node *n; + struct cgraph_node *n = *slot; + if (!n->next_clone && !n->global.inlined_to + && (TREE_ASM_WRITTEN (n->decl) || DECL_EXTERNAL (n->decl))) + kill_body = true; + } - for (n = *slot; n; n = n->next_clone) - if (n->global.inlined_to - || (!n->global.inlined_to - && !TREE_ASM_WRITTEN (n->decl) && !DECL_EXTERNAL (n->decl))) - break; - if (!n && !dump_enabled_p (TDI_tree_all)) - { - DECL_SAVED_TREE (node->decl) = NULL; - DECL_STRUCT_FUNCTION (node->decl) = NULL; - DECL_INITIAL (node->decl) = error_mark_node; - } + if (kill_body && !dump_enabled_p (TDI_tree_all) && flag_unit_at_a_time) + { + DECL_SAVED_TREE (node->decl) = NULL; + DECL_STRUCT_FUNCTION (node->decl) = NULL; + DECL_INITIAL (node->decl) = error_mark_node; } cgraph_n_nodes--; /* Do not free the structure itself so the walk over chain can continue. */ |