[RFA] mips eabi, passing corner-case structs

Joel Brobecker brobecker@adacore.com
Fri Jun 9 18:16:00 GMT 2006


> That odd little corner case in eabi, wherein structs whose
> single field is a float or double are passed like a float or double.
> 

> 2006-05-31  Michael Snyder  <msnyder@redhat.com>
> 
> 	* mips-tdep.c (mips_eabi_push_dummy_call): Catch corner case, 
> 	structs with a single field of floating point type.

I have been trying to convince myself that it's ok to not verify
that the unique field inside the struct is not a float. It looks
OK to me, but do you confirm as well?

The patch seems OK to me, but could you merge the two comments instead
of adding one right after the current one. Also, there is a missing "s"
in "unless". The indenting seems a bit odd in the diff, but I imagine
this is because of tabulations (when are we going to get rid of these
horros...).

Thanks,

> Index: mips-tdep.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/mips-tdep.c,v
> retrieving revision 1.393
> diff -p -r1.393 mips-tdep.c
> *** mips-tdep.c	31 May 2006 23:15:50 -0000	1.393
> --- mips-tdep.c	31 May 2006 23:44:31 -0000
> *************** mips_eabi_push_dummy_call (struct gdbarc
> *** 2453,2460 ****
>   
>         /* The EABI passes structures that do not fit in a register by
>            reference.  */
> !       if (len > mips_abi_regsize (gdbarch)
> ! 	  && (typecode == TYPE_CODE_STRUCT || typecode == TYPE_CODE_UNION))
>   	{
>   	  store_unsigned_integer (valbuf, mips_abi_regsize (gdbarch),
>   				  VALUE_ADDRESS (arg));
> --- 2453,2467 ----
>   
>         /* The EABI passes structures that do not fit in a register by
>            reference.  */
> !       /* MVS: unles the struct has only one field, and that field
> ! 	 will fit into two registers.  */
> !       if ((typecode == TYPE_CODE_STRUCT || typecode == TYPE_CODE_UNION)
> ! 	  && TYPE_NFIELDS (arg_type) == 1
> ! 	  && len == 2 * mips_abi_regsize (gdbarch))
> ! 	val = value_contents (arg);
> !       else if (len > mips_abi_regsize (gdbarch)
> ! 	       && (typecode == TYPE_CODE_STRUCT 
> ! 		   || typecode == TYPE_CODE_UNION))
>   	{
>   	  store_unsigned_integer (valbuf, mips_abi_regsize (gdbarch),
>   				  VALUE_ADDRESS (arg));


-- 
Joel



More information about the Gdb-patches mailing list