From f384a1f025084a4a6370d7ada6dc7198ad3454e4 Mon Sep 17 00:00:00 2001 From: Kevin Buettner Date: Mon, 30 Jul 2018 15:35:45 -0700 Subject: 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/dwarf.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'binutils/dwarf.c') diff --git a/binutils/dwarf.c b/binutils/dwarf.c index 81060bf..ad961b8 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: -- cgit v1.1