Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Pedro Alves <palves@redhat.com>
To: lgustavo@codesourcery.com,
	       "'gdb-patches@sourceware.org'"
	<gdb-patches@sourceware.org>
Subject: Re: [PATCH] MIPS bit field failures in gdb.base/store.exp
Date: Fri, 26 Sep 2014 15:45:00 -0000	[thread overview]
Message-ID: <5425835B.609@redhat.com> (raw)
In-Reply-To: <54246DAE.6080208@codesourcery.com>

On 09/25/2014 08:31 PM, Luis Machado wrote:

> ping! Any ideas on different approaches suitable for this problem or is 
> the proposed fix ok (with either passing a value struct or a bit size)?

Sorry, it's not easy to have a quick opinion without thinking this
through...

So, in value_assign, the case in question, we see:

	gdbarch = get_frame_arch (frame);
	if (gdbarch_convert_register_p (gdbarch, VALUE_REGNUM (toval), type))
	  {
	    /* If TOVAL is a special machine register requiring
	       conversion of program values to a special raw
	       format.  */
	    gdbarch_value_to_register (gdbarch, frame,
				       VALUE_REGNUM (toval), type,
				       value_contents (fromval));
	  }

Notice how gdbarch_value_to_register takes the fromval's contents
as a buffer, only, and isn't passed down anything that would make it
possible to find out whether it's writing to a bitfield, so that
the implementation could do a read-modify-write itself and
write to the proper bitfield offset.

So, it seems to me that until we find an arch that needs to handle
bitfields especially (I'm having trouble imagining why that
would be necessary), we should just change value_assign's
lval_register handling from:

	if (gdbarch_convert_register_p (gdbarch, VALUE_REGNUM (toval), type))
	  {	
             gdbarch_value_to_register ();
	  }
	else
	  {
	    if (value_bitsize (toval))
               {
                   // read-modify-write
               }
            else
	       {
		   put_frame_register_bytes ();
               }
          }

to:

       if (value_bitsize (toval))
          {
              // read-modify-write
          }
	else
	  {
             if (gdbarch_convert_register_p (gdbarch, VALUE_REGNUM (toval), type))
	       {
                  gdbarch_value_to_register ();
	       }
            else
	       {
		  put_frame_register_bytes ();
               }
          }

Thanks,
Pedro Alves


  reply	other threads:[~2014-09-26 15:45 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-09-12 20:11 Luis Machado
2014-09-19 16:45 ` Luis Machado
2014-09-19 17:12 ` Pedro Alves
2014-09-19 17:39   ` Luis Machado
2014-09-25 19:32     ` Luis Machado
2014-09-26 15:45       ` Pedro Alves [this message]
2014-09-29 12:36         ` Luis Machado
2014-09-29 13:30           ` Pedro Alves
2014-09-29 17:35             ` Luis Machado
2014-09-30 11:00               ` Pedro Alves
2014-10-03 11:23                 ` Luis Machado

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=5425835B.609@redhat.com \
    --to=palves@redhat.com \
    --cc=gdb-patches@sourceware.org \
    --cc=lgustavo@codesourcery.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