Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
* [Fwd: Re: RFA: DW_OP_piece read path]
@ 2005-04-14 18:22 Andrew Cagney
  2005-04-14 18:46 ` Mark Kettenis
  0 siblings, 1 reply; 2+ messages in thread
From: Andrew Cagney @ 2005-04-14 18:22 UTC (permalink / raw)
  To: gdb-patches

[-- Attachment #1: Type: text/plain, Size: 59 bytes --]

It appears I sent this to the wrong address, sigh.

Andrew

[-- Attachment #2: Re: RFA: DW_OP_piece read path --]
[-- Type: message/rfc822, Size: 4625 bytes --]

[-- Attachment #2.1.1: Type: text/plain, Size: 472 bytes --]

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!


[-- Attachment #2.1.2: diffs --]
[-- Type: text/plain, Size: 1486 bytes --]

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

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [Fwd: Re: RFA: DW_OP_piece read path]
  2005-04-14 18:22 [Fwd: Re: RFA: DW_OP_piece read path] Andrew Cagney
@ 2005-04-14 18:46 ` Mark Kettenis
  0 siblings, 0 replies; 2+ messages in thread
From: Mark Kettenis @ 2005-04-14 18:46 UTC (permalink / raw)
  To: cagney; +Cc: gdb-patches

   Date: Thu, 14 Apr 2005 14:18:57 -0400
   From: Andrew Cagney <cagney@gnu.org>

   It appears I sent this to the wrong address, sigh.

Ah, well, it's good to hear from you again.  An sorry that I start
nagging again, but can you please, please, please, add an empty line
after the declaration of local variables in a block if said block is
longer than say three or four lines?  The following bit lifted from
your patch provides no visual guidance at all about what's going on.
This makes working on that code for me, and most likely others, very
hard, even if I don't suffer from sleep deprivation.

+      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;
+	}

Otherwise, thanks!  It's good to have this functionality!

Mark


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2005-04-14 18:46 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2005-04-14 18:22 [Fwd: Re: RFA: DW_OP_piece read path] Andrew Cagney
2005-04-14 18:46 ` Mark Kettenis

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox