Re: Dwarf 2 Stack pointer unwind.

Daniel Jacobowitz
2005-02-01T17:25:10Z

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