For EABI, start allocting space on the stack when the registers are
authorAndrew Cagney <cagney@redhat.com>
Fri, 23 Jun 2000 11:06:31 +0000 (11:06 +0000)
committerAndrew Cagney <cagney@redhat.com>
Fri, 23 Jun 2000 11:06:31 +0000 (11:06 +0000)
full.  Not when the number of args == 8.

gdb/ChangeLog
gdb/mips-tdep.c

index 73591aeb5eb12804337562172e6a3c5d58a9a82e..b13d15df81672d4e9f715f6e84a7afe2b929b562 100644 (file)
@@ -1,3 +1,9 @@
+Fri Jun 23 20:47:03 2000  Andrew Cagney  <cagney@b1.cygnus.com>
+
+       * mips-tdep.c (mips_push_arguments): Use the variable stack_used_p
+       to determine if any arguments were written to the stack.  Do not
+       rely on NUMARG>=8.
+
 Mon Jun 19 11:29:35 2000  Andrew Cagney  <cagney@b1.cygnus.com>
 
        * command.h (add_set_auto_boolean_cmd): Add declaration.
index 6ba42a281c3990dcde46e0157789dc03742338eb..88ba0cddc86327543b06b63c8998193d3d9bb20d 100644 (file)
@@ -2259,18 +2259,20 @@ mips_push_arguments (nargs, args, sp, struct_return, struct_addr)
              register are only written to memory. */
          while (len > 0)
            {
+             /* Rememer if the argument was written to the stack. */
+             int stack_used_p = 0;
              int partial_len = len < MIPS_SAVED_REGSIZE ? len : MIPS_SAVED_REGSIZE;
 
+             /* Write this portion of the argument to the stack.  */
              if (argreg > MIPS_LAST_ARG_REGNUM
                  || odd_sized_struct
                  || fp_register_arg_p (typecode, arg_type))
                {
-                 /* Write this portion of the argument to the stack.  */
                  /* Should shorter than int integer values be
                     promoted to int before being stored? */
-
                  int longword_offset = 0;
                  CORE_ADDR addr;
+                 stack_used_p = 1;
                  if (TARGET_BYTE_ORDER == BIG_ENDIAN)
                    {
                      if (MIPS_STACK_ARGSIZE == 8 &&
@@ -2309,6 +2311,8 @@ mips_push_arguments (nargs, args, sp, struct_return, struct_addr)
              /* Note!!! This is NOT an else clause.  Odd sized
                 structs may go thru BOTH paths.  Floating point
                 arguments will not. */
+             /* Write this portion of the argument to a general
+                 purpose register. */
              if (argreg <= MIPS_LAST_ARG_REGNUM
                  && !fp_register_arg_p (typecode, arg_type))
                {
@@ -2352,17 +2356,18 @@ mips_push_arguments (nargs, args, sp, struct_return, struct_addr)
              len -= partial_len;
              val += partial_len;
 
-             /* The offset onto the stack at which we will start
-                copying parameters (after the registers are used up) 
-                begins at (4 * MIPS_REGSIZE) in the old ABI.  This 
-                leaves room for the "home" area for register parameters.
+             /* Compute the the offset into the stack at which we
+                will copy the next parameter.
+
+                In older ABIs, the caller reserved space for
+                registers that contained arguments.  This was loosely
+                refered to as their "home".  Consequently, space is
+                always allocated.
 
-                In the new EABI (and the NABI32), the 8 register parameters 
-                do not have "home" stack space reserved for them, so the
-                stack offset does not get incremented until after
-                we have used up the 8 parameter registers.  */
+                In the new EABI (and the NABI32), the stack_offset
+                only needs to be adjusted when it has been used.. */
 
-             if (MIPS_REGS_HAVE_HOME_P || argnum >= 8)
+             if (MIPS_REGS_HAVE_HOME_P || stack_used_p)
                stack_offset += ROUND_UP (partial_len, MIPS_STACK_ARGSIZE);
            }
        }