[cagney_convert-20030606-branch] Add value to REGISTER_TO_VALUE et.al.

Andrew Cagney ac131313@redhat.com
Sun Jun 8 17:15:00 GMT 2003


>    Date: Fri, 06 Jun 2003 14:12:23 -0400
>    From: Andrew Cagney <ac131313@redhat.com>
> 
>    Mark,
> 
>    I've created the branch: cagney_convert-20030606-branch and committed 
>    the attached.  It's different from the original in the following ways:
> 
>    - REGISTER_TO_VALUE and VALUE_TO_REGISTER take the full ``struct value'' 
>    instead of ``struct type'' and a ``void *buf''.  Those methods are now 
>    entirely responsible for converting a register to/from the specified value.
> 
> There is defenitely something wrong here.  The first thing is that in
> valops.c:value_assign() you call CONVERT_REGISTER_P as follows:

I'm not suprised, nothing in the testsuite was testing it.

>    +	if (CONVERT_REGISTER_P (VALUE_REGNO (toval), VALUE_TYPE (toval)))
> 
> This is wrong for the lval_reg_frame_relative case.  Replacing
> `VALUE_REGNO (toval)' with `value_reg' seems the obvious solution, and
> indeed, this makes us execute the following line:
> 
>    +	    VALUE_TO_REGISTER (frame, fromval);
> 
> This is strange.  Which register should FROMVAL be stored in?  That
> information is contained in TOVAL.  Passing TOVAL here is also wrong,
> since the contents of the value are contained in FROMVAL.  A possible
> solution is passing the register number to VALUE_TO_REGISTER.  Another
> solution is assigning the contents of FROMVAL to (a copy of) TOVAL and
> pass the latter to VALUE_TO_REGISTER.  This seems to be what you had
> in mind when you wrote the MIPS implementation of VALUE_TO_REGISTER.
> 
> Besides this issue I have a few other comments on these interfaces.
> 
> 1. I think it is a good idea to ask the following question again: Why
>    do we have both lval_register and lval_reg_frame_relative?

lval_memory and lval_register are important when it comes to storing 
registers, but not when tracking variables.  A variable should really 
only have lval_reg_frame_relative.  Tried it though and things ``broke''.

>    Both seem to deal with values stored in registers.  Yes, these can
>    be frame-relative or not.  But wouldn't it be better to let
>    VALUE_FRAME_ID() indicate this?  A value of null_frame_id would
>    then indicate a global register variable.

Yep, ref: Use of lval_register?
http://sources.redhat.com/ml/gdb/2003-06/msg00065.html
In theory, it's always frame-relative.

>    I may be mistaken, but I think this has consequences for the
>    REGISTER_TO_VALUE interface.  Instead of an interface that
>    constructs the complete value, I think we need an interface that
>    just fetches the contents from the appropriate registers; something
>    that is similar to what we have now.
> 
> 2. What do we guarantee about the `struct value' that is passed to
>    VALUE_TO_REGISTER?  That it is created by REGISTER_TO_VALUE?

The code guarentee that REGISTER_CONVERT_P holds and, by implication, 
REGISTER_TO_VALUE was used to construct it.

> 
>    - Adds the possibly contraversal put_frame_register method.  It turned 
>    out that at least three functions contained the code sequence: find 
>    REGNUM's true location, store the value in that location.
> 
> Nothing against the function, but can we try to keep the naming of the
> register functions a bit more symmetrical?

I do.  Its the frame oposites (get_frame_xxxxx) that are the problem and 
need some savage renaming.

> Anyway, I don't think you should check this in just yet.  It
> definitely needs some more discussion.

I was assuming you were going to fix it (or at least the write side :-)

The ``obvious'' interfaces were:

register_to_value (frame, regnum, type, buffer)
value_to_register (frame, regnum, type, buffer)

but that tripped up on something (now what ...?).  Dig dig.  Notice how, 
to preserve existing behavior, legacy_register_to_value saves the 
location based on what frame_register returns.  We'd have to switch to 
lval_reg_frame_relative.

Andrew




More information about the Gdb-patches mailing list