Invalid registers

Andrew STUBBS andrew.stubbs@st.com
Wed Jul 13 15:13:00 GMT 2005


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



More information about the Gdb mailing list