RFA: Fix DWARF2 CFI for m68k
Richard Guenther
richard.guenther@gmail.com
Fri Jul 23 09:20:00 GMT 2010
On Fri, Jul 23, 2010 at 4:18 AM, Daniel Jacobowitz <dan@codesourcery.com> wrote:
> I traced a large number of GDB test failures on m68k-elf to bogus CFI
> data. Here's a typical example:
>
> foo:
> .LFB0:
> .file 1 "gdb.base/advance.c"
> .loc 1 5 0
> .cfi_startproc
> link.w %fp,#-4
> .LCFI0:
> .cfi_def_cfa 14, 8
> .loc 1 6 0
> move.l 8(%fp),%a0
> lea (10,%a0),%a0
> move.l %a0,-4(%fp)
> .loc 1 7 0
> move.l -4(%fp),%d0
> .loc 1 8 0
> unlk %fp
> .cfi_offset 14, -8
> rts
> .cfi_endproc
>
> Take a look at that .cfi_offset. It represents the save of %fp at
> CFA-8, by the link.w instruction. But it's way down at the end, and
> the link.w instruction modified %fp. So GDB's idea of the saved value
> of %fp is wrong except right before the rts (at which point it's wrong
> again, because we're after the unlk - but that's a different issue).
>
> The problem was the parallel used by the link.w pattern.
> dwarf2out_frame_debug outputs queued saves if the current insn would
> interfere, before processing it. But it doesn't output saves after
> the insn if the insn itself both queued new saves and clobbered the
> register they were relative to.
>
> This shows up for m68k because the link instruction does a save and a
> frame pointer update in parallel. I believe it doesn't show up for
> other architectures, e.g. ARM, because the frame-related epxr on ARM
> is a SEQUENCE rather than a PARALLEL.
>
> Regression tested on an m68k-elf cross compiler (three ColdFire
> multilibs with QEMU). We've also had it in our tree for a while to
> test on other platforms.
>
> OK to commit?
Ok.
Thanks,
Richard.
> --
> Daniel Jacobowitz
> CodeSourcery
>
> 2010-07-22 Daniel Jacobowitz <dan@codesourcery.com>
>
> * dwarf2out.c (dwarf2out_frame_debug): Check for queued saves
> again after processing insn.
>
> Index: gcc/dwarf2out.c
> ===================================================================
> --- gcc/dwarf2out.c (revision 162416)
> +++ gcc/dwarf2out.c (working copy)
> @@ -2791,6 +2791,12 @@ dwarf2out_frame_debug (rtx insn, bool af
> insn = PATTERN (insn);
> found:
> dwarf2out_frame_debug_expr (insn, label);
> +
> + /* Check again. A parallel can save and update the same register.
> + We could probably check just once, here, but this is safer than
> + removing the check above. */
> + if (clobbers_queued_reg_save (insn))
> + flush_queued_reg_saves ();
> }
>
> /* Determine if we need to save and restore CFI information around this
>
More information about the Gcc-patches
mailing list