aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorAndrew Cagney <cagney@redhat.com>2000-06-23 11:06:31 +0000
committerAndrew Cagney <cagney@redhat.com>2000-06-23 11:06:31 +0000
commit566f0f7aa5d4e2a8256910d0d0b8b8bf42eeb367 (patch)
tree24dd832871b97ba6fce228d6d3b095a4df67dce2 /gdb
parented6d6fd3c4a370d8e315cfe55a9971042e8917c9 (diff)
downloadgdb-566f0f7aa5d4e2a8256910d0d0b8b8bf42eeb367.zip
gdb-566f0f7aa5d4e2a8256910d0d0b8b8bf42eeb367.tar.gz
gdb-566f0f7aa5d4e2a8256910d0d0b8b8bf42eeb367.tar.bz2
For EABI, start allocting space on the stack when the registers are
full. Not when the number of args == 8.
Diffstat (limited to 'gdb')
-rw-r--r--gdb/ChangeLog6
-rw-r--r--gdb/mips-tdep.c27
2 files changed, 22 insertions, 11 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 73591ae..b13d15d 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -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.
diff --git a/gdb/mips-tdep.c b/gdb/mips-tdep.c
index 6ba42a2..88ba0cd 100644
--- a/gdb/mips-tdep.c
+++ b/gdb/mips-tdep.c
@@ -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);
}
}