[binutils/f16] Import Jakub Jelinek's patch to add support for displaying the contents of .debug_macro sections

Jakub Jelinek jakub at fedoraproject.org
Wed Jul 27 10:26:42 UTC 2011


commit 74ba71896b42486142aa198f628cb7976529e6b8
Author: Jakub Jelinek <jakub at redhat.com>
Date:   Wed Jul 27 12:26:31 2011 +0200

        Import Jakub Jelinek's patch to add support for displaying the contents of .debug_macro sections.

 binutils-2.21.53.0.1-debug_macro.patch |  450 ++++++++++++++++++++++++++++++++
 binutils.spec                          |    7 +-
 2 files changed, 456 insertions(+), 1 deletions(-)
---
diff --git a/binutils-2.21.53.0.1-debug_macro.patch b/binutils-2.21.53.0.1-debug_macro.patch
new file mode 100644
index 0000000..09966bb
--- /dev/null
+++ b/binutils-2.21.53.0.1-debug_macro.patch
@@ -0,0 +1,450 @@
+diff -cpr ../binutils-2.21.53.0.1.orig/bfd/dwarf2.c ./bfd/dwarf2.c
+*** ../binutils-2.21.53.0.1.orig/bfd/dwarf2.c	2011-07-27 09:57:26.018568001 +0100
+--- ./bfd/dwarf2.c	2011-07-27 10:00:21.176567999 +0100
+*************** const struct dwarf_debug_section dwarf_d
+*** 287,292 ****
+--- 287,293 ----
+    { ".debug_line",		".zdebug_line" },
+    { ".debug_loc",		".zdebug_loc" },
+    { ".debug_macinfo",		".zdebug_macinfo" },
++   { ".debug_macro",		".zdebug_macro" },
+    { ".debug_pubnames",		".zdebug_pubnames" },
+    { ".debug_pubtypes",		".zdebug_pubtypes" },
+    { ".debug_ranges",		".zdebug_ranges" },
+*************** enum dwarf_debug_section_enum
+*** 314,319 ****
+--- 315,321 ----
+    debug_line,
+    debug_loc,
+    debug_macinfo,
++   debug_macro,
+    debug_pubnames,
+    debug_pubtypes,
+    debug_ranges,
+diff -cpr ../binutils-2.21.53.0.1.orig/binutils/dwarf.c ./binutils/dwarf.c
+*** ../binutils-2.21.53.0.1.orig/binutils/dwarf.c	2011-07-27 09:57:55.204568001 +0100
+--- ./binutils/dwarf.c	2011-07-27 10:00:17.247568001 +0100
+*************** read_and_display_attr_value (unsigned lo
+*** 1542,1548 ****
+  	}
+      }
+  
+!   if (do_loc)
+      return data;
+  
+    /* For some attributes we can display further information.  */
+--- 1542,1548 ----
+  	}
+      }
+  
+!   if (do_loc || attribute == 0)
+      return data;
+  
+    /* For some attributes we can display further information.  */
+*************** get_AT_name (unsigned long attribute)
+*** 1960,1965 ****
+--- 1960,1966 ----
+      case DW_AT_GNU_all_tail_call_sites:		return "DW_AT_GNU_all_tail_call_sites";
+      case DW_AT_GNU_all_call_sites:		return "DW_AT_GNU_all_call_sites";
+      case DW_AT_GNU_all_source_call_sites:	return "DW_AT_GNU_all_source_call_sites";
++     case DW_AT_GNU_macros:			return "DW_AT_GNU_macros";
+  
+        /* UPC extension.  */
+      case DW_AT_upc_threads_scaled:	return "DW_AT_upc_threads_scaled";
+*************** display_debug_macinfo (struct dwarf_sect
+*** 3450,3455 ****
+--- 3451,3771 ----
+    return 1;
+  }
+  
++ /* Given LINE_OFFSET into the .debug_line section, attempt to return
++    filename and dirname corresponding to file name table entry with index
++    FILEIDX.  Return NULL on failure.  */
++ 
++ static unsigned char *
++ get_line_filename_and_dirname (dwarf_vma line_offset, dwarf_vma fileidx,
++ 			       unsigned char **dir_name)
++ {
++   struct dwarf_section *section = &debug_displays [line].section;
++   unsigned char *hdrptr, *dirtable, *file_name;
++   unsigned int offset_size, initial_length_size;
++   unsigned int version, opcode_base, bytes_read;
++   dwarf_vma length, diridx;
++ 
++   *dir_name = NULL;
++   if (section->start == NULL
++       || line_offset >= section->size
++       || fileidx == 0)
++     return NULL;
++ 
++   hdrptr = section->start + line_offset;
++   length = byte_get (hdrptr, 4);
++   hdrptr += 4;
++   if (length == 0xffffffff)
++     {
++       /* This section is 64-bit DWARF 3.  */
++       length = byte_get (hdrptr, 8);
++       hdrptr += 8;
++       offset_size = 8;
++       initial_length_size = 12;
++     }
++   else
++     {
++       offset_size = 4;
++       initial_length_size = 4;
++     }
++   if (length + initial_length_size > section->size)
++     return NULL;
++   version = byte_get (hdrptr, 2);
++   hdrptr += 2;
++   if (version != 2 && version != 3 && version != 4)
++     return NULL;
++   hdrptr += offset_size + 1;/* Skip prologue_length and min_insn_length.  */
++   if (version >= 4)
++     hdrptr++;		    /* Skip max_ops_per_insn.  */
++   hdrptr += 3;		    /* Skip default_is_stmt, line_base, line_range.  */
++   opcode_base = byte_get (hdrptr, 1);
++   if (opcode_base == 0)
++     return NULL;
++   hdrptr++;
++   hdrptr += opcode_base - 1;
++   dirtable = hdrptr;
++   /* Skip over dirname table.  */
++   while (*hdrptr != '\0')
++     hdrptr += strlen ((char *) hdrptr) + 1;
++   hdrptr++;		    /* Skip the NUL at the end of the table.  */
++   /* Now skip over preceding filename table entries.  */
++   for (; *hdrptr != '\0' && fileidx > 1; fileidx--)
++     {
++       hdrptr += strlen ((char *) hdrptr) + 1;
++       read_leb128 (hdrptr, &bytes_read, 0);
++       hdrptr += bytes_read;
++       read_leb128 (hdrptr, &bytes_read, 0);
++       hdrptr += bytes_read;
++       read_leb128 (hdrptr, &bytes_read, 0);
++       hdrptr += bytes_read;
++     }
++   if (*hdrptr == '\0')
++     return NULL;
++   file_name = hdrptr;
++   hdrptr += strlen ((char *) hdrptr) + 1;
++   diridx = read_leb128 (hdrptr, &bytes_read, 0);
++   if (diridx == 0)
++     return file_name;
++   for (; *dirtable != '\0' && diridx > 1; diridx--)
++     dirtable += strlen ((char *) dirtable) + 1;
++   if (*dirtable == '\0')
++     return NULL;
++   *dir_name = dirtable;
++   return file_name;
++ }
++ 
++ static int
++ display_debug_macro (struct dwarf_section *section,
++ 		     void *file)
++ {
++   unsigned char *start = section->start;
++   unsigned char *end = start + section->size;
++   unsigned char *curr = start;
++   unsigned char *extended_op_buf[256];
++   unsigned int bytes_read;
++ 
++   load_debug_section (str, file);
++   load_debug_section (line, file);
++ 
++   printf (_("Contents of the %s section:\n\n"), section->name);
++ 
++   while (curr < end)
++     {
++       unsigned int lineno, version, flags;
++       unsigned int offset_size = 4;
++       const char *string;
++       dwarf_vma line_offset = 0, sec_offset = curr - start, offset;
++       unsigned char **extended_ops = NULL;
++ 
++       version = byte_get (curr, 2);
++       curr += 2;
++ 
++       if (version != 4)
++ 	{
++ 	  error (_("Only GNU extension to DWARF 4 of %s is currently supported.\n"),
++ 		 section->name);
++ 	  return 0;
++ 	}
++ 
++       flags = byte_get (curr++, 1);
++       if (flags & 1)
++ 	offset_size = 8;
++       printf (_("  Offset:                      0x%lx\n"),
++ 	      (unsigned long) sec_offset);
++       printf (_("  Version:                     %d\n"), version);
++       printf (_("  Offset size:                 %d\n"), offset_size);
++       if (flags & 2)
++ 	{
++ 	  line_offset = byte_get (curr, offset_size);
++ 	  curr += offset_size;
++ 	  printf (_("  Offset into .debug_line:     0x%lx\n"),
++ 		  (unsigned long) line_offset);
++ 	}
++       if (flags & 4)
++ 	{
++ 	  unsigned int i, count = byte_get (curr++, 1), op;
++ 	  dwarf_vma nargs, n;
++ 	  memset (extended_op_buf, 0, sizeof (extended_op_buf));
++ 	  extended_ops = extended_op_buf;
++ 	  if (count)
++ 	    {
++ 	      printf (_("  Extension opcode arguments:\n"));
++ 	      for (i = 0; i < count; i++)
++ 		{
++ 		  op = byte_get (curr++, 1);
++ 		  extended_ops[op] = curr;
++ 		  nargs = read_leb128 (curr, &bytes_read, 0);
++ 		  curr += bytes_read;
++ 		  if (nargs == 0)
++ 		    printf (_("    DW_MACRO_GNU_%02x has no arguments\n"), op);
++ 		  else
++ 		    {
++ 		      printf (_("    DW_MACRO_GNU_%02x arguments: "), op);
++ 		      for (n = 0; n < nargs; n++)
++ 			{
++ 			  unsigned int form = byte_get (curr++, 1);
++ 			  printf ("%s%s", get_FORM_name (form),
++ 				  n == nargs - 1 ? "\n" : ", ");
++ 			  switch (form)
++ 			    {
++ 			    case DW_FORM_data1:
++ 			    case DW_FORM_data2:
++ 			    case DW_FORM_data4:
++ 			    case DW_FORM_data8:
++ 			    case DW_FORM_sdata:
++ 			    case DW_FORM_udata:
++ 			    case DW_FORM_block:
++ 			    case DW_FORM_block1:
++ 			    case DW_FORM_block2:
++ 			    case DW_FORM_block4:
++ 			    case DW_FORM_flag:
++ 			    case DW_FORM_string:
++ 			    case DW_FORM_strp:
++ 			    case DW_FORM_sec_offset:
++ 			      break;
++ 			    default:
++ 			      error (_("Invalid extension opcode form %s\n"),
++ 				     get_FORM_name (form));
++ 			      return 0;
++ 			    }
++ 			}
++ 		    }
++ 		}
++ 	    }
++ 	}
++       printf ("\n");
++ 
++       while (1)
++ 	{
++ 	  unsigned int op;
++ 
++ 	  if (curr >= end)
++ 	    {
++ 	      error (_(".debug_macro section not zero terminated\n"));
++ 	      return 0;
++ 	    }
++ 
++ 	  op = byte_get (curr++, 1);
++ 	  if (op == 0)
++ 	    break;
++ 
++ 	  switch (op)
++ 	    {
++ 	    case DW_MACRO_GNU_start_file:
++ 	      {
++ 		unsigned int filenum;
++ 		unsigned char *file_name = NULL, *dir_name = NULL;
++ 
++ 		lineno = read_leb128 (curr, &bytes_read, 0);
++ 		curr += bytes_read;
++ 		filenum = read_leb128 (curr, &bytes_read, 0);
++ 		curr += bytes_read;
++ 
++ 		if ((flags & 2) == 0)
++ 		  error (_("DW_MACRO_GNU_start_file used, but no .debug_line offset provided.\n"));
++ 		else
++ 		  file_name
++ 		    = get_line_filename_and_dirname (line_offset, filenum,
++ 						     &dir_name);
++ 		if (file_name == NULL)
++ 		  printf (_(" DW_MACRO_GNU_start_file - lineno: %d filenum: %d\n"),
++ 			  lineno, filenum);
++ 		else
++ 		  printf (_(" DW_MACRO_GNU_start_file - lineno: %d filenum: %d filename: %s%s%s\n"),
++ 			  lineno, filenum,
++ 			  dir_name != NULL ? (const char *) dir_name : "",
++ 			  dir_name != NULL ? "/" : "", file_name);
++ 	      }
++ 	      break;
++ 
++ 	    case DW_MACRO_GNU_end_file:
++ 	      printf (_(" DW_MACRO_GNU_end_file\n"));
++ 	      break;
++ 
++ 	    case DW_MACRO_GNU_define:
++ 	      lineno = read_leb128 (curr, &bytes_read, 0);
++ 	      curr += bytes_read;
++ 	      string = (char *) curr;
++ 	      curr += strlen (string) + 1;
++ 	      printf (_(" DW_MACRO_GNU_define - lineno : %d macro : %s\n"),
++ 		      lineno, string);
++ 	      break;
++ 
++ 	    case DW_MACRO_GNU_undef:
++ 	      lineno = read_leb128 (curr, &bytes_read, 0);
++ 	      curr += bytes_read;
++ 	      string = (char *) curr;
++ 	      curr += strlen (string) + 1;
++ 	      printf (_(" DW_MACRO_GNU_undef - lineno : %d macro : %s\n"),
++ 		      lineno, string);
++ 	      break;
++ 
++ 	    case DW_MACRO_GNU_define_indirect:
++ 	      lineno = read_leb128 (curr, &bytes_read, 0);
++ 	      curr += bytes_read;
++ 	      offset = byte_get (curr, offset_size);
++ 	      curr += offset_size;
++ 	      string = fetch_indirect_string (offset);
++ 	      printf (_(" DW_MACRO_GNU_define_indirect - lineno : %d macro : %s\n"),
++ 		      lineno, string);
++ 	      break;
++ 
++ 	    case DW_MACRO_GNU_undef_indirect:
++ 	      lineno = read_leb128 (curr, &bytes_read, 0);
++ 	      curr += bytes_read;
++ 	      offset = byte_get (curr, offset_size);
++ 	      curr += offset_size;
++ 	      string = fetch_indirect_string (offset);
++ 	      printf (_(" DW_MACRO_GNU_undef_indirect - lineno : %d macro : %s\n"),
++ 		      lineno, string);
++ 	      break;
++ 
++ 	    case DW_MACRO_GNU_transparent_include:
++ 	      offset = byte_get (curr, offset_size);
++ 	      curr += offset_size;
++ 	      printf (_(" DW_MACRO_GNU_transparent_include - offset : 0x%lx\n"),
++ 		      (unsigned long) offset);
++ 	      break;
++ 
++ 	    default:
++ 	      if (extended_ops == NULL || extended_ops[op] == NULL)
++ 		{
++ 		  error (_(" Unknown macro opcode %02x seen\n"), op);
++ 		  return 0;
++ 		}
++ 	      else
++ 		{
++ 		  /* Skip over unhandled opcodes.  */
++ 		  dwarf_vma nargs, n;
++ 		  unsigned char *desc = extended_ops[op];
++ 		  nargs = read_leb128 (desc, &bytes_read, 0);
++ 		  desc += bytes_read;
++ 		  if (nargs == 0)
++ 		    {
++ 		      printf (_(" DW_MACRO_GNU_%02x\n"), op);
++ 		      break;
++ 		    }
++ 		  printf (_(" DW_MACRO_GNU_%02x -"), op);
++ 		  for (n = 0; n < nargs; n++)
++ 		    {
++ 		      curr
++ 			= read_and_display_attr_value (0, byte_get (desc++, 1),
++ 						       curr, 0, 0, offset_size,
++ 						       version, NULL, 0, NULL);
++ 		      if (n != nargs - 1)
++ 			printf (",");
++ 		    }
++ 		  printf ("\n");
++ 		}
++ 	      break;
++ 	    }
++ 	}
++ 
++       printf ("\n");
++     }	
++ 
++   return 1;
++ }
++ 
+  static int
+  display_debug_abbrev (struct dwarf_section *section,
+  		      void *file ATTRIBUTE_UNUSED)
+*************** struct dwarf_section_display debug_displ
+*** 5536,5541 ****
+--- 5852,5859 ----
+      display_debug_frames,		&do_debug_frames,	1 },
+    { { ".debug_macinfo",		".zdebug_macinfo",	NULL, NULL, 0, 0 },
+      display_debug_macinfo,		&do_debug_macinfo,	0 },
++   { { ".debug_macro",		".zdebug_macro",	NULL, NULL, 0, 0 },
++     display_debug_macro,		&do_debug_macinfo,	1 },
+    { { ".debug_str",		".zdebug_str",		NULL, NULL, 0, 0 },
+      display_debug_str,			&do_debug_str,		0 },
+    { { ".debug_loc",		".zdebug_loc",		NULL, NULL, 0, 0 },
+diff -cpr ../binutils-2.21.53.0.1.orig/binutils/dwarf.h ./binutils/dwarf.h
+*** ../binutils-2.21.53.0.1.orig/binutils/dwarf.h	2011-07-27 09:57:54.835568000 +0100
+--- ./binutils/dwarf.h	2011-07-27 10:00:27.506568001 +0100
+*************** enum dwarf_section_display_enum
+*** 143,148 ****
+--- 143,149 ----
+    pubnames,
+    eh_frame,
+    macinfo,
++   macro,
+    str,
+    loc,
+    pubtypes,
+diff -cpr ../binutils-2.21.53.0.1.orig/binutils/readelf.c ./binutils/readelf.c
+*** ../binutils-2.21.53.0.1.orig/binutils/readelf.c	2011-07-27 09:57:55.019568001 +0100
+--- ./binutils/readelf.c	2011-07-27 10:00:35.362568001 +0100
+*************** process_section_headers (FILE * file)
+*** 4614,4619 ****
+--- 4614,4620 ----
+  	      || (do_debug_ranges   && streq (name, "ranges"))
+  	      || (do_debug_frames   && streq (name, "frame"))
+  	      || (do_debug_macinfo  && streq (name, "macinfo"))
++ 	      || (do_debug_macinfo  && streq (name, "macro"))
+  	      || (do_debug_str      && streq (name, "str"))
+  	      || (do_debug_loc      && streq (name, "loc"))
+  	      )
+*** ../binutils-2.21.53.0.1.orig/include/dwarf2.h	2011-07-27 09:57:55.773568001 +0100
+--- include/dwarf2.h	2011-07-27 10:20:37.147568000 +0100
+*************** enum dwarf_attribute
+*** 366,371 ****
+--- 366,373 ----
+      DW_AT_GNU_all_tail_call_sites = 0x2116,
+      DW_AT_GNU_all_call_sites = 0x2117,
+      DW_AT_GNU_all_source_call_sites = 0x2118,
++     /* Section offset into .debug_macro section.  */
++     DW_AT_GNU_macros = 0x2119,
+      /* VMS extensions.  */
+      DW_AT_VMS_rtnbeg_pd_address = 0x2201,
+      /* GNAT extensions.  */
+*************** enum dwarf_macinfo_record_type
+*** 880,885 ****
+--- 882,901 ----
+      DW_MACINFO_vendor_ext = 255
+    };
+  
++ /* Names and codes for new style macro information.  */
++ enum dwarf_macro_record_type
++   {
++     DW_MACRO_GNU_define = 1,
++     DW_MACRO_GNU_undef = 2,
++     DW_MACRO_GNU_start_file = 3,
++     DW_MACRO_GNU_end_file = 4,
++     DW_MACRO_GNU_define_indirect = 5,
++     DW_MACRO_GNU_undef_indirect = 6,
++     DW_MACRO_GNU_transparent_include = 7,
++     DW_MACRO_GNU_lo_user = 0xe0,
++     DW_MACRO_GNU_hi_user = 0xff
++   };
++ 
+  /* @@@ For use with GNU frame unwind information.  */
+  
+  #define DW_EH_PE_absptr		0x00
diff --git a/binutils.spec b/binutils.spec
index a9fc787..c95f9a9 100644
--- a/binutils.spec
+++ b/binutils.spec
@@ -17,7 +17,7 @@
 Summary: A GNU collection of binary utilities
 Name: %{?cross}binutils%{?_with_debug:-debug}
 Version: 2.21.53.0.1
-Release: 1%{?dist}
+Release: 2%{?dist}
 License: GPLv3+
 Group: Development/Tools
 URL: http://sources.redhat.com/binutils
@@ -31,6 +31,7 @@ Patch05: binutils-2.20.51.0.2-set-long-long.patch
 Patch06: binutils-2.20.51.0.10-copy-osabi.patch
 Patch07: binutils-2.20.51.0.10-sec-merge-emit.patch
 Patch08: binutils-2.20.51.0.2-build-id.patch
+Patch09: binutils-2.21.53.0.1-debug_macro.patch
 
 %define gold_arches %ix86 x86_64
 
@@ -129,6 +130,7 @@ using libelf instead of BFD.
 %patch06 -p0 -b .copy-osabi~
 %patch07 -p0 -b .sec-merge-emit~
 %patch08 -p0 -b .build-id~
+%patch09 -p0 -b .debug_macro~
 
 # We cannot run autotools as there is an exact requirement of autoconf-2.59.
 
@@ -418,6 +420,9 @@ exit 0
 %endif # %{isnative}
 
 %changelog
+* Wed Jul  27 2011 Nick Clifton <nickc at redhat.com> - 2.21.53.0.1-2
+- Import Jakub Jelinek's patch to add support for displaying the contents of .debug_macro sections.
+
 * Tue Jul  19 2011 Nick Clifton <nickc at redhat.com> - 2.21.53.0.1-1
 - Rebase on 2.21.53.0.1 tarball.  Delete unneeded patches.  (BZ 712668)
 


More information about the scm-commits mailing list