cgraph.c (cgraph_remove_node): Avoid loop in code deciding whether function body should be released...

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

From-SVN: r96654
This commit is contained in:
Jan Hubicka 2005-03-18 11:00:53 +01:00 committed by Jan Hubicka
parent 49aa94f95f
commit 4a76d91a23
2 changed files with 23 additions and 22 deletions

View File

@ -1,3 +1,9 @@
2005-03-18 Jan Hubicka <jh@suse.cz>
* 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.
2005-03-18 Ralf Corsepius <ralf.corsepius@rtems.org>
* config/i386/t-rtems-i386 (MULTILIBS): Remove k6, athlon,

View File

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