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: Dwarf 2 Stack pointer unwind.


On Tue, Feb 01, 2005 at 05:18:42PM +0000, Con Bradley wrote:
> Hi,
>    We have an ABI where the stack pointer is never saved to the stack
> on a function call and there is NO frame pointer. Instead the stack is
> maintained by stack pointer increments and decrements.
> How does one describe this in Dwarf Call Frame Instructions? The only
> rules available for register operations are to save on the stack or to
> copy to another register. No rules to describe plus or negative
> register adjustments.
> 
>   I find it difficult to understand why there is no support for this
> in Dwarf 2 or Dwarf 3 as this must be a common idiom.

I recommend you asking this on the dwarf2 mailing list instead of here.

> When we adjust the stack pointer we issue CFA_CFA_def_cfa operations
> to describe the new rule to access the CFA, effectively issuing a CFA
> rule to compensate for the stack pointer being changed. This is
> sufficient to allow stack unwind to work. However, when we look up the
> values of automatics in upper stack frames this fails. The reason
> being that the address of these variables (in location expressions) is given
> as an offset from the stack pointer but there appear to be no unwind
> rules for the stack pointer register.
> 
> More correctly we'd like to say that the address of an automatic was
> CFA plus offset but there doesn't appear to be any support for this.
> 
> How does one describe stack pointer changes which do not involve
> saving on the stack or use of a frame pointer.

A couple of ways to link the frame base (DW_AT_frame_base) to the CFA
have been proposed.  Nothing's been picked yet though.

To see how this is handled in GDB, look at
dwarf2_frame_default_init_reg.  By setting SP_REGNUM's rule to
DWARF2_FRAME_REG_CFA, we have the value of the stack pointer for the
frame.  Then you can define appropriate DW_AT_frame_base values and use
DW_OP_fbreg.

-- 
Daniel Jacobowitz


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