This is the mail archive of the binutils-cvs@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] Add support for DW_OP_GNU_variable_value to readelf


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=f384a1f025084a4a6370d7ada6dc7198ad3454e4

commit f384a1f025084a4a6370d7ada6dc7198ad3454e4
Author: Kevin Buettner <kevinb@redhat.com>
Date:   Mon Jul 30 15:35:45 2018 -0700

    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.

Diff:
---
 binutils/ChangeLog |  5 +++++
 binutils/dwarf.c   | 19 +++++++++++++++++++
 2 files changed, 24 insertions(+)

diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index 9fce7b6..6ed758b 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -1,3 +1,8 @@
+2018-08-08  Kevin Buettner  <kevinb@redhat.com>
+
+    	* dwarf.c (decode_location_expresion): Add case for
+    	DW_OP_GNU_variable_value.
+
 2018-08-06  Claudiu Zissulescu  <claziss@synopsys.com>
 
 	* readelf.c (display_arc_attribute): Print Tag_ARC_ATR_version.
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:


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]