OSDN Git Service

* cfgexpand.c (expand_used_vars): If an artificial non-ignored var
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 1 Mar 2010 07:03:22 +0000 (07:03 +0000)
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 1 Mar 2010 07:03:22 +0000 (07:03 +0000)
has no rtl yet when processing local_decls, queue it and recheck
if deferred stack allocation hasn't assigned it rtl.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@157132 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/cfgexpand.c

index 0e34ccc..eff481f 100644 (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>
 
        * config/sh/sh.c (unspec_bbr_uid): New.
index 7b8df04..b51307f 100644 (file)
@@ -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)
     {