summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Wielaard <[email protected]>2017-11-02 16:23:24 +0100
committerMark Wielaard <[email protected]>2017-11-10 16:36:01 +0100
commite23c71330c3b332d19fdf9e48ca8b03680d9ad34 (patch)
tree5399c5566a1921ed9873b5d0e1eb0605b4ce5281
parentcc1d7e7612e9bd43a299fd1e2237f837f84e6f04 (diff)
readelf: Handle DW_OP_GNU_variable_value.
Also format both DW_OP_call_ref and DW_OP_GNU_variable_value argument as a normal DIE reference. Signed-off-by: Mark Wielaard <[email protected]>
-rw-r--r--libdw/ChangeLog4
-rw-r--r--libdw/dwarf.h1
-rw-r--r--src/ChangeLog5
-rw-r--r--src/readelf.c5
4 files changed, 13 insertions, 2 deletions
diff --git a/libdw/ChangeLog b/libdw/ChangeLog
index e6e7f3be..70856498 100644
--- a/libdw/ChangeLog
+++ b/libdw/ChangeLog
@@ -1,3 +1,7 @@
+2017-11-03 Mark Wielaard <[email protected]>
+
+ * dwarf.h: Add DW_OP_GNU_variable_value.
+
2017-10-03 Mark Wielaard <[email protected]>
* libdw.h: Define LIBDW_CIE_ID and use it in dwarf_cfi_cie_p.
diff --git a/libdw/dwarf.h b/libdw/dwarf.h
index 902d2617..8edf719a 100644
--- a/libdw/dwarf.h
+++ b/libdw/dwarf.h
@@ -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. */
diff --git a/src/ChangeLog b/src/ChangeLog
index 0d3bfc19..3b886a7b 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,8 @@
+2017-11-03 Mark Wielaard <[email protected]>
+
+ * readelf.c (print_ops): Handle DW_OP_GNU_variable_value. Print
+ referenced DIE as offset.
+
2017-09-10 Mark Wielaard <[email protected]>
* ar.c (do_oper_delete): Remove DEBUG conditional check.
diff --git a/src/readelf.c b/src/readelf.c
index 5e2f3fc2..833884b5 100644
--- a/src/readelf.c
+++ b/src/readelf.c
@@ -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;