This is the mail archive of the gdb-patches@sourceware.org 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: [PATCH] MIPS bit field failures in gdb.base/store.exp


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


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