> I gather that r0 is the stack pointer and r6 the frame pointer?

Yes.

> > 00000014 00000030 00000000 FDE cie=00000000 pc=00000000..00000043
> >   DW_CFA_advance_loc4: 2 to 00000002
> >   DW_CFA_def_cfa_offset: 32
> >   DW_CFA_offset: r12 at cfa-8
> >   . . .
> >   DW_CFA_offset: r6 at cfa-32
> >   DW_CFA_advance_loc4: 3 to 00000005
> >   DW_CFA_def_cfa: r6 ofs 36
> >   DW_CFA_advance_loc4: 2 to 00000007
> >   DW_CFA_def_cfa_register: r0
> >   ( that's it for debug info )
> 
> If so, the above DW_CFA_def_cfa_register doesn't make sense, it should be r6 
> once the frame is established.  What does the CIE contain exactly?


00000000 00000010 ffffffff CIE
  Version:               3
  Augmentation:          ""
  Code alignment factor: 1
  Data alignment factor: -4
  Return address column: 17

  DW_CFA_def_cfa: r0 ofs 4
  DW_CFA_offset: r17 at cfa-4
  DW_CFA_nop
  DW_CFA_nop

00000014 00000030 00000000 FDE cie=00000000 pc=00000000..00000043
  DW_CFA_advance_loc4: 2 to 00000002
  DW_CFA_def_cfa_offset: 32
  DW_CFA_offset: r12 at cfa-8
  DW_CFA_offset: r11 at cfa-12
  DW_CFA_offset: r10 at cfa-16
  DW_CFA_offset: r9 at cfa-20
  DW_CFA_offset: r8 at cfa-24
  DW_CFA_offset: r7 at cfa-28
  DW_CFA_offset: r6 at cfa-32
  DW_CFA_advance_loc4: 3 to 00000005
  DW_CFA_def_cfa: r6 ofs 36
  DW_CFA_advance_loc4: 2 to 00000007
  DW_CFA_def_cfa_register: r0


> > Perhaps the stack-check code should set FRAME_RELATED on any stack
> > adjustment insn?
> 
> No, the design is that stack checking or alloca force the use of the frame 
> pointer, which thus becomes the CFA register, which means that subsequent 
> stack adjustments are irrelevant for the CFI.

Does the backend have to *not* mark further changes to the stack
pointer in the prologue as frame related, if the function calls
alloca?  This is the RL expand_prologue() is emitting:

(insn/f 42 5 43 2 (parallel [
            (set/f (reg/f:SI 0 r0)
                (minus:SI (reg/f:SI 0 r0)
                    (const_int 28 [0x1c])))
            (set/f (mem:SI (minus:SI (reg/f:SI 0 r0)
                        (const_int 4 [0x4])) [0  S4 A8])
                (reg:SI 12 r12))
            (set/f (mem:SI (minus:SI (reg/f:SI 0 r0)
                        (const_int 8 [0x8])) [0  S4 A8])
                (reg:SI 11 r11))
            (set/f (mem:SI (minus:SI (reg/f:SI 0 r0)
                        (const_int 12 [0xc])) [0  S4 A8])
                (reg:SI 10 r10))
            (set/f (mem:SI (minus:SI (reg/f:SI 0 r0)
                        (const_int 16 [0x10])) [0  S4 A8])
                (reg:SI 9 r9))
            (set/f (mem:SI (minus:SI (reg/f:SI 0 r0)
                        (const_int 20 [0x14])) [0  S4 A8])
                (reg:SI 8 r8))
            (set/f (mem:SI (minus:SI (reg/f:SI 0 r0)
                        (const_int 24 [0x18])) [0  S4 A8])
                (reg/f:SI 7 r7))
            (set/f (mem:SI (minus:SI (reg/f:SI 0 r0)
                        (const_int 28 [0x1c])) [0  S4 A8])
                (reg/f:SI 6 r6))
        ]) dj.c:2 -1
     (nil))

(insn/f 43 42 44 2 (parallel [
            (set (reg/f:SI 6 r6)
                (plus:SI (reg/f:SI 0 r0)
                    (const_int -4 [0xfffffffffffffffc])))
            (clobber (reg:CC 16 cc))
        ]) dj.c:2 -1
     (nil))

(insn/f 44 43 45 2 (set (reg/f:SI 0 r0)
        (reg/f:SI 6 r6)) dj.c:2 -1
     (nil))

Reply via email to