--- Begin Message ---
- From: Andrew Cagney <cagney at gnu dot org>
- To: Elena Zannoni <ezannoni at redhat dot com>
- Cc: gdb-patches at gnu dot org
- Date: Tue, 05 Apr 2005 21:07:41 -0400
- Subject: Re: RFA: DW_OP_piece read path
- Delivery-date: Tue, 05 Apr 2005 21:13:11 -0400
- Envelope-to: cagney@gnu.org
- References: <425309E1.2020503@gnu.org>
Andrew Cagney wrote:
Elena,
This gets the read side of DW_OP_piece working, the write side is a lot
more work (in trying to code that side out I noticed that this tweak
would fix the immediate problem).
Tested on ppc, the printing of long-long in register values (as found in
store.exp) now passes.
I think with this in place we can (now that I've got some time again,
and my m/c stopped dieing) push out a quick 6.4.
ok?
Andrew
Doh!
2005-04-05 Andrew Cagney <cagney@gnu.org>
* dwarf2loc.c (dwarf2_evaluate_loc_desc): Handle DW_OP_piece
reads.
Index: dwarf2loc.c
===================================================================
RCS file: /cvs/src/src/gdb/dwarf2loc.c,v
retrieving revision 1.26
diff -p -u -r1.26 dwarf2loc.c
--- dwarf2loc.c 31 Mar 2005 19:58:24 -0000 1.26
+++ dwarf2loc.c 5 Apr 2005 21:56:51 -0000
@@ -305,11 +305,27 @@ dwarf2_evaluate_loc_desc (struct symbol
dwarf_expr_eval (ctx, data, size);
if (ctx->num_pieces > 0)
{
- /* We haven't implemented splicing together pieces from
- arbitrary sources yet. */
- error (_("The value of variable '%s' is distributed across several\n"
- "locations, and GDB cannot access its value.\n"),
- SYMBOL_NATURAL_NAME (var));
+ int i;
+ long offset = 0;
+ bfd_byte *contents;
+ retval = allocate_value (SYMBOL_TYPE (var));
+ contents = value_contents_raw (retval);
+ for (i = 0; i < ctx->num_pieces; i++)
+ {
+ struct dwarf_expr_piece *p = &ctx->pieces[i];
+ if (p->in_reg)
+ {
+ bfd_byte regval[MAX_REGISTER_SIZE];
+ int gdb_regnum = DWARF2_REG_TO_REGNUM (p->value);
+ get_frame_register (frame, gdb_regnum, regval);
+ memcpy (contents + offset, regval, p->size);
+ }
+ else /* In memory? */
+ {
+ read_memory (p->value, contents + offset, p->size);
+ }
+ offset += p->size;
+ }
}
else if (ctx->in_reg)
{
--- End Message ---