On Wed, Feb 06, 2013 at 03:18:27PM -0500, David Miller wrote:
> From: Eric Botcazou <[email protected]>
> Date: Wed, 06 Feb 2013 11:13:30 +0100
>
> > I think testing crtl->uses_only_leaf_regs is sufficient here (and
> > while you're at it, you could also test the value of
> > HAVE_window_save, which can be 0 if -mflat is passed on the SPARC),
> > so
> >
> > #ifdef HAVE_window_save
> > if (HAVE_window_save && !crtl->uses_only_leaf_regs)
> > {
> >
> > }
> > #endif
>
> Yes, this works perfectly, Jakub any objections?
Perhaps some progress, but not fully working. I guess you should start
with deciding when the regs should be remapped. Consider even
simple testcase like (-O2 -g -dA):
int
foo (int a, int b)
{
int c = a;
int d = a + b;
int e = a + b;
return e;
}
Before *.vartrack, all debug_insn as well as normal insns refer to
%i0 and %i1, before your patch some NOTE_INSN_VAR_LOCATION were referring
to %o[01] registers, others to %i[01] registers, with your patch all refer
to %i[01] registers. leaf_renumber_regs isn't performed on notes (so,
neither NOTE_INSN_VAR_LOCATION nor NOTE_INSN_CALL_ARG_LOCATION are
adjusted). Then supposedly somewhere in dwarf2out we do some adjustment,
but still end up with d/e loclist of:
.LLST2:
.uaxword .LVL0-.Ltext0 ! Location list begin address (*.LLST2)
.uaxword .LVL1-.Ltext0 ! Location list end address (*.LLST2)
.uahalf 0x6 ! Location expression size
.byte 0x88 ! DW_OP_breg24
.byte 0 ! sleb128 0
.byte 0x89 ! DW_OP_breg25
.byte 0 ! sleb128 0
.byte 0x22 ! DW_OP_plus
.byte 0x9f ! DW_OP_stack_value
.uaxword .LVL1-.Ltext0 ! Location list begin address (*.LLST2)
.uaxword .LFE0-.Ltext0 ! Location list end address (*.LLST2)
.uahalf 0x1 ! Location expression size
.byte 0x58 ! DW_OP_reg8
.uaxword 0 ! Location list terminator begin (*.LLST2)
.uaxword 0 ! Location list terminator end (*.LLST2)
where I'd expect breg8/breg9 instead.
Jakub