Mirror of the gdb mailing list
 help / color / mirror / Atom feed
From: Andrew Cagney <cagney@gnu.org>
To: Jim Blandy <jimb@redhat.com>
Cc: gdb@sources.redhat.com
Subject: Re: interface to partial support for DW_OP_piece in dwarf2expr.[ch]
Date: Wed, 04 Aug 2004 16:53:00 -0000	[thread overview]
Message-ID: <4111145F.7000504@gnu.org> (raw)
In-Reply-To: <vt2fz743d9h.fsf@zenia.home>

> Full support for the Dwarf DW_OP_piece operator in location
> expressions would require major work on 'struct value' and its users.
> But in many cases, compilers use DW_OP_piece in a restricted way, such
> that all the multi-piece locations actually generated could be
> expressed using the 'struct symbol' and 'struct value' we have today.
> 
> For example, on the PowerPC E500, the 32-bit upper and lower halves of
> the 64-bit gprs have separate register numbers in Dwarf information,
> but GDB has (pseudo-)registers that refer to the entire 64 bits.  So a
> Dwarf 3 location expression that places one piece in an upper-half
> register and another piece in the corresponding lower-half register
> could be represented by a 'struct value' V where VALUE_LVAL (V) ==
> lval_register and VALUE_REGNO (V) is the pseudo-register number.
> 
> Recognizing these cases requires calling out to architecture-specific
> code.  When an patch implementing this was first posted, there was
> general agreement that dwarf2expr.[ch] ought not call architecture
> methods directly, as it did in the patch, but should instead return
> the list of pieces; and that dwarf2expr.[ch]'s callers (specifically,
> the code in dwarf2loc.c) should take care of whatever wrangling was
> needed to turn that list of pieces into the right 'struct value',
> architecture-specific or otherwise.  That thread starts here:
> 
>     http://sources.redhat.com/ml/gdb-patches/2003-05/msg00425.html
> 
> Here's a sketch of how we might extend the Dwarf expression evaluation
> interface to return piece lists, meant to implement the suggestions in
> that thread.  If this looks reasonable, then I'll do some more work
> and post it for further review.

Knowing that GCC 3.5 is going to be a heavy user of DW_OP_piece, means 
that we need to start moving on this, and its good to see this happening.

I'm just having trouble getting my head around how this will affect 
core-gdb, and seeing how this addresses our need to meet GCC 3.5's 
requirements?

Can we expand on that?

--

Looking at the below:

- a single value can have multiple locations (important for store)
- could dwarf2_expr_piece be called ``struct location''? :-)

Andrew

> *** dwarf2expr.h.~1.5.~	2003-06-08 13:27:13.000000000 -0500
> --- dwarf2expr.h	2004-08-03 02:07:08.000000000 -0500
> *************** struct dwarf_expr_context
> *** 74,79 ****
> --- 74,122 ----
>     /* Non-zero if the result is in a register.  The register number
>        will be on the expression stack.  */
>     int in_reg;
> + 
> +   /* An array of pieces.  PIECES points to its first element;
> +      NUM_PIECES is its length.
> + 
> +      Each time DW_OP_piece is executed, we add a new element to the
> +      end of this array, recording the current top of the stack, the
> +      current in_reg flag, and the size given as the operand to
> +      DW_OP_piece.  We then pop the top value from the stack, clear the
> +      in_reg flag, and resume evaluation.
> + 
> +      The Dwarf spec doesn't say whether DW_OP_piece pops the top value
> +      from the stack.  We do, ensuring that clients of this interface
> +      expecting to see a value left on the top of the stack (say, code
> +      evaluating frame base expressions or CFA's specified with
> +      DW_CFA_def_cfa_expression) will get an error if the expression
> +      actually marks all the values it computes as pieces.
> + 
> +      If an expression never uses DW_OP_piece, num_pieces will be zero.
> +      (It would be nice to present these cases as expressions yeilding
> +      a single piece, with in_reg clear, so that callers need not
> +      distinguish between the no-DW_OP_piece and one-DW_OP_piece cases.
> +      But expressions with no DW_OP_piece operations have no value to
> +      place in a piece's 'size' field; the size comes from the
> +      surrounding data.  So the two cases need to be handled
> +      separately.)  */
> +   int num_pieces;
> +   struct dwarf_expr_piece *pieces;
> + };
> + 
> + 
> + /* A piece of an object, as recorded by DW_OP_piece.  */
> + struct dwarf_expr_piece
> + {
> +   /* If IN_REG is zero, then the piece is in memory, and VALUE is its address.
> +      If IN_REG is non-zero, then the piece is in a register, and VALUE
> +      is the register number.  */
> +   int in_reg;
> + 
> +   /* This piece's address or register number.  */
> +   CORE_ADDR value;
> + 
> +   /* The length of the piece, in bytes.  */
> +   ULONGEST size;
>   };
>   
>   struct dwarf_expr_context *new_dwarf_expr_context (void);


  reply	other threads:[~2004-08-04 16:53 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-08-03  7:15 Jim Blandy
2004-08-04 16:53 ` Andrew Cagney [this message]
     [not found]   ` <vt2fz7292z3 dot fsf at zenia dot home>
     [not found]     ` <41112BAE dot 9080304 at gnu dot org>
     [not found]       ` <vt2hdri4mi1 dot fsf at zenia dot home>
     [not found]         ` <41115B4F dot 1080700 at gnu dot org>
     [not found]           ` <vt2pt66zgul dot fsf at zenia dot home>
2004-08-04 18:26   ` Jim Blandy
2004-08-04 18:32     ` Andrew Cagney
2004-08-04 21:35       ` Jim Blandy
2004-08-04 21:55         ` Andrew Cagney
2004-08-04 22:22           ` Jim Blandy
2004-08-04 23:04             ` Daniel Jacobowitz
2004-08-04 23:17               ` Jim Blandy
2004-08-05  9:54                 ` Mark Kettenis
2004-08-05 14:31                   ` Jim Blandy
2004-08-05 16:27                     ` Joel Brobecker
2004-08-05 18:45                       ` Jim Blandy
2004-08-05 18:47                         ` Daniel Jacobowitz
2004-08-05 19:56                           ` Andrew Cagney
2004-08-05 20:36                             ` Daniel Jacobowitz
2004-08-05 20:50                               ` Andrew Cagney
2004-08-06  9:39                     ` Eli Zaretskii
2004-08-10 19:55                       ` Jim Blandy
2004-08-11 20:31                         ` Jim Blandy
2004-08-11 20:33                           ` Daniel Jacobowitz

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4111145F.7000504@gnu.org \
    --to=cagney@gnu.org \
    --cc=gdb@sources.redhat.com \
    --cc=jimb@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox