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