> 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
OK so r0 (sp) is the CFA register upon entering the function. Then... > 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 ... r6 (fp) briefly becomes the CFA register but... > DW_CFA_advance_loc4: 2 to 00000007 > DW_CFA_def_cfa_register: r0 ... r0 (sp) is restored almost immediately as the CFA register. That's the bug, r6 (fp) must be kept as the CFA register throughout the function. > Does the backend have to *not* mark further changes to the stack > pointer in the prologue as frame related, if the function calls > alloca? I think that the bug is unrelated to alloca or stack checking: _medium_frame: pushm r6-r12 add #-4, r0, r6 ; marked frame-related (fp = sp - 4) mov.L r6, r0 ; marked frame-related (sp = fp) . . . ; stack checking code goes here add #0xffffc000, r0 ; not marked frame-related The "mov.L r6, r0" instruction must never be marked as frame-related, for any function. -- Eric Botcazou