This is the mail archive of the gdb@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Invalid registers


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]