cfgexpand.c (expand_used_vars): If an artificial non-ignored var has no rtl yet when processing local_decls...

* cfgexpand.c (expand_used_vars): If an artificial non-ignored var
	has no rtl yet when processing local_decls, queue it and recheck
	if deferred stack allocation hasn't assigned it rtl.

From-SVN: r157132
This commit is contained in:
Jakub Jelinek 2010-03-01 08:03:22 +01:00 committed by Jakub Jelinek
parent 8026c68cce
commit 6c6366f651
2 changed files with 38 additions and 0 deletions

View File

@ -1,3 +1,9 @@
2010-03-01 Jakub Jelinek <jakub@redhat.com>
* cfgexpand.c (expand_used_vars): If an artificial non-ignored var
has no rtl yet when processing local_decls, queue it and recheck
if deferred stack allocation hasn't assigned it rtl.
2010-02-28 Kaz Kojima <kkojima@gcc.gnu.org> 2010-02-28 Kaz Kojima <kkojima@gcc.gnu.org>
* config/sh/sh.c (unspec_bbr_uid): New. * config/sh/sh.c (unspec_bbr_uid): New.

View File

@ -1283,6 +1283,7 @@ static void
expand_used_vars (void) expand_used_vars (void)
{ {
tree t, next, outer_block = DECL_INITIAL (current_function_decl); tree t, next, outer_block = DECL_INITIAL (current_function_decl);
tree maybe_local_decls = NULL_TREE;
unsigned i; unsigned i;
/* Compute the phase of the stack frame for this function. */ /* Compute the phase of the stack frame for this function. */
@ -1367,6 +1368,15 @@ expand_used_vars (void)
cfun->local_decls = t; cfun->local_decls = t;
continue; continue;
} }
else if (rtl == NULL_RTX)
{
/* If rtl isn't set yet, which can happen e.g. with
-fstack-protector, retry before returning from this
function. */
TREE_CHAIN (t) = maybe_local_decls;
maybe_local_decls = t;
continue;
}
} }
ggc_free (t); ggc_free (t);
@ -1425,6 +1435,28 @@ expand_used_vars (void)
fini_vars_expansion (); fini_vars_expansion ();
} }
/* If there were any artificial non-ignored vars without rtl
found earlier, see if deferred stack allocation hasn't assigned
rtl to them. */
for (t = maybe_local_decls; t; t = next)
{
tree var = TREE_VALUE (t);
rtx rtl = DECL_RTL_IF_SET (var);
next = TREE_CHAIN (t);
/* Keep artificial non-ignored vars in cfun->local_decls
chain until instantiate_decls. */
if (rtl && (MEM_P (rtl) || GET_CODE (rtl) == CONCAT))
{
TREE_CHAIN (t) = cfun->local_decls;
cfun->local_decls = t;
continue;
}
ggc_free (t);
}
/* If the target requires that FRAME_OFFSET be aligned, do it. */ /* If the target requires that FRAME_OFFSET be aligned, do it. */
if (STACK_ALIGNMENT_NEEDED) if (STACK_ALIGNMENT_NEEDED)
{ {