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:
parent
8026c68cce
commit
6c6366f651
|
@ -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.
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue