diff options
-rw-r--r-- | gdb/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/mips-tdep.c | 17 |
2 files changed, 15 insertions, 8 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 833ef75..c217f0c 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2007-09-21 David Ung <davidu@mips.com> + Maciej W. Rozycki <macro@mips.com> + + * mips-tdep.c (mips_n32n64_push_dummy_call): Per N32/N64 ABI + rules do not treat composite types specially. + 2007-09-20 Maciej W. Rozycki <macro@mips.com> * mips-tdep.c (mips32_in_function_epilogue_p): New function. diff --git a/gdb/mips-tdep.c b/gdb/mips-tdep.c index 2384e12..332387a 100644 --- a/gdb/mips-tdep.c +++ b/gdb/mips-tdep.c @@ -2937,12 +2937,14 @@ mips_n32n64_push_dummy_call (struct gdbarch *gdbarch, struct value *function, /* Copy the argument to general registers or the stack in register-sized pieces. Large arguments are split between registers and stack. */ - /* Note: structs whose size is not a multiple of MIPS64_REGSIZE - are treated specially: Irix cc passes them in registers - where gcc sometimes puts them on the stack. For maximum - compatibility, we will put them in both places. */ - int odd_sized_struct = (len > MIPS64_REGSIZE - && len % MIPS64_REGSIZE != 0); + /* For N32/N64, structs, unions, or other composite types are + treated as a sequence of doublewords, and are passed in integer + or floating point registers as though they were simple scalar + parameters to the extent that they fit, with any excess on the + stack packed according to the normal memory layout of the + object. + The caller does not reserve space for the register arguments; + the callee is responsible for reserving it if required. */ /* Note: Floating-point values that didn't fit into an FP register are only written to memory. */ while (len > 0) @@ -2959,8 +2961,7 @@ mips_n32n64_push_dummy_call (struct gdbarch *gdbarch, struct value *function, gdb_assert (argreg > MIPS_LAST_ARG_REGNUM); /* Write this portion of the argument to the stack. */ - if (argreg > MIPS_LAST_ARG_REGNUM - || odd_sized_struct) + if (argreg > MIPS_LAST_ARG_REGNUM) { /* Should shorter than int integer values be promoted to int before being stored? */ |