This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
[ping] dwarf2out vs DWARF_DEBUG bug?
[note subject change, since I suspect it's not v850-specific]
There are 18 target directories that define DWARF2_DEBUGGING_INFO (not
counting all those that get it from elfos.h et al) but only 8 that
define DWARF2_UNWIND_INFO (both from just a simple grep).
> Date: Tue, 4 Apr 2006 16:41:25 -0400
>
> 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
>