From 23572ecadc89af384c1804ad7692f32c55fbfc80 Mon Sep 17 00:00:00 2001 From: Elena Zannoni Date: Fri, 4 Nov 2005 02:42:34 +0000 Subject: [PATCH] 2005-11-03 Andrew Cagney Checked in by Elena Zannoni * dwarf2loc.c (dwarf2_evaluate_loc_desc): Handle DW_OP_piece reads. --- gdb/ChangeLog | 7 +++++++ gdb/dwarf2loc.c | 27 ++++++++++++++++++++++----- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index e31c2723ce0..30d0abe55f6 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2005-11-03 Andrew Cagney + + Checked in by Elena Zannoni + + * dwarf2loc.c (dwarf2_evaluate_loc_desc): Handle DW_OP_piece + reads. + 2006-11-03 Daniel Jacobowitz * linux-nat.c (linux_nat_resume): Add more debugging messages. Do diff --git a/gdb/dwarf2loc.c b/gdb/dwarf2loc.c index 6c334485bb7..fea2c99a9d5 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) { -- 2.30.2