This is the mail archive of the binutils@sourceware.org mailing list for the binutils 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]

[PATCH] readelf/objdump DW_OP_GNU_{{const,regval,deref}_type,convert,reinterpret} support


Hi!

This patch adds support for typed DWARF stack ops that I've committed
recently to GCC trunk.
Tested on the http://gcc.gnu.org/ml/gcc-patches/2011-03/txt00136.txt
testcase built by current trunk GCC, committed to binutils HEAD.

2011-05-03  Jakub Jelinek  <jakub@redhat.com>

	* dwarf.c (decode_location_expression): Handle DW_OP_GNU_const_type,
	DW_OP_GNU_regval_type, DW_OP_GNU_deref_type, DW_OP_GNU_convert
	and DW_OP_GNU_reinterpret.

--- binutils/dwarf.c.jj	2011-04-05 11:04:23.000000000 +0200
+++ binutils/dwarf.c	2011-04-05 11:52:27.000000000 +0200
@@ -1034,17 +1034,6 @@ decode_location_expression (unsigned cha
 	  display_block (data, uvalue);
 	  data += uvalue;
 	  break;
-	case DW_OP_GNU_entry_value:
-	  uvalue = read_leb128 (data, &bytes_read, 0);
-	  data += bytes_read;
-	  printf ("DW_OP_GNU_entry_value: (");
-	  if (decode_location_expression (data, pointer_size, offset_size,
-					  dwarf_version, uvalue,
-					  cu_offset, section))
-	    need_frame_base = 1;
-	  putchar (')');
-	  data += uvalue;
-	  break;
 
 	  /* GNU extensions.  */
 	case DW_OP_GNU_push_tls_address:
@@ -1093,6 +1082,53 @@ decode_location_expression (unsigned cha
 	      data += offset_size + bytes_read;
 	    }
 	  break;
+	case DW_OP_GNU_entry_value:
+	  uvalue = read_leb128 (data, &bytes_read, 0);
+	  data += bytes_read;
+	  printf ("DW_OP_GNU_entry_value: (");
+	  if (decode_location_expression (data, pointer_size, offset_size,
+					  dwarf_version, uvalue,
+					  cu_offset, section))
+	    need_frame_base = 1;
+	  putchar (')');
+	  data += uvalue;
+	  break;
+	case DW_OP_GNU_const_type:
+	  uvalue = read_leb128 (data, &bytes_read, 0);
+	  data += bytes_read;
+	  printf ("DW_OP_GNU_const_type: <0x%s> ",
+		  dwarf_vmatoa ("x", cu_offset + uvalue));
+	  uvalue = byte_get (data++, 1);
+	  display_block (data, uvalue);
+	  data += uvalue;
+	  break;
+	case DW_OP_GNU_regval_type:
+	  uvalue = read_leb128 (data, &bytes_read, 0);
+	  data += bytes_read;
+	  printf ("DW_OP_GNU_regval_type: %s (%s)",
+		  dwarf_vmatoa ("u", uvalue), regname (uvalue, 1));
+	  uvalue = read_leb128 (data, &bytes_read, 0);
+	  data += bytes_read;
+	  printf (" <0x%s>", dwarf_vmatoa ("x", cu_offset + uvalue));
+	  break;
+	case DW_OP_GNU_deref_type:
+	  printf ("DW_OP_GNU_deref_type: %ld", (long) byte_get (data++, 1));
+	  uvalue = read_leb128 (data, &bytes_read, 0);
+	  data += bytes_read;
+	  printf (" <0x%s>", dwarf_vmatoa ("x", cu_offset + uvalue));
+	  break;
+	case DW_OP_GNU_convert:
+	  uvalue = read_leb128 (data, &bytes_read, 0);
+	  data += bytes_read;
+	  printf ("DW_OP_GNU_convert <0x%s>",
+		  dwarf_vmatoa ("x", cu_offset + uvalue));
+	  break;
+	case DW_OP_GNU_reinterpret:
+	  uvalue = read_leb128 (data, &bytes_read, 0);
+	  data += bytes_read;
+	  printf ("DW_OP_GNU_reinterpret <0x%s>",
+		  dwarf_vmatoa ("x", cu_offset + uvalue));
+	  break;
 
 	  /* HP extensions.  */
 	case DW_OP_HP_is_value:

	Jakub


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