Re: Invalid registers

Marcel Moolenaar
2005-07-12T17:19:00Z

On Jul 12, 2005, at 9:13 AM, Andrew STUBBS wrote:

> On Mon, 11 Jul 2005 19:47:01 +0100, Marcel Moolenaar
> <marcel@cup.hp.com> wrote:
>> Given that registers are available when a value has been supplied,
>> it's logical to assume (a priori) that a register is unavailable
>> when no value has been supplied. A register's valid "bit" allows
>> for this since there are 2 states that indicate unavailability:
>> One that indicates a temporary state (0) and one that indicates a
>> permanent state (-1). The initial state of a register is the
>> temporarily
>> unavailable state, which triggers fetching the register from the
>> target. The target can change the state to permanently unavailable
>> or supply the value (it can also, theoretically at least, leave the
>> state unmodified and not provide a value). Hence, the a priori
>> assumption that registers are unavailable when no value has been
>> supplied (i.e. when the valid "bit" is not 1) seems to yield good
>> behaviour when implemented as such. I would say then that gdb knows
>> when a value is not available.
>
> Thanks, I did look at this before I posted, but I concluded that I was
> not what I was looking for. I mean, how would the target know what
> frame you were in?

You only ask the target about the current or interrupted state (i.e.
frame #0). From that you unwind to the state of the frame in question.
I noticed that even in frame #0 all registers were displayed. Even if
I marked some of them as unavailable. This of course affects unwinding
as well. So, even though I misunderstood the context, the issues are
closely related.

> I do not know what it means for a register to be invalid in the
> target. Might it be because some registers are not available when, for
> example, the FPU is disabled?

Yes, that could be a possibility. On ia64, for example, the number
of stacked registers is variable. gdb currently displays all 96 of
them, even if the frame has only 3 stacked registers allocated.
Other examples include registers that are simply not exposed through
ptrace(2) or saved in core files. That is, the set of registers
available to gdb may vary between operating systems. It makes sense
for gdb to know about the superset, but it would be nice if it then
didn't output 0 values for registers that aren't available as that
may cause confusion.

BTW: this isn't a big deal, because you can debug your code anyway.
It's just (much) nicer to be able to represent reality better.

--
Marcel Moolenaar USPA: A-39004 marcel@xcllnt.net