From 566f0f7aa5d4e2a8256910d0d0b8b8bf42eeb367 Mon Sep 17 00:00:00 2001 From: Andrew Cagney Date: Fri, 23 Jun 2000 11:06:31 +0000 Subject: [PATCH] For EABI, start allocting space on the stack when the registers are full. Not when the number of args == 8. --- gdb/ChangeLog | 6 ++++++ gdb/mips-tdep.c | 27 ++++++++++++++++----------- 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 73591aeb5eb..b13d15df816 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +Fri Jun 23 20:47:03 2000 Andrew Cagney + + * 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 * command.h (add_set_auto_boolean_cmd): Add declaration. diff --git a/gdb/mips-tdep.c b/gdb/mips-tdep.c index 6ba42a281c3..88ba0cddc86 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); } } -- 2.30.2