2005-04-05 Andrew Cagney * 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) {