aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorElena Zannoni <ezannoni@kwikemart.cygnus.com>2005-11-04 02:42:34 +0000
committerElena Zannoni <ezannoni@kwikemart.cygnus.com>2005-11-04 02:42:34 +0000
commit23572ecadc89af384c1804ad7692f32c55fbfc80 (patch)
treefe5d2647a9025f11c301083a10232d12d0d97e60
parent9b1771bc2b283d4556e32685a18f9ec78bb5eb55 (diff)
downloadgdb-23572ecadc89af384c1804ad7692f32c55fbfc80.zip
gdb-23572ecadc89af384c1804ad7692f32c55fbfc80.tar.gz
gdb-23572ecadc89af384c1804ad7692f32c55fbfc80.tar.bz2
2005-11-03 Andrew Cagney <cagney@gnu.org>
Checked in by Elena Zannoni <ezannoni@redhat.com> * dwarf2loc.c (dwarf2_evaluate_loc_desc): Handle DW_OP_piece reads.
-rw-r--r--gdb/ChangeLog7
-rw-r--r--gdb/dwarf2loc.c27
2 files changed, 29 insertions, 5 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index e31c272..30d0abe 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,10 @@
+2005-11-03 Andrew Cagney <cagney@gnu.org>
+
+ Checked in by Elena Zannoni <ezannoni@redhat.com>
+
+ * dwarf2loc.c (dwarf2_evaluate_loc_desc): Handle DW_OP_piece
+ reads.
+
2006-11-03 Daniel Jacobowitz <dan@codesourcery.com>
* linux-nat.c (linux_nat_resume): Add more debugging messages. Do
diff --git a/gdb/dwarf2loc.c b/gdb/dwarf2loc.c
index 6c33448..fea2c99 100644
--- a/gdb/dwarf2loc.c
+++ b/gdb/dwarf2loc.c
@@ -302,11 +302,28 @@ dwarf2_evaluate_loc_desc (struct symbol *var, struct frame_info *frame,
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)
{