From f384a1f025084a4a6370d7ada6dc7198ad3454e4 Mon Sep 17 00:00:00 2001 From: Kevin Buettner Date: Mon, 30 Jul 2018 15:35:45 -0700 Subject: [PATCH] Add support for DW_OP_GNU_variable_value to readelf As indicated by the subject, this patch adds support for the DWARF expression opcode DW_OP_GNU_variable_value to readelf. It's pretty much a copy/paste of DW_OP_call_ref with the obvious name changes for the printf statements. The FIXME comment comes from that copy/paste. binutils/ChangeLog: * dwarf.c (decode_location_expresion): Add case for DW_OP_GNU_variable_value. --- binutils/ChangeLog | 5 +++++ binutils/dwarf.c | 19 +++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/binutils/ChangeLog b/binutils/ChangeLog index 9fce7b67213..6ed758b9b77 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,8 @@ +2018-08-08 Kevin Buettner + + * dwarf.c (decode_location_expresion): Add case for + DW_OP_GNU_variable_value. + 2018-08-06 Claudiu Zissulescu * readelf.c (display_arc_attribute): Print Tag_ARC_ATR_version. diff --git a/binutils/dwarf.c b/binutils/dwarf.c index 81060bfa462..ad961b8c9d0 100644 --- a/binutils/dwarf.c +++ b/binutils/dwarf.c @@ -1575,6 +1575,25 @@ decode_location_expression (unsigned char * data, data += bytes_read; printf ("DW_OP_GNU_const_index <0x%s>", dwarf_vmatoa ("x", uvalue)); break; + case DW_OP_GNU_variable_value: + /* FIXME: Strictly speaking for 64-bit DWARF3 files + this ought to be an 8-byte wide computation. */ + if (dwarf_version == -1) + { + printf (_("(DW_OP_GNU_variable_value in frame info)")); + /* No way to tell where the next op is, so just bail. */ + return need_frame_base; + } + if (dwarf_version == 2) + { + SAFE_BYTE_GET_AND_INC (uvalue, data, pointer_size, end); + } + else + { + SAFE_BYTE_GET_AND_INC (uvalue, data, offset_size, end); + } + printf ("DW_OP_GNU_variable_value: <0x%s>", dwarf_vmatoa ("x", uvalue)); + break; /* HP extensions. */ case DW_OP_HP_is_value: -- 2.30.2