v850, dwarf2, too many fp-sp compensations?
DJ Delorie
dj@redhat.com
Tue Apr 4 20:41:00 GMT 2006
The v850 is a dwarf-debug target, but not a dwarf-unwind target. In
dwarf2out.c we first calculate the "fp to fb offset" in
compute_frame_pointer_to_fb_displacement. The frame pointer is not
needed, so note that we include the fp-sp elimination offset in
frame_pointer_fb_offset.
-------------------- \/ --------------------
/* Compute a displacement from the "steady-state frame pointer" to the
frame base (often the same as the CFA), and store it in
frame_pointer_fb_offset. OFFSET is added to the displacement
before the latter is negated. */
static void
compute_frame_pointer_to_fb_displacement (HOST_WIDE_INT offset)
{
rtx reg, elim;
#ifdef FRAME_POINTER_CFA_OFFSET
reg = frame_pointer_rtx;
offset += FRAME_POINTER_CFA_OFFSET (current_function_decl);
#else
reg = arg_pointer_rtx;
offset += ARG_POINTER_CFA_OFFSET (current_function_decl);
#endif
elim = eliminate_regs (reg, VOIDmode, NULL_RTX);
if (GET_CODE (elim) == PLUS)
{
offset += INTVAL (XEXP (elim, 1));
elim = XEXP (elim, 0);
}
gcc_assert (elim == (frame_pointer_needed ? hard_frame_pointer_rtx
: stack_pointer_rtx));
frame_pointer_fb_offset = -offset;
}
-------------------- /\ --------------------
Later, when we calculate function parameter locations, we end up in
based_loc_descr(). We call eliminate_regs again, adjust for the
elimination offset, then adjust for frame_pointer_fb_offset, which
*also* includes the elimination offset:
-------------------- \/ --------------------
static dw_loc_descr_ref
based_loc_descr (rtx reg, HOST_WIDE_INT offset)
{
unsigned int regno;
/* We only use "frame base" when we're sure we're talking about the
post-prologue local stack frame. We do this by *not* running
register elimination until this point, and recognizing the special
argument pointer and soft frame pointer rtx's. */
if (reg == arg_pointer_rtx || reg == frame_pointer_rtx)
{
rtx elim = eliminate_regs (reg, VOIDmode, NULL_RTX);
if (elim != reg)
{
if (GET_CODE (elim) == PLUS)
{
offset += INTVAL (XEXP (elim, 1));
elim = XEXP (elim, 0);
}
gcc_assert (elim == (frame_pointer_needed ? hard_frame_pointer_rtx
: stack_pointer_rtx));
offset += frame_pointer_fb_offset;
return new_loc_descr (DW_OP_fbreg, offset, 0);
}
}
-------------------- /\ --------------------
The net result is that the dwarf2 debug information is off by the
fp-sp offset. My question is: which of these adjustments isn't
supposed to happen in this case?
Thanks,
DJ
More information about the Gcc
mailing list