Problem converting ia64 to use new frame model
J. Johnston
jjohnstn@redhat.com
Wed Jul 9 21:52:00 GMT 2003
Andrew Cagney wrote:
>> First take a look through: WIP: Register doco
>> http://sources.redhat.com/ml/gdb/2002-07/msg00202.html
>> It's now a bit dated but the basics still apply
>>
>>> I am having problems converting the ia64-tdep.c file to use the new
>>> frame model.
>>>
>>> The main problem stems from the fact that the next frame is asked for
>>> the current
>>> registers. When dealing with the innermost frame, the sentinel frame
>>> doesn't know how
>>> to get all of the ia64 registers.
>>>
>>> In the current code, the bsp register is calculated based on the cfm
>>> and the bsp
>>> values returned from the system. For the innermost frame, the
>>> sentinel frame just
>>> goes to the sytem bsp value. The argument registers (32, 33, ...)
>>> need to be fetched
>>> from a memory location based on the calculated bsp value. These
>>> registers are not accessible
>>> via ptrace. When the sentinel frame is asked to fetch them, it ends
>>> up just grabbing
>>> them from the regcache which returns zero.
>>
>
>>
>> Are really two values? "bsp" which is the hardware register value
>> you see in the frame; and (for want of a better name) "vbsp", computed
>> from "bsp" and "cfm", which is a per-frame pointer into that the saved
>> register space.
>>
>> Looking at the existing code, it appears to be:
>> - fetching `this frame's BSP
>> - compute the PREV BSP, but then store it in THIS->bsp
>> so I suspect that the problem is more of the existing frame code being
>> one frame out - it uses the PREV "bsp" when doing stuff for THIS frame.
>>
>> Can your register unwind code be modified to do things more along
>> those lines? Compute the previous frame's "bsp" but then save it in
>> this_cache?
>>
>> As for how to "bsp". I see it is done two ways (one for the inner
>> most, and one for other frames) I have a feeling that the uwound "cfm"
>> value may need adjusting. Can it be adjusted so that, for all frames,
>> prev "bsp" can be computed using something like:
>>
>> this_cache -> prev_bsp
>> = (frame_unwind_register (next, "bsp")
>> - frame_unwind_register (next, "cfm").size-of-frame)
>>
>> instead of occasionally using size-of-locals (but note that I know
>> zilch about how ia64 frames are laid out).
>
>
> Hmm, I think I missed half your problem:
>
>> The argument registers (32, 33, ...) need to be fetched
>> from a memory location based on the calculated bsp value. These
>> registers are not accessible
>> via ptrace.
>
>
> So, once the "vbsp" is computed, gr32-gr127 registers, even for the
> inner most frame, get fetched from memory using that "vbsp" value?
>
> Looking at the ia64 code it, unlike the MIPS get_saved_register method,
> it doesn't use the next frame, instead using this frame for some of the
> register values.
>
> Anyway, the MIPS solved a different problem using the following:
>
> - all the general purpose registers are pseudos
> (you'd probably just want the ones causing problems?)
>
> - the pseudo register read/write methods map the pseudos onto raw
> registers when at the regcache level
> (you'd probably want to map them onto memory locations?)
>
> - the frame unwind code (note the MIPS hasn't switched) does the same
> thing for registers saved in a frame - it populates the pseudo register
> range of saved addresses with the corresponding register addresses
> (very similar - set the saved_regs address for those registers)
>
> - map the debug info register numbers onto the pseudos instead of the
> raw registers
> (straight forward)
>
> I should note that currently I'm adding code (user-regs) that will let a
> target (the MIPS at present) specify registers that are more like what
> you have here, this is work-in-progress intended for only the mainline
> though.
>
>> I have looked into pseudo registers, but this doesn't solve the
>> problem because there isn't
>> a way AFAICT to notify the frame code to convert a register number
>> into a pseudo register
>> number. The dwarf2_reg_to_regnum() interface, for example, isn't used
>> by the frame code when
>> performing an info registers call.
>
>
> Things like `info registers' use register groups to decide which
> registers should be displayed. The default register group
> implementation relies on the presence/absence of register names :-/
>
Thanks, this was just what I was looking for. I now have info registers
working as it did before the new frame model.
> You might want to customize the register groups (at least for general,
> all and float) so that they better identify which registers should be
> displayed.
>
> Andrew
>
>
>
More information about the Gdb
mailing list