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_push_arguments(): Make O64 ABI test explicit


On Jul 31,  6:10pm, Kevin Buettner wrote:

> So, it seems that cc wants small structs shifted, but that gcc does not.
> 
> Time for me to dig into the ABI documents to find out which compiler's
> right...

It looks to me like the SGI (cc) compiler is right.  The text below was
obtained from:

http://techpubs.sgi.com/library/tpl/cgi-bin/getdoc.cgi/srch3@n64/0650/bks/SGI_Developer/books/Mpro_n32_ABI/sgi_html/ch02.html


    * 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.  More
      specifically:

	- Regardless of the struct field structure, it is treated as a
	  sequence of 64-bit chunks.  If a chunk consists solely of a
	  double float field (but not a double, which is part of a
	  union), it is passed in a floating point register.  Any
	  other chunk is passed in an integer register.

	- A union, either as the parameter itself or as a struct
	  parameter field, is treated as a sequence of integer
	  doublewords for purposes of assignment to integer parameter
	  registers.  No attempt is made to identify floating point
	  components for passing in floating point registers.

	- Array fields of structs are passed like unions.  Array
	  parameters are passed by reference (unless the relevant
	  language standard requires otherwise).

	- Right-justifying small scalar parameters in their save area
	  slots notwithstanding, struct parameters are always
	  left-justified.  This applies both to the case of a struct
	  smaller than 64 bits, and to the final chunk of a struct
	  which is not an integral multiple of 64 bits in size.  The
	  implication of this rule is that the address of the first
	  chunk's save area slot is the address of the struct, and the
	  struct is laid out in the save area memory exactly as if it
	  were allocated normally (once any part in registers has been
	  stored to the save area).  [These rules are analogous to the
	  o32-bit ABI treatment - only the chunk size and the ability
	  to pass double fields in floating point registers are
	  different.]

So, if I understand this correctly, gdb ought to be left shifting small
struct parameters for the o32, n32, and n64 ABIs.  I.e, I think my patch
was correct, though I do agree with Michael that it might be better to
list the ABIs that we want to do this struct shifting for instead of
trying to list the ones that we don't want to shift.

Kevin


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