This is the mail archive of the gdb@sources.redhat.com mailing list for the GDB 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]

Re: [rfc] frame->frame => frame->addr && frame->base()



Andrew Cagney <ac131313@cygnus.com> writes:

> Hello,
> 
> This comes from DanielB's and my discussion about dwarf2 CFA and
> dwarf2's frame_base vs GDB's frame->frame.
> 
> An executive summary is that the two dwarf2 frame concepts (CFA and
> frame_base) do not go into one GDB frame (frame->frame).
> 
> Because of this, I'd like to propose that the frame object have both:
> 
> struct frame_info
> {
>   ...
> 
> // An ISA/ABI specific address within the ``specified frame'' that is
> constant throughout the lifetime of the frame.  This address is used
> by GDB as a handle to identify this frame.  This field must be
> initialized as part of the creation of a frame object.  (see dwarf2
> CFA)
> 
> CORE_ADDR addr;

If this needs to be equal to the Dwarf 2 CFA value, it seems to me the
comment should say that explicitly.  Of course the explanation
shouldn't be specific to any debug format, but it should relate its
meaning to various interesting debug formats; see my suggested text
below.

> // High level language concept of the base address of a frame.  Often
> refered to as ``frame_base'' or ``frame pointer''.  This value should
> only be computed on-demand.  It is strongly recommended, though, that
> implementations cache the computed value in the frame cache.  The
> method is initialized as part of the frame objects creation.  The
> default method returns frame->addr.  (see dwarf2 DW_AT_frame_base)
> 
> CORE_ADDR (*base) (struct frame_info *frame);

Same here --- I think the comment needs to be more explicit on what
this function's value must mean.  For example:

   Function that returns the frame's base address, for local variable
   references.  Most debug info formats describe the locations of
   stack-based local variables as offsets from some assumed base
   address; exactly what that base address is (frame pointer register?
   stack pointer?) varies from machine to machine.  Whatever the case,
   this function computes that base address.

   For Dwarf 2, the base address is the value given by the function's
   DW_AT_frame_base attribute, and the value that the DW_OP_fbreg
   instruction pushes; for STABS, the value of an N_LSYM stab is the
   offset from this base address to the variable.


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