summaryrefslogtreecommitdiff
path: root/gcc/cgraph.c
diff options
context:
space:
mode:
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2005-03-18 10:00:53 +0000
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2005-03-18 10:00:53 +0000
commit5830087fdfb01e798d030e458afddbdec3c55550 (patch)
tree8e3f1acc0058440927b7f644fdf8d1a2972329fc /gcc/cgraph.c
parentbfba719e9ceea86ee549422075948b02d2161710 (diff)
downloadgcc-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.c39
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. */