This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [RFA] Mips, return_value_location, small structs


Re-submitted as a separate patch.

The problem: small structs returned in one (or two) registers
are aligned left in N32/N64 and aligned right in the others
(or vice versa, depending on how you cross your eyes).
I _think_ you also need to add o32. Can you check that out? Just post the results, not the patch.

Andrew


There are two code paths here, one for structs of length < MIPS_REGSIZE, and one for MIPS_REGSIZE < struct len < 2 * MIPS_REGSIZE.

The first case I've split into two paths: one for N32 &&
TYPE_CODE_STRUCT, and a second for everything else (the later being identical to what was
there before).

In the second case, I've simply let the N32/N64 path fall thru.
The next "if" catches it and handles it correctly.



2002-08-08 Michael Snyder <msnyder@redhat.com>

* mips-tdep.c (return_value_location): Structs returned in registers are aligned differently (n32/64 vs. o32/64).

Index: mips-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/mips-tdep.c,v
retrieving revision 1.92
diff -c -3 -p -r1.92 mips-tdep.c
*** mips-tdep.c 8 Aug 2002 00:26:51 -0000 1.92
--- mips-tdep.c 8 Aug 2002 21:48:09 -0000
*************** return_value_location (struct type *valt
*** 3608,3622 ****
if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG
&& len < MIPS_SAVED_REGSIZE)
{
! /* "un-left-justify" the value in the low register */
! lo->reg_offset = MIPS_SAVED_REGSIZE - len;
! lo->len = len;
hi->reg_offset = 0;
hi->len = 0;
}
else if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG
&& len > MIPS_SAVED_REGSIZE /* odd-size structs */
&& len < MIPS_SAVED_REGSIZE * 2
&& (TYPE_CODE (valtype) == TYPE_CODE_STRUCT ||
TYPE_CODE (valtype) == TYPE_CODE_UNION))
{
--- 3608,3635 ----
if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG
&& len < MIPS_SAVED_REGSIZE)
{
! if ((gdbarch_tdep (current_gdbarch) -> mips_abi == MIPS_ABI_N32 ! || gdbarch_tdep (current_gdbarch) -> mips_abi == MIPS_ABI_N64)
! && (TYPE_CODE (valtype) == TYPE_CODE_STRUCT ! || TYPE_CODE (valtype) == TYPE_CODE_UNION))
! {
! /* Values are already aligned in the low register. */
! lo->reg_offset = 0;
! }
! else
! {
! /* "un-left-justify" the value in the low register */
! lo->reg_offset = MIPS_SAVED_REGSIZE - len;
! }
hi->reg_offset = 0;
+ lo->len = len;
hi->len = 0;
}
else if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG
&& len > MIPS_SAVED_REGSIZE /* odd-size structs */
&& len < MIPS_SAVED_REGSIZE * 2
+ && gdbarch_tdep (current_gdbarch) -> mips_abi != MIPS_ABI_N32 + && gdbarch_tdep (current_gdbarch) -> mips_abi != MIPS_ABI_N64
&& (TYPE_CODE (valtype) == TYPE_CODE_STRUCT ||
TYPE_CODE (valtype) == TYPE_CODE_UNION))
{


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]