]> git.ipfire.org Git - thirdparty/elfutils.git/commitdiff
readelf: Handle DW_OP_GNU_variable_value.
authorMark Wielaard <mark@klomp.org>
Thu, 2 Nov 2017 15:23:24 +0000 (16:23 +0100)
committerMark Wielaard <mark@klomp.org>
Fri, 10 Nov 2017 15:36:01 +0000 (16:36 +0100)
Also format both DW_OP_call_ref and DW_OP_GNU_variable_value argument
as a normal DIE reference.

Signed-off-by: Mark Wielaard <mark@klomp.org>
libdw/ChangeLog
libdw/dwarf.h
src/ChangeLog
src/readelf.c

index e6e7f3bef6c747e7ac3697c7531cd260a64de8d7..70856498a46adce5613e08aad735fd553ffe317a 100644 (file)
@@ -1,3 +1,7 @@
+2017-11-03  Mark Wielaard  <mark@klomp.org>
+
+       * dwarf.h: Add DW_OP_GNU_variable_value.
+
 2017-10-03  Mark Wielaard  <mark@klomp.org>
 
        * libdw.h: Define LIBDW_CIE_ID and use it in dwarf_cfi_cie_p.
index 902d26176255bf5c1f7ac1c9f4e6a2531960bd92..8edf719afccce9cbbb8e4f5b2abd49d9c19c3b9c 100644 (file)
@@ -545,6 +545,7 @@ enum
     DW_OP_GNU_convert = 0xf7,
     DW_OP_GNU_reinterpret = 0xf9,
     DW_OP_GNU_parameter_ref = 0xfa,
+    DW_OP_GNU_variable_value = 0xfd,
 
     DW_OP_lo_user = 0xe0,      /* Implementation-defined range start.  */
     DW_OP_hi_user = 0xff       /* Implementation-defined range end.  */
index 0d3bfc1921739a38222d6902730fbcdf25c0379e..3b886a7bb34f67b2888f5caf5db39a5d8e5def16 100644 (file)
@@ -1,3 +1,8 @@
+2017-11-03  Mark Wielaard  <mark@klomp.org>
+
+       * readelf.c (print_ops): Handle DW_OP_GNU_variable_value. Print
+       referenced DIE as offset.
+
 2017-09-10  Mark Wielaard  <mark@klomp.org>
 
        * ar.c (do_oper_delete): Remove DEBUG conditional check.
index 5e2f3fc283f80a91876a6351735921edc19db3ab..833884b532ab03bacd605bae59fadf1efb014ab8 100644 (file)
@@ -4160,6 +4160,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest,
          break;
 
        case DW_OP_call_ref:
+       case DW_OP_GNU_variable_value:
          /* Offset operand.  */
          if (ref_size != 4 && ref_size != 8)
            goto invalid; /* Cannot be used in CFA.  */
@@ -4170,8 +4171,8 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest,
            addr = read_8ubyte_unaligned (dbg, data);
          data += ref_size;
          CONSUME (ref_size);
-
-         printf ("%*s[%4" PRIuMAX "] %s %#" PRIxMAX "\n",
+         /* addr is a DIE offset, so format it as one.  */
+         printf ("%*s[%4" PRIuMAX "] %s [%6" PRIxMAX "]\n",
                  indent, "", (uintmax_t) offset,
                  op_name, (uintmax_t) addr);
          offset += 1 + ref_size;