From 6c6366f6513dbf11dc563d0a6f420c12d4c48df7 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Mon, 1 Mar 2010 08:03:22 +0100 Subject: [PATCH] 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 --- gcc/ChangeLog | 6 ++++++ gcc/cfgexpand.c | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0e34ccc..eff481f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2010-03-01 Jakub Jelinek + + * 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 * config/sh/sh.c (unspec_bbr_uid): New. diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c index 7b8df04..b51307f 100644 --- a/gcc/cfgexpand.c +++ b/gcc/cfgexpand.c @@ -1283,6 +1283,7 @@ static void expand_used_vars (void) { tree t, next, outer_block = DECL_INITIAL (current_function_decl); + tree maybe_local_decls = NULL_TREE; unsigned i; /* Compute the phase of the stack frame for this function. */ @@ -1367,6 +1368,15 @@ expand_used_vars (void) cfun->local_decls = t; 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); @@ -1425,6 +1435,28 @@ expand_used_vars (void) 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 (STACK_ALIGNMENT_NEEDED) { -- 2.7.4