This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]