> 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

Reply via email to