Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Elena Zannoni <ezannoni@redhat.com>
To: vinschen@redhat.com, gdb-patches@sources.redhat.com
Subject: Re: [RFA] sh-tdep.c (sh_use_struct_convention): Restructure and fix
Date: Thu, 09 Oct 2003 22:51:00 -0000	[thread overview]
Message-ID: <16261.53197.951881.194874@localhost.redhat.com> (raw)
In-Reply-To: <20031004113939.GK11435@cygbert.vinschen.de>

Corinna Vinschen writes:
 > Hi,
 > 
 > the below patch straightens out sh_use_struct_convention() so that it
 > allows a far better readability than before, especially by allowing
 > a bunch of comments spread out through the code.
 > 

I just added a detailed comment. Does that match what you implemented?
I'd prefer the use of 'aggregate' instead of 'struct' in your comments.

 > Additionally it fixes one bug:  A struct of lenght 4 bytes, which
 > consists of only a bitfield, is returned in register r0, not on the
 > stack using the struct convention.  So far, GDB got that wrong.
 > 

Is there a test case that was failing? If not, it should be added. 

 > Corinna
 > 
 > 	* sh-tdep.c (sh_use_struct_convention): Clean up to have a
 > 	more readable code.  Accomodate 4 byte structs with 4 byte sized
 > 	first field (e.g. bitfields).
 > 
 > Index: sh-tdep.c
 > ===================================================================
 > RCS file: /cvs/src/src/gdb/sh-tdep.c,v
 > retrieving revision 1.145
 > diff -u -p -r1.145 sh-tdep.c
 > --- sh-tdep.c	3 Oct 2003 08:13:37 -0000	1.145
 > +++ sh-tdep.c	4 Oct 2003 11:32:00 -0000
 > @@ -565,8 +565,25 @@ sh_use_struct_convention (int gcc_p, str
 >  {
 >    int len = TYPE_LENGTH (type);
 >    int nelem = TYPE_NFIELDS (type);
 > -  return ((len != 1 && len != 2 && len != 4 && len != 8) || nelem != 1) &&
 > -    (len != 8 || TYPE_LENGTH (TYPE_FIELD_TYPE (type, 0)) != 4);
 > +
 > +  /* Non-power of 2 length types and types bigger than 8 bytes (which don't
 > +     fit in two registers anyway) use struct convention.  */
 > +  if (len != 1 && len != 2 && len != 4 && len != 8)
 > +    return 1;
 > +  /* Structs with more than 1 fields use struct convention, if...  */
 > +  if (nelem != 1)
 > +    {
 > +      /* ... they are 1 or 2 bytes in size (e.g. struct of two chars)... */
 > +      if (len != 4 && len != 8)

Can you just say len == 1 or len == 2 so that it matches your comment?
Wait, this contradicts what the comments I just added say:

For example, a 2-byte aligned structure with size 2 bytes has the
same size and alignment as a short int, and will be returned in R0.

Which is correct?


 > +	return 1;

 > +      /* ... or, if the struct is 4 or 8 bytes and the first field is
 > +	 not of size 4 bytes.  Note that this also covers structs with
 > +	 bitfields. */
 > +      if (TYPE_LENGTH (TYPE_FIELD_TYPE (type, 0)) != 4)

I am not sure I understand this one, that's why asked a pointer to a
test case. It seems to contradict the following, i.e. it should still
be in registers, or maybe I don't understand the language:

When an aggregate type is returned in R0 and R1, R0 contains the first
four bytes of the aggregate, and R1 contains the remainder. If the size
of the aggregate type is not a multiple of 4 bytes, the aggregate is
tail-padded up to a multiple of 4 bytes. The value of the padding is
undefined.


elena


 > +	return 1;
 > +    }
 > +  /* Otherwise return in registers.  */
 > +  return 0;
 >  }
 >  
 >  /* Extract from an array REGBUF containing the (raw) register state
 > 
 > -- 
 > Corinna Vinschen
 > Cygwin Developer
 > Red Hat, Inc.


  parent reply	other threads:[~2003-10-09 22:51 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-10-04 11:39 Corinna Vinschen
2003-10-04 15:54 ` Andrew Cagney
2003-10-04 17:04   ` Kevin Buettner
2003-10-04 17:35     ` Andrew Cagney
2003-10-04 18:13       ` Kevin Buettner
2003-10-06 16:31         ` Andrew Cagney
2003-10-04 18:08   ` Corinna Vinschen
2003-10-06 15:52     ` Andrew Cagney
2003-10-07 14:52       ` Corinna Vinschen
2003-10-08 17:39         ` Andrew Cagney
2003-10-09 22:51     ` Elena Zannoni
2003-10-11 20:05       ` Andrew Cagney
2003-10-09 22:51 ` Elena Zannoni [this message]
2003-10-10  7:29   ` Corinna Vinschen
2003-10-10 15:01     ` Corinna Vinschen
2003-10-10 16:32       ` Elena Zannoni
2003-10-10 16:59         ` Corinna Vinschen
2003-10-10 17:56           ` Elena Zannoni
2003-10-10 19:14             ` Corinna Vinschen
2003-10-10 16:28     ` Elena Zannoni

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=16261.53197.951881.194874@localhost.redhat.com \
    --to=ezannoni@redhat.com \
    --cc=gdb-patches@sources.redhat.com \
    --cc=vinschen@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox