Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
* [RFA/RFC] Support DW_OP_breg for tracepoints
@ 2005-11-13 18:10 Randolph Chung
  2005-11-13 18:11 ` Daniel Jacobowitz
  2005-11-14  2:27 ` Jim Blandy
  0 siblings, 2 replies; 7+ messages in thread
From: Randolph Chung @ 2005-11-13 18:10 UTC (permalink / raw)
  To: gdb-patches

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

Warning: I don't really understand how this works :-)

On hppa-linux, when running gdb.trace/save-trace.exp, the test fails 
because of:

"Unsupported DWARF opcode in the location of q1"

The opcode in question is "DW_OP_breg3". The attached patch attempts to 
add support for DW_OP_breg0..DW_OP_breg31. With this patch hppa-linux 
passes the testcase, although not really understanding DWARF-2 I am not 
certain this is 100% correct. DWARF experts, comments appreciated.

I was going to write the code for DW_OP_bregx too, but I'm not sure how 
that is supposed to work in terms of the "size" argument to that 
function since there are two params to read off the stack. In any case 
since I can't test that case easily I haven't written any code for it.

Comments? ok to check in?

randolph

[-- Attachment #2: d.diff --]
[-- Type: text/x-patch, Size: 1501 bytes --]

2005-11-13  Randolph Chung  <tausq@debian.org>

	* dwarf2loc.c (dwarf2_tracepoint_var_ref): Handle DW_OP_breg0
	through DW_OP_breg31.  Print DWARF opcode for unsupported
	case.

Index: dwarf2loc.c
===================================================================
RCS file: /cvs/src/src/gdb/dwarf2loc.c,v
retrieving revision 1.30
diff -u -p -r1.30 dwarf2loc.c
--- dwarf2loc.c	4 Nov 2005 02:42:34 -0000	1.30
+++ dwarf2loc.c	13 Nov 2005 15:29:18 -0000
@@ -479,9 +479,30 @@ dwarf2_tracepoint_var_ref (struct symbol
       ax_simple (ax, aop_add);
       value->kind = axs_lvalue_memory;
     }
+  else if (data[0] >= DW_OP_breg0
+	   && data[0] <= DW_OP_breg31)
+    {
+      unsigned int reg;
+      LONGEST offset;
+      gdb_byte *buf_end;
+
+      reg = data[0] - DW_OP_breg0;
+      buf_end = read_sleb128 (data + 1, data + size, &offset);
+      if (buf_end != data + size)
+	error (_("Unexpected opcode after DW_OP_breg%u for symbol \"%s\"."),
+	       reg, SYMBOL_PRINT_NAME (symbol));
+
+      ax_reg (ax, reg);
+      ax_const_l (ax, offset);
+      ax_simple (ax, aop_add);
+
+      ax_const_l (ax, offset);
+      ax_simple (ax, aop_add);
+      value->kind = axs_lvalue_memory;
+    }
   else
-    error (_("Unsupported DWARF opcode in the location of \"%s\"."),
-	   SYMBOL_PRINT_NAME (symbol));
+    error (_("Unsupported DWARF opcode 0x%x in the location of \"%s\"."),
+	   data[0], SYMBOL_PRINT_NAME (symbol));
 }
 \f
 /* Return the value of SYMBOL in FRAME using the DWARF-2 expression

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

end of thread, other threads:[~2005-11-19 13:45 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2005-11-13 18:10 [RFA/RFC] Support DW_OP_breg for tracepoints Randolph Chung
2005-11-13 18:11 ` Daniel Jacobowitz
2005-11-14  2:27 ` Jim Blandy
2005-11-14  3:41   ` Randolph Chung
2005-11-14  3:56     ` Daniel Jacobowitz
2005-11-14 15:57       ` Jim Blandy
2005-11-19 19:41       ` Randolph Chung

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