This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[RFA/RFC] Support DW_OP_breg for tracepoints


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
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));
 }
 
 /* Return the value of SYMBOL in FRAME using the DWARF-2 expression

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]