> 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))