[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 >