This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
[PATCH] readelf/objdump DW_OP_GNU_{{const,regval,deref}_type,convert,reinterpret} support
- From: Jakub Jelinek <jakub at redhat dot com>
- To: binutils at sources dot redhat dot com
- Date: Tue, 3 May 2011 10:46:44 +0200
- Subject: [PATCH] readelf/objdump DW_OP_GNU_{{const,regval,deref}_type,convert,reinterpret} support
- Reply-to: Jakub Jelinek <jakub at redhat dot com>
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