[RFA] Mips, return_value_location, small structs

Andrew Cagney ac131313@ges.redhat.com
Fri Aug 9 17:13:00 GMT 2002


> 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))
>   	{




More information about the Gdb-patches mailing list