+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
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)
{