Re: Invalid registers

Andrew STUBBS
2005-07-13T15:13:49Z

On Tue, 12 Jul 2005 18:34:50 +0100, Daniel Jacobowitz <drow@false.org>
wrote:
> Sorry, not enough information - I'd need specifics. GCC's CFI
> generally does not represent call-clobbered registers; waste of space
> for a runtime unwinder.

Ok, after further investigation, here's what I'm seeing.

The default init_reg function, dwarf2_frame_default_init_reg, sets up the
PC and stack pointer registers so that they do the right thing.
Additionally, the CFI information describes how the R14 (frame pointer)
and PR (saved PC) registers are saved to the stack.

With this setup, 'frame 1' followed by 'info all-registers' shows the
correct values (I assume) for the four registers above, and (potentially)
incorrect values for everything else.

So I set up a function, as follows, to tell it that anything is invalid,
unless it knows otherwise:

sh_dwarf2_frame_init_reg (struct gdbarch *gdbarch, int regnum,
struct dwarf2_frame_state_reg *reg)
{
/* Mark PC as destination for the return address. */
if (regnum == PC_REGNUM)
reg->how = DWARF2_FRAME_REG_RA;

/* Mark stack pointer set it to the call frame address. */
else if (regnum == SP_REGNUM)
reg->how = DWARF2_FRAME_REG_CFA;

/* Mark all other registers as invalid.
Braindead, but ok for now. */
else
reg->how = DWARF2_FRAME_REG_UNDEFINED;
}

With this function I get different wrong behaviour. Now I get all but PC
and R15 (stack pointer) as '*value not available*'. I had expected that
that the CFI would override the initialised values because it knows best
(just because it is called 'init', not 'set), but neither R14 nor PR have
their true values listed despite execute_cfa_program extracting a 'how'
value of DWARF2_FRAME_REG_SAVED_OFFSET. Clearly this is not the case, but
should it be?

Obviously the function above is overkill, in any case, because callee
saved registers always have a useful value in them - either they have not
changed or they have been saved and the CFI knows about it. I could fix
that by just looking up exactly which they are and encoding it into the
function above.

However, it is not clear to me what to do with caller save registers. If I
just set them to undefined, as above, then they will never have a value,
but are there sometimes saved values for those registers (saved by the
caller) and cannot CFI describe this? In short, is it always the case that
call clobblered registers are unavailable? I know the PR register is
technically caller save, but has a CFI entry in my test program, but then
in practice PR is really treated as callee save anyway. Is that just a
special case?

Thanks

Andrew Stubbs