[prev in list] [next in list] [prev in thread] [next in thread] 

List:       gdb-cvs
Subject:    [binutils-gdb] Support DW_FORM_strx1, _strx2, _strx3, _strx4 forms.
From:       Ali Tamur <alitamur () sourceware ! org>
Date:       2019-04-30 23:22:14
Message-ID: 20190430232214.65751.qmail () sourceware ! org
[Download RAW message or body]

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

commit 15f18d1467aa08ff7a4793f21e02fd4c2ebc0a0b
Author: Ali Tamur <tamur@google.com>
Date:   Thu Apr 25 13:35:53 2019 -0700

    Support DW_FORM_strx1, _strx2, _strx3, _strx4 forms.
    
    Dwarf5 defines DW_FORM_strx1 and others, which are similar
    to DW_FORM_strx but uses 1-4 bytes unsigned integers. This is
    a small step towards supporting dwarf5 in gdb.

Diff:
---
 gdb/ChangeLog               |  5 +++++
 gdb/dwarf2read.c            | 50 +++++++++++++++++++++++++++++++++++++++++----
 gdb/testsuite/ChangeLog     |  4 ++++
 gdb/testsuite/lib/dwarf.exp |  4 ++++
 4 files changed, 59 insertions(+), 4 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 126343c..fdbcb67 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,8 @@
+2019-04-30  Ali Tamur  <tamur@google.com>
+	* gdb/dwarf2read.c (read_3_bytes): New declaration.
+	(read_attribute_value): Added DW_FORM_strx1-4 cases.
+	(read_3_bytes): New function.
+
 2019-04-30  Joel Brobecker  <brobecker@adacore.com>
 
 	* windows-nat.c (main_thread_id): Delete.
diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
index 751c59c3..b0bdecf 100644
--- a/gdb/dwarf2read.c
+++ b/gdb/dwarf2read.c
@@ -1531,6 +1531,9 @@ static int read_1_signed_byte (bfd *, const gdb_byte *);
 
 static unsigned int read_2_bytes (bfd *, const gdb_byte *);
 
+/* Read the next three bytes (little-endian order) as an unsigned integer.  */
+static unsigned int read_3_bytes (bfd *, const gdb_byte *);
+
 static unsigned int read_4_bytes (bfd *, const gdb_byte *);
 
 static ULONGEST read_8_bytes (bfd *, const gdb_byte *);
@@ -19330,6 +19333,10 @@ read_attribute_value (const struct die_reader_specs *reader,
       info_ptr += bytes_read;
       break;
     case DW_FORM_strx:
+    case DW_FORM_strx1:
+    case DW_FORM_strx2:
+    case DW_FORM_strx3:
+    case DW_FORM_strx4:
     case DW_FORM_GNU_str_index:
       if (reader->dwo_file == NULL)
 	{
@@ -19340,12 +19347,34 @@ read_attribute_value (const struct die_reader_specs *reader,
 		 bfd_get_filename (abfd));
 	}
       {
-	ULONGEST str_index =
-	  read_unsigned_leb128 (abfd, info_ptr, &bytes_read);
-
+	ULONGEST str_index;
+	if (form == DW_FORM_strx1)
+	  {
+	    str_index = read_1_byte (abfd, info_ptr);
+	    info_ptr += 1;
+	  }
+	else if (form == DW_FORM_strx2)
+	  {
+	    str_index = read_2_bytes (abfd, info_ptr);
+	    info_ptr += 2;
+	  }
+	else if (form == DW_FORM_strx3)
+	  {
+	    str_index = read_3_bytes (abfd, info_ptr);
+	    info_ptr += 3;
+	  }
+	else if (form == DW_FORM_strx4)
+	  {
+	    str_index = read_4_bytes (abfd, info_ptr);
+	    info_ptr += 4;
+	  }
+	else
+	  {
+	    str_index = read_unsigned_leb128 (abfd, info_ptr, &bytes_read);
+	    info_ptr += bytes_read;
+	  }
 	DW_STRING (attr) = read_str_index (reader, str_index);
 	DW_STRING_IS_CANONICAL (attr) = 0;
-	info_ptr += bytes_read;
       }
       break;
     default:
@@ -19416,6 +19445,19 @@ read_2_signed_bytes (bfd *abfd, const gdb_byte *buf)
 }
 
 static unsigned int
+read_3_bytes (bfd *abfd, const gdb_byte *buf)
+{
+  unsigned int result = 0;
+  for (int i = 0; i < 3; ++i)
+    {
+      unsigned char byte = bfd_get_8 (abfd, buf);
+      buf++;
+      result |= ((unsigned int) byte << (i * 8));
+    }
+  return result;
+}
+
+static unsigned int
 read_4_bytes (bfd *abfd, const gdb_byte *buf)
 {
   return bfd_get_32 (abfd, buf);
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 8d2601b..fa1f567 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2019-04-30  Ali Tamur  <tamur@google.com>
+
+	* lib/dwarf.exp(): Added DW_FORM_strx1-4.
+
 2019-04-30  Tom Tromey  <tromey@adacore.com>
 
 	* lib/ada.exp (find_ada_tool): New proc.
diff --git a/gdb/testsuite/lib/dwarf.exp b/gdb/testsuite/lib/dwarf.exp
index 3a430fc..3cc5928 100644
--- a/gdb/testsuite/lib/dwarf.exp
+++ b/gdb/testsuite/lib/dwarf.exp
@@ -528,6 +528,10 @@ namespace eval Dwarf {
 	    DW_FORM_exprloc -
 
 	    DW_FORM_strx -
+	    DW_FORM_strx1 -
+	    DW_FORM_strx2 -
+	    DW_FORM_strx3 -
+	    DW_FORM_strx4 -
 
 	    DW_FORM_GNU_addr_index -
 	    DW_FORM_GNU_str_index -
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic