* function.c (assign_parms): Update max_parm_reg and
authordje <dje@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 24 Dec 2003 02:22:37 +0000 (02:22 +0000)
committerdje <dje@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 24 Dec 2003 02:22:37 +0000 (02:22 +0000)
        parm_reg_stack_loc when adding new parm reg.

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

gcc/ChangeLog
gcc/function.c

index cce4623..fc2f387 100644 (file)
@@ -1,3 +1,8 @@
+2003-12-23  David Edelsohn  <edelsohn@gnu.org>
+
+       * function.c (assign_parms): Update max_parm_reg and
+       parm_reg_stack_loc when adding new parm reg.
+
 2003-12-23  Kazu Hirata  <kazu@cs.umass.edu>
 
        * config/ns32k/ns32k.c: Convert to ISO-C.
index 6eb44ae..30ede39 100644 (file)
@@ -4740,9 +4740,28 @@ assign_parms (tree fndecl)
 
          if (REG_P (parmreg))
            {
+             unsigned int regno = REGNO (parmreg);
+
              emit_group_store (parmreg, entry_parm, TREE_TYPE (parm),
                                int_size_in_bytes (TREE_TYPE (parm)));
              SET_DECL_RTL (parm, parmreg);
+
+             if (regno >= max_parm_reg)
+               {
+                 rtx *new;
+                 int old_max_parm_reg = max_parm_reg;
+
+                 /* It's slow to expand this one register at a time,
+                    but it's also rare and we need max_parm_reg to be
+                    precisely correct.  */
+                 max_parm_reg = regno + 1;
+                 new = ggc_realloc (parm_reg_stack_loc,
+                                    max_parm_reg * sizeof (rtx));
+                 memset (new + old_max_parm_reg, 0,
+                         (max_parm_reg - old_max_parm_reg) * sizeof (rtx));
+                 parm_reg_stack_loc = new;
+                 parm_reg_stack_loc[regno] = stack_parm;
+               }
            }
        }