[binutils-gdb] Fix the dislay of .debug_macro.dwo sections.

Nick Clifton nickc@sourceware.org
Fri Mar 5 12:57:04 GMT 2021


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

commit d296b73620d0ea069b8a30c0bb77f52e32618c6a
Author: Nick Clifton <nickc@redhat.com>
Date:   Fri Mar 5 12:56:24 2021 +0000

    Fix the dislay of .debug_macro.dwo sections.
    
            PR 27387
            * dwarf.c (display_debug_macro): Handle the displaying of
            DW_MACRO_define_strp and DW_MACRO_undef_strp in v4
            .debug_macro.dwo sections.

Diff:
---
 binutils/ChangeLog |  7 +++++++
 binutils/dwarf.c   | 32 +++++++++++++++++++++-----------
 2 files changed, 28 insertions(+), 11 deletions(-)

diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index 758dfdb8e70..da24027199e 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -1,3 +1,10 @@
+2021-03-05  Nick Clifton  <nickc@redhat.com>
+
+	PR 27387
+	* dwarf.c (display_debug_macro): Handle the displaying of
+	DW_MACRO_define_strp and DW_MACRO_undef_strp in v4
+	.debug_macro.dwo sections.
+
 2021-03-04  Nick Clifton  <nickc@redhat.com>
 
 	PR 27478
diff --git a/binutils/dwarf.c b/binutils/dwarf.c
index 15f0bd09dc8..74f28f563ce 100644
--- a/binutils/dwarf.c
+++ b/binutils/dwarf.c
@@ -690,7 +690,7 @@ fetch_indirect_string (dwarf_vma offset)
 
   if (offset >= section->size)
     {
-      warn (_("DW_FORM_strp offset too big: %s\n"),
+      warn (_("DW_FORM_strp offset too big: 0x%s\n"),
 	    dwarf_vmatoa ("x", offset));
       return (const unsigned char *) _("<offset is too big>");
     }
@@ -718,7 +718,7 @@ fetch_indirect_line_string (dwarf_vma offset)
 
   if (offset >= section->size)
     {
-      warn (_("DW_FORM_line_strp offset too big: %s\n"),
+      warn (_("DW_FORM_line_strp offset too big: 0x%s\n"),
 	    dwarf_vmatoa ("x", offset));
       return (const unsigned char *) _("<offset is too big>");
     }
@@ -803,7 +803,7 @@ fetch_indexed_string (dwarf_vma idx, struct cu_tu_set *this_set,
 
   if (index_offset >= length)
     {
-      warn (_("DW_FORM_GNU_str_index offset too big: %s vs %s\n"),
+      warn (_("DW_FORM_GNU_str_index offset too big: 0x%s vs 0x%s\n"),
 	    dwarf_vmatoa ("x", index_offset),
 	    dwarf_vmatoa ("x", length));
       return _("<index offset is too big>");
@@ -813,7 +813,7 @@ fetch_indexed_string (dwarf_vma idx, struct cu_tu_set *this_set,
   str_offset -= str_section->address;
   if (str_offset >= str_section->size)
     {
-      warn (_("DW_FORM_GNU_str_index indirect offset too big: %s\n"),
+      warn (_("DW_FORM_GNU_str_index indirect offset too big: 0x%s\n"),
 	    dwarf_vmatoa ("x", str_offset));
       return _("<indirect index offset is too big>");
     }
@@ -839,7 +839,7 @@ fetch_indexed_value (dwarf_vma offset, dwarf_vma bytes)
 
   if (offset + bytes > section->size)
     {
-      warn (_("Offset into section %s too big: %s\n"),
+      warn (_("Offset into section %s too big: 0x%s\n"),
 	    section->name, dwarf_vmatoa ("x", offset));
       return "<offset too big>";
     }
@@ -6045,17 +6045,22 @@ display_debug_macro (struct dwarf_section *section,
   unsigned char *end = start + section->size;
   unsigned char *curr = start;
   unsigned char *extended_op_buf[256];
+  bfd_boolean is_dwo = FALSE;
+  const char *suffix = strrchr (section->name, '.');
+
+  if (suffix && strcmp (suffix, ".dwo") == 0)
+    is_dwo = TRUE;
 
   load_debug_section_with_follow (str, file);
   load_debug_section_with_follow (line, file);
   load_debug_section_with_follow (str_index, file);
-
+  
   introduce (section, FALSE);
 
   while (curr < end)
     {
       unsigned int lineno, version, flags;
-      unsigned int offset_size = 4;
+      unsigned int offset_size;
       const unsigned char *string;
       dwarf_vma line_offset = 0, sec_offset = curr - start, offset;
       unsigned char **extended_ops = NULL;
@@ -6069,8 +6074,7 @@ display_debug_macro (struct dwarf_section *section,
 	}
 
       SAFE_BYTE_GET_AND_INC (flags, curr, 1, end);
-      if (flags & 1)
-	offset_size = 8;
+      offset_size = (flags & 1) ? 8 : 4;
       printf (_("  Offset:                      0x%lx\n"),
 	      (unsigned long) sec_offset);
       printf (_("  Version:                     %d\n"), version);
@@ -6202,7 +6206,10 @@ display_debug_macro (struct dwarf_section *section,
 
 	    case DW_MACRO_define_strp:
 	      READ_ULEB (lineno, curr, end);
-	      SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end);
+	      if (version == 4 && is_dwo)
+		READ_ULEB (offset, curr, end);
+	      else
+		SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end);
 	      string = fetch_indirect_string (offset);
 	      printf (_(" DW_MACRO_define_strp - lineno : %d macro : %s\n"),
 		      lineno, string);
@@ -6210,7 +6217,10 @@ display_debug_macro (struct dwarf_section *section,
 
 	    case DW_MACRO_undef_strp:
 	      READ_ULEB (lineno, curr, end);
-	      SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end);
+	      if (version == 4 && is_dwo)
+		READ_ULEB (offset, curr, end);
+	      else
+		SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end);
 	      string = fetch_indirect_string (offset);
 	      printf (_(" DW_MACRO_undef_strp - lineno : %d macro : %s\n"),
 		      lineno, string);


More information about the Binutils-cvs mailing list