Nick Clifton 5a38d5
diff -cpr ../binutils-2.21.53.0.1.orig/bfd/dwarf2.c ./bfd/dwarf2.c
Nick Clifton 5a38d5
*** ../binutils-2.21.53.0.1.orig/bfd/dwarf2.c	2011-07-27 09:57:26.018568001 +0100
Nick Clifton 5a38d5
--- ./bfd/dwarf2.c	2011-07-27 10:00:21.176567999 +0100
Nick Clifton 5a38d5
*************** const struct dwarf_debug_section dwarf_d
Nick Clifton 5a38d5
*** 287,292 ****
Nick Clifton 5a38d5
--- 287,293 ----
Nick Clifton 5a38d5
    { ".debug_line",		".zdebug_line" },
Nick Clifton 5a38d5
    { ".debug_loc",		".zdebug_loc" },
Nick Clifton 5a38d5
    { ".debug_macinfo",		".zdebug_macinfo" },
Nick Clifton 5a38d5
+   { ".debug_macro",		".zdebug_macro" },
Nick Clifton 5a38d5
    { ".debug_pubnames",		".zdebug_pubnames" },
Nick Clifton 5a38d5
    { ".debug_pubtypes",		".zdebug_pubtypes" },
Nick Clifton 5a38d5
    { ".debug_ranges",		".zdebug_ranges" },
Nick Clifton 5a38d5
*************** enum dwarf_debug_section_enum
Nick Clifton 5a38d5
*** 314,319 ****
Nick Clifton 5a38d5
--- 315,321 ----
Nick Clifton 5a38d5
    debug_line,
Nick Clifton 5a38d5
    debug_loc,
Nick Clifton 5a38d5
    debug_macinfo,
Nick Clifton 5a38d5
+   debug_macro,
Nick Clifton 5a38d5
    debug_pubnames,
Nick Clifton 5a38d5
    debug_pubtypes,
Nick Clifton 5a38d5
    debug_ranges,
Nick Clifton 5a38d5
diff -cpr ../binutils-2.21.53.0.1.orig/binutils/dwarf.c ./binutils/dwarf.c
Nick Clifton 5a38d5
*** ../binutils-2.21.53.0.1.orig/binutils/dwarf.c	2011-07-27 09:57:55.204568001 +0100
Nick Clifton 5a38d5
--- ./binutils/dwarf.c	2011-07-27 10:00:17.247568001 +0100
Nick Clifton 5a38d5
*************** read_and_display_attr_value (unsigned lo
Nick Clifton 5a38d5
*** 1542,1548 ****
Nick Clifton 5a38d5
  	}
Nick Clifton 5a38d5
      }
Nick Clifton 5a38d5
  
Nick Clifton 5a38d5
!   if (do_loc)
Nick Clifton 5a38d5
      return data;
Nick Clifton 5a38d5
  
Nick Clifton 5a38d5
    /* For some attributes we can display further information.  */
Nick Clifton 5a38d5
--- 1542,1548 ----
Nick Clifton 5a38d5
  	}
Nick Clifton 5a38d5
      }
Nick Clifton 5a38d5
  
Nick Clifton 5a38d5
!   if (do_loc || attribute == 0)
Nick Clifton 5a38d5
      return data;
Nick Clifton 5a38d5
  
Nick Clifton 5a38d5
    /* For some attributes we can display further information.  */
Nick Clifton 5a38d5
*************** get_AT_name (unsigned long attribute)
Nick Clifton 5a38d5
*** 1960,1965 ****
Nick Clifton 5a38d5
--- 1960,1966 ----
Nick Clifton 5a38d5
      case DW_AT_GNU_all_tail_call_sites:		return "DW_AT_GNU_all_tail_call_sites";
Nick Clifton 5a38d5
      case DW_AT_GNU_all_call_sites:		return "DW_AT_GNU_all_call_sites";
Nick Clifton 5a38d5
      case DW_AT_GNU_all_source_call_sites:	return "DW_AT_GNU_all_source_call_sites";
Nick Clifton 5a38d5
+     case DW_AT_GNU_macros:			return "DW_AT_GNU_macros";
Nick Clifton 5a38d5
  
Nick Clifton 5a38d5
        /* UPC extension.  */
Nick Clifton 5a38d5
      case DW_AT_upc_threads_scaled:	return "DW_AT_upc_threads_scaled";
Nick Clifton 5a38d5
*************** display_debug_macinfo (struct dwarf_sect
Nick Clifton 5a38d5
*** 3450,3455 ****
Nick Clifton 5a38d5
--- 3451,3771 ----
Nick Clifton 5a38d5
    return 1;
Nick Clifton 5a38d5
  }
Nick Clifton 5a38d5
  
Nick Clifton 5a38d5
+ /* Given LINE_OFFSET into the .debug_line section, attempt to return
Nick Clifton 5a38d5
+    filename and dirname corresponding to file name table entry with index
Nick Clifton 5a38d5
+    FILEIDX.  Return NULL on failure.  */
Nick Clifton 5a38d5
+ 
Nick Clifton 5a38d5
+ static unsigned char *
Nick Clifton 5a38d5
+ get_line_filename_and_dirname (dwarf_vma line_offset, dwarf_vma fileidx,
Nick Clifton 5a38d5
+ 			       unsigned char **dir_name)
Nick Clifton 5a38d5
+ {
Nick Clifton 5a38d5
+   struct dwarf_section *section = &debug_displays [line].section;
Nick Clifton 5a38d5
+   unsigned char *hdrptr, *dirtable, *file_name;
Nick Clifton 5a38d5
+   unsigned int offset_size, initial_length_size;
Nick Clifton 5a38d5
+   unsigned int version, opcode_base, bytes_read;
Nick Clifton 5a38d5
+   dwarf_vma length, diridx;
Nick Clifton 5a38d5
+ 
Nick Clifton 5a38d5
+   *dir_name = NULL;
Nick Clifton 5a38d5
+   if (section->start == NULL
Nick Clifton 5a38d5
+       || line_offset >= section->size
Nick Clifton 5a38d5
+       || fileidx == 0)
Nick Clifton 5a38d5
+     return NULL;
Nick Clifton 5a38d5
+ 
Nick Clifton 5a38d5
+   hdrptr = section->start + line_offset;
Nick Clifton 5a38d5
+   length = byte_get (hdrptr, 4);
Nick Clifton 5a38d5
+   hdrptr += 4;
Nick Clifton 5a38d5
+   if (length == 0xffffffff)
Nick Clifton 5a38d5
+     {
Nick Clifton 5a38d5
+       /* This section is 64-bit DWARF 3.  */
Nick Clifton 5a38d5
+       length = byte_get (hdrptr, 8);
Nick Clifton 5a38d5
+       hdrptr += 8;
Nick Clifton 5a38d5
+       offset_size = 8;
Nick Clifton 5a38d5
+       initial_length_size = 12;
Nick Clifton 5a38d5
+     }
Nick Clifton 5a38d5
+   else
Nick Clifton 5a38d5
+     {
Nick Clifton 5a38d5
+       offset_size = 4;
Nick Clifton 5a38d5
+       initial_length_size = 4;
Nick Clifton 5a38d5
+     }
Nick Clifton 5a38d5
+   if (length + initial_length_size > section->size)
Nick Clifton 5a38d5
+     return NULL;
Nick Clifton 5a38d5
+   version = byte_get (hdrptr, 2);
Nick Clifton 5a38d5
+   hdrptr += 2;
Nick Clifton 5a38d5
+   if (version != 2 && version != 3 && version != 4)
Nick Clifton 5a38d5
+     return NULL;
Nick Clifton 5a38d5
+   hdrptr += offset_size + 1;/* Skip prologue_length and min_insn_length.  */
Nick Clifton 5a38d5
+   if (version >= 4)
Nick Clifton 5a38d5
+     hdrptr++;		    /* Skip max_ops_per_insn.  */
Nick Clifton 5a38d5
+   hdrptr += 3;		    /* Skip default_is_stmt, line_base, line_range.  */
Nick Clifton 5a38d5
+   opcode_base = byte_get (hdrptr, 1);
Nick Clifton 5a38d5
+   if (opcode_base == 0)
Nick Clifton 5a38d5
+     return NULL;
Nick Clifton 5a38d5
+   hdrptr++;
Nick Clifton 5a38d5
+   hdrptr += opcode_base - 1;
Nick Clifton 5a38d5
+   dirtable = hdrptr;
Nick Clifton 5a38d5
+   /* Skip over dirname table.  */
Nick Clifton 5a38d5
+   while (*hdrptr != '\0')
Nick Clifton 5a38d5
+     hdrptr += strlen ((char *) hdrptr) + 1;
Nick Clifton 5a38d5
+   hdrptr++;		    /* Skip the NUL at the end of the table.  */
Nick Clifton 5a38d5
+   /* Now skip over preceding filename table entries.  */
Nick Clifton 5a38d5
+   for (; *hdrptr != '\0' && fileidx > 1; fileidx--)
Nick Clifton 5a38d5
+     {
Nick Clifton 5a38d5
+       hdrptr += strlen ((char *) hdrptr) + 1;
Nick Clifton 5a38d5
+       read_leb128 (hdrptr, &bytes_read, 0);
Nick Clifton 5a38d5
+       hdrptr += bytes_read;
Nick Clifton 5a38d5
+       read_leb128 (hdrptr, &bytes_read, 0);
Nick Clifton 5a38d5
+       hdrptr += bytes_read;
Nick Clifton 5a38d5
+       read_leb128 (hdrptr, &bytes_read, 0);
Nick Clifton 5a38d5
+       hdrptr += bytes_read;
Nick Clifton 5a38d5
+     }
Nick Clifton 5a38d5
+   if (*hdrptr == '\0')
Nick Clifton 5a38d5
+     return NULL;
Nick Clifton 5a38d5
+   file_name = hdrptr;
Nick Clifton 5a38d5
+   hdrptr += strlen ((char *) hdrptr) + 1;
Nick Clifton 5a38d5
+   diridx = read_leb128 (hdrptr, &bytes_read, 0);
Nick Clifton 5a38d5
+   if (diridx == 0)
Nick Clifton 5a38d5
+     return file_name;
Nick Clifton 5a38d5
+   for (; *dirtable != '\0' && diridx > 1; diridx--)
Nick Clifton 5a38d5
+     dirtable += strlen ((char *) dirtable) + 1;
Nick Clifton 5a38d5
+   if (*dirtable == '\0')
Nick Clifton 5a38d5
+     return NULL;
Nick Clifton 5a38d5
+   *dir_name = dirtable;
Nick Clifton 5a38d5
+   return file_name;
Nick Clifton 5a38d5
+ }
Nick Clifton 5a38d5
+ 
Nick Clifton 5a38d5
+ static int
Nick Clifton 5a38d5
+ display_debug_macro (struct dwarf_section *section,
Nick Clifton 5a38d5
+ 		     void *file)
Nick Clifton 5a38d5
+ {
Nick Clifton 5a38d5
+   unsigned char *start = section->start;
Nick Clifton 5a38d5
+   unsigned char *end = start + section->size;
Nick Clifton 5a38d5
+   unsigned char *curr = start;
Nick Clifton 5a38d5
+   unsigned char *extended_op_buf[256];
Nick Clifton 5a38d5
+   unsigned int bytes_read;
Nick Clifton 5a38d5
+ 
Nick Clifton 5a38d5
+   load_debug_section (str, file);
Nick Clifton 5a38d5
+   load_debug_section (line, file);
Nick Clifton 5a38d5
+ 
Nick Clifton 5a38d5
+   printf (_("Contents of the %s section:\n\n"), section->name);
Nick Clifton 5a38d5
+ 
Nick Clifton 5a38d5
+   while (curr < end)
Nick Clifton 5a38d5
+     {
Nick Clifton 5a38d5
+       unsigned int lineno, version, flags;
Nick Clifton 5a38d5
+       unsigned int offset_size = 4;
Nick Clifton 5a38d5
+       const char *string;
Nick Clifton 5a38d5
+       dwarf_vma line_offset = 0, sec_offset = curr - start, offset;
Nick Clifton 5a38d5
+       unsigned char **extended_ops = NULL;
Nick Clifton 5a38d5
+ 
Nick Clifton 5a38d5
+       version = byte_get (curr, 2);
Nick Clifton 5a38d5
+       curr += 2;
Nick Clifton 5a38d5
+ 
Nick Clifton 5a38d5
+       if (version != 4)
Nick Clifton 5a38d5
+ 	{
Nick Clifton 5a38d5
+ 	  error (_("Only GNU extension to DWARF 4 of %s is currently supported.\n"),
Nick Clifton 5a38d5
+ 		 section->name);
Nick Clifton 5a38d5
+ 	  return 0;
Nick Clifton 5a38d5
+ 	}
Nick Clifton 5a38d5
+ 
Nick Clifton 5a38d5
+       flags = byte_get (curr++, 1);
Nick Clifton 5a38d5
+       if (flags & 1)
Nick Clifton 5a38d5
+ 	offset_size = 8;
Nick Clifton 5a38d5
+       printf (_("  Offset:                      0x%lx\n"),
Nick Clifton 5a38d5
+ 	      (unsigned long) sec_offset);
Nick Clifton 5a38d5
+       printf (_("  Version:                     %d\n"), version);
Nick Clifton 5a38d5
+       printf (_("  Offset size:                 %d\n"), offset_size);
Nick Clifton 5a38d5
+       if (flags & 2)
Nick Clifton 5a38d5
+ 	{
Nick Clifton 5a38d5
+ 	  line_offset = byte_get (curr, offset_size);
Nick Clifton 5a38d5
+ 	  curr += offset_size;
Nick Clifton 5a38d5
+ 	  printf (_("  Offset into .debug_line:     0x%lx\n"),
Nick Clifton 5a38d5
+ 		  (unsigned long) line_offset);
Nick Clifton 5a38d5
+ 	}
Nick Clifton 5a38d5
+       if (flags & 4)
Nick Clifton 5a38d5
+ 	{
Nick Clifton 5a38d5
+ 	  unsigned int i, count = byte_get (curr++, 1), op;
Nick Clifton 5a38d5
+ 	  dwarf_vma nargs, n;
Nick Clifton 5a38d5
+ 	  memset (extended_op_buf, 0, sizeof (extended_op_buf));
Nick Clifton 5a38d5
+ 	  extended_ops = extended_op_buf;
Nick Clifton 5a38d5
+ 	  if (count)
Nick Clifton 5a38d5
+ 	    {
Nick Clifton 5a38d5
+ 	      printf (_("  Extension opcode arguments:\n"));
Nick Clifton 5a38d5
+ 	      for (i = 0; i < count; i++)
Nick Clifton 5a38d5
+ 		{
Nick Clifton 5a38d5
+ 		  op = byte_get (curr++, 1);
Nick Clifton 5a38d5
+ 		  extended_ops[op] = curr;
Nick Clifton 5a38d5
+ 		  nargs = read_leb128 (curr, &bytes_read, 0);
Nick Clifton 5a38d5
+ 		  curr += bytes_read;
Nick Clifton 5a38d5
+ 		  if (nargs == 0)
Nick Clifton 5a38d5
+ 		    printf (_("    DW_MACRO_GNU_%02x has no arguments\n"), op);
Nick Clifton 5a38d5
+ 		  else
Nick Clifton 5a38d5
+ 		    {
Nick Clifton 5a38d5
+ 		      printf (_("    DW_MACRO_GNU_%02x arguments: "), op);
Nick Clifton 5a38d5
+ 		      for (n = 0; n < nargs; n++)
Nick Clifton 5a38d5
+ 			{
Nick Clifton 5a38d5
+ 			  unsigned int form = byte_get (curr++, 1);
Nick Clifton 5a38d5
+ 			  printf ("%s%s", get_FORM_name (form),
Nick Clifton 5a38d5
+ 				  n == nargs - 1 ? "\n" : ", ");
Nick Clifton 5a38d5
+ 			  switch (form)
Nick Clifton 5a38d5
+ 			    {
Nick Clifton 5a38d5
+ 			    case DW_FORM_data1:
Nick Clifton 5a38d5
+ 			    case DW_FORM_data2:
Nick Clifton 5a38d5
+ 			    case DW_FORM_data4:
Nick Clifton 5a38d5
+ 			    case DW_FORM_data8:
Nick Clifton 5a38d5
+ 			    case DW_FORM_sdata:
Nick Clifton 5a38d5
+ 			    case DW_FORM_udata:
Nick Clifton 5a38d5
+ 			    case DW_FORM_block:
Nick Clifton 5a38d5
+ 			    case DW_FORM_block1:
Nick Clifton 5a38d5
+ 			    case DW_FORM_block2:
Nick Clifton 5a38d5
+ 			    case DW_FORM_block4:
Nick Clifton 5a38d5
+ 			    case DW_FORM_flag:
Nick Clifton 5a38d5
+ 			    case DW_FORM_string:
Nick Clifton 5a38d5
+ 			    case DW_FORM_strp:
Nick Clifton 5a38d5
+ 			    case DW_FORM_sec_offset:
Nick Clifton 5a38d5
+ 			      break;
Nick Clifton 5a38d5
+ 			    default:
Nick Clifton 5a38d5
+ 			      error (_("Invalid extension opcode form %s\n"),
Nick Clifton 5a38d5
+ 				     get_FORM_name (form));
Nick Clifton 5a38d5
+ 			      return 0;
Nick Clifton 5a38d5
+ 			    }
Nick Clifton 5a38d5
+ 			}
Nick Clifton 5a38d5
+ 		    }
Nick Clifton 5a38d5
+ 		}
Nick Clifton 5a38d5
+ 	    }
Nick Clifton 5a38d5
+ 	}
Nick Clifton 5a38d5
+       printf ("\n");
Nick Clifton 5a38d5
+ 
Nick Clifton 5a38d5
+       while (1)
Nick Clifton 5a38d5
+ 	{
Nick Clifton 5a38d5
+ 	  unsigned int op;
Nick Clifton 5a38d5
+ 
Nick Clifton 5a38d5
+ 	  if (curr >= end)
Nick Clifton 5a38d5
+ 	    {
Nick Clifton 5a38d5
+ 	      error (_(".debug_macro section not zero terminated\n"));
Nick Clifton 5a38d5
+ 	      return 0;
Nick Clifton 5a38d5
+ 	    }
Nick Clifton 5a38d5
+ 
Nick Clifton 5a38d5
+ 	  op = byte_get (curr++, 1);
Nick Clifton 5a38d5
+ 	  if (op == 0)
Nick Clifton 5a38d5
+ 	    break;
Nick Clifton 5a38d5
+ 
Nick Clifton 5a38d5
+ 	  switch (op)
Nick Clifton 5a38d5
+ 	    {
Nick Clifton 5a38d5
+ 	    case DW_MACRO_GNU_start_file:
Nick Clifton 5a38d5
+ 	      {
Nick Clifton 5a38d5
+ 		unsigned int filenum;
Nick Clifton 5a38d5
+ 		unsigned char *file_name = NULL, *dir_name = NULL;
Nick Clifton 5a38d5
+ 
Nick Clifton 5a38d5
+ 		lineno = read_leb128 (curr, &bytes_read, 0);
Nick Clifton 5a38d5
+ 		curr += bytes_read;
Nick Clifton 5a38d5
+ 		filenum = read_leb128 (curr, &bytes_read, 0);
Nick Clifton 5a38d5
+ 		curr += bytes_read;
Nick Clifton 5a38d5
+ 
Nick Clifton 5a38d5
+ 		if ((flags & 2) == 0)
Nick Clifton 5a38d5
+ 		  error (_("DW_MACRO_GNU_start_file used, but no .debug_line offset provided.\n"));
Nick Clifton 5a38d5
+ 		else
Nick Clifton 5a38d5
+ 		  file_name
Nick Clifton 5a38d5
+ 		    = get_line_filename_and_dirname (line_offset, filenum,
Nick Clifton 5a38d5
+ 						     &dir_name);
Nick Clifton 5a38d5
+ 		if (file_name == NULL)
Nick Clifton 5a38d5
+ 		  printf (_(" DW_MACRO_GNU_start_file - lineno: %d filenum: %d\n"),
Nick Clifton 5a38d5
+ 			  lineno, filenum);
Nick Clifton 5a38d5
+ 		else
Nick Clifton 5a38d5
+ 		  printf (_(" DW_MACRO_GNU_start_file - lineno: %d filenum: %d filename: %s%s%s\n"),
Nick Clifton 5a38d5
+ 			  lineno, filenum,
Nick Clifton 5a38d5
+ 			  dir_name != NULL ? (const char *) dir_name : "",
Nick Clifton 5a38d5
+ 			  dir_name != NULL ? "/" : "", file_name);
Nick Clifton 5a38d5
+ 	      }
Nick Clifton 5a38d5
+ 	      break;
Nick Clifton 5a38d5
+ 
Nick Clifton 5a38d5
+ 	    case DW_MACRO_GNU_end_file:
Nick Clifton 5a38d5
+ 	      printf (_(" DW_MACRO_GNU_end_file\n"));
Nick Clifton 5a38d5
+ 	      break;
Nick Clifton 5a38d5
+ 
Nick Clifton 5a38d5
+ 	    case DW_MACRO_GNU_define:
Nick Clifton 5a38d5
+ 	      lineno = read_leb128 (curr, &bytes_read, 0);
Nick Clifton 5a38d5
+ 	      curr += bytes_read;
Nick Clifton 5a38d5
+ 	      string = (char *) curr;
Nick Clifton 5a38d5
+ 	      curr += strlen (string) + 1;
Nick Clifton 5a38d5
+ 	      printf (_(" DW_MACRO_GNU_define - lineno : %d macro : %s\n"),
Nick Clifton 5a38d5
+ 		      lineno, string);
Nick Clifton 5a38d5
+ 	      break;
Nick Clifton 5a38d5
+ 
Nick Clifton 5a38d5
+ 	    case DW_MACRO_GNU_undef:
Nick Clifton 5a38d5
+ 	      lineno = read_leb128 (curr, &bytes_read, 0);
Nick Clifton 5a38d5
+ 	      curr += bytes_read;
Nick Clifton 5a38d5
+ 	      string = (char *) curr;
Nick Clifton 5a38d5
+ 	      curr += strlen (string) + 1;
Nick Clifton 5a38d5
+ 	      printf (_(" DW_MACRO_GNU_undef - lineno : %d macro : %s\n"),
Nick Clifton 5a38d5
+ 		      lineno, string);
Nick Clifton 5a38d5
+ 	      break;
Nick Clifton 5a38d5
+ 
Nick Clifton 5a38d5
+ 	    case DW_MACRO_GNU_define_indirect:
Nick Clifton 5a38d5
+ 	      lineno = read_leb128 (curr, &bytes_read, 0);
Nick Clifton 5a38d5
+ 	      curr += bytes_read;
Nick Clifton 5a38d5
+ 	      offset = byte_get (curr, offset_size);
Nick Clifton 5a38d5
+ 	      curr += offset_size;
Nick Clifton 5a38d5
+ 	      string = fetch_indirect_string (offset);
Nick Clifton 5a38d5
+ 	      printf (_(" DW_MACRO_GNU_define_indirect - lineno : %d macro : %s\n"),
Nick Clifton 5a38d5
+ 		      lineno, string);
Nick Clifton 5a38d5
+ 	      break;
Nick Clifton 5a38d5
+ 
Nick Clifton 5a38d5
+ 	    case DW_MACRO_GNU_undef_indirect:
Nick Clifton 5a38d5
+ 	      lineno = read_leb128 (curr, &bytes_read, 0);
Nick Clifton 5a38d5
+ 	      curr += bytes_read;
Nick Clifton 5a38d5
+ 	      offset = byte_get (curr, offset_size);
Nick Clifton 5a38d5
+ 	      curr += offset_size;
Nick Clifton 5a38d5
+ 	      string = fetch_indirect_string (offset);
Nick Clifton 5a38d5
+ 	      printf (_(" DW_MACRO_GNU_undef_indirect - lineno : %d macro : %s\n"),
Nick Clifton 5a38d5
+ 		      lineno, string);
Nick Clifton 5a38d5
+ 	      break;
Nick Clifton 5a38d5
+ 
Nick Clifton 5a38d5
+ 	    case DW_MACRO_GNU_transparent_include:
Nick Clifton 5a38d5
+ 	      offset = byte_get (curr, offset_size);
Nick Clifton 5a38d5
+ 	      curr += offset_size;
Nick Clifton 5a38d5
+ 	      printf (_(" DW_MACRO_GNU_transparent_include - offset : 0x%lx\n"),
Nick Clifton 5a38d5
+ 		      (unsigned long) offset);
Nick Clifton 5a38d5
+ 	      break;
Nick Clifton 5a38d5
+ 
Nick Clifton 5a38d5
+ 	    default:
Nick Clifton 5a38d5
+ 	      if (extended_ops == NULL || extended_ops[op] == NULL)
Nick Clifton 5a38d5
+ 		{
Nick Clifton 5a38d5
+ 		  error (_(" Unknown macro opcode %02x seen\n"), op);
Nick Clifton 5a38d5
+ 		  return 0;
Nick Clifton 5a38d5
+ 		}
Nick Clifton 5a38d5
+ 	      else
Nick Clifton 5a38d5
+ 		{
Nick Clifton 5a38d5
+ 		  /* Skip over unhandled opcodes.  */
Nick Clifton 5a38d5
+ 		  dwarf_vma nargs, n;
Nick Clifton 5a38d5
+ 		  unsigned char *desc = extended_ops[op];
Nick Clifton 5a38d5
+ 		  nargs = read_leb128 (desc, &bytes_read, 0);
Nick Clifton 5a38d5
+ 		  desc += bytes_read;
Nick Clifton 5a38d5
+ 		  if (nargs == 0)
Nick Clifton 5a38d5
+ 		    {
Nick Clifton 5a38d5
+ 		      printf (_(" DW_MACRO_GNU_%02x\n"), op);
Nick Clifton 5a38d5
+ 		      break;
Nick Clifton 5a38d5
+ 		    }
Nick Clifton 5a38d5
+ 		  printf (_(" DW_MACRO_GNU_%02x -"), op);
Nick Clifton 5a38d5
+ 		  for (n = 0; n < nargs; n++)
Nick Clifton 5a38d5
+ 		    {
Nick Clifton 5a38d5
+ 		      curr
Nick Clifton 5a38d5
+ 			= read_and_display_attr_value (0, byte_get (desc++, 1),
Nick Clifton 5a38d5
+ 						       curr, 0, 0, offset_size,
Nick Clifton 5a38d5
+ 						       version, NULL, 0, NULL);
Nick Clifton 5a38d5
+ 		      if (n != nargs - 1)
Nick Clifton 5a38d5
+ 			printf (",");
Nick Clifton 5a38d5
+ 		    }
Nick Clifton 5a38d5
+ 		  printf ("\n");
Nick Clifton 5a38d5
+ 		}
Nick Clifton 5a38d5
+ 	      break;
Nick Clifton 5a38d5
+ 	    }
Nick Clifton 5a38d5
+ 	}
Nick Clifton 5a38d5
+ 
Nick Clifton 5a38d5
+       printf ("\n");
Nick Clifton 5a38d5
+     }	
Nick Clifton 5a38d5
+ 
Nick Clifton 5a38d5
+   return 1;
Nick Clifton 5a38d5
+ }
Nick Clifton 5a38d5
+ 
Nick Clifton 5a38d5
  static int
Nick Clifton 5a38d5
  display_debug_abbrev (struct dwarf_section *section,
Nick Clifton 5a38d5
  		      void *file ATTRIBUTE_UNUSED)
Nick Clifton 5a38d5
*************** struct dwarf_section_display debug_displ
Nick Clifton 5a38d5
*** 5536,5541 ****
Nick Clifton 5a38d5
--- 5852,5859 ----
Nick Clifton 5a38d5
      display_debug_frames,		&do_debug_frames,	1 },
Nick Clifton 5a38d5
    { { ".debug_macinfo",		".zdebug_macinfo",	NULL, NULL, 0, 0 },
Nick Clifton 5a38d5
      display_debug_macinfo,		&do_debug_macinfo,	0 },
Nick Clifton 5a38d5
+   { { ".debug_macro",		".zdebug_macro",	NULL, NULL, 0, 0 },
Nick Clifton 5a38d5
+     display_debug_macro,		&do_debug_macinfo,	1 },
Nick Clifton 5a38d5
    { { ".debug_str",		".zdebug_str",		NULL, NULL, 0, 0 },
Nick Clifton 5a38d5
      display_debug_str,			&do_debug_str,		0 },
Nick Clifton 5a38d5
    { { ".debug_loc",		".zdebug_loc",		NULL, NULL, 0, 0 },
Nick Clifton 5a38d5
diff -cpr ../binutils-2.21.53.0.1.orig/binutils/dwarf.h ./binutils/dwarf.h
Nick Clifton 5a38d5
*** ../binutils-2.21.53.0.1.orig/binutils/dwarf.h	2011-07-27 09:57:54.835568000 +0100
Nick Clifton 5a38d5
--- ./binutils/dwarf.h	2011-07-27 10:00:27.506568001 +0100
Nick Clifton 5a38d5
*************** enum dwarf_section_display_enum
Nick Clifton 5a38d5
*** 143,148 ****
Nick Clifton 5a38d5
--- 143,149 ----
Nick Clifton 5a38d5
    pubnames,
Nick Clifton 5a38d5
    eh_frame,
Nick Clifton 5a38d5
    macinfo,
Nick Clifton 5a38d5
+   macro,
Nick Clifton 5a38d5
    str,
Nick Clifton 5a38d5
    loc,
Nick Clifton 5a38d5
    pubtypes,
Nick Clifton 5a38d5
diff -cpr ../binutils-2.21.53.0.1.orig/binutils/readelf.c ./binutils/readelf.c
Nick Clifton 5a38d5
*** ../binutils-2.21.53.0.1.orig/binutils/readelf.c	2011-07-27 09:57:55.019568001 +0100
Nick Clifton 5a38d5
--- ./binutils/readelf.c	2011-07-27 10:00:35.362568001 +0100
Nick Clifton 5a38d5
*************** process_section_headers (FILE * file)
Nick Clifton 5a38d5
*** 4614,4619 ****
Nick Clifton 5a38d5
--- 4614,4620 ----
Nick Clifton 5a38d5
  	      || (do_debug_ranges   && streq (name, "ranges"))
Nick Clifton 5a38d5
  	      || (do_debug_frames   && streq (name, "frame"))
Nick Clifton 5a38d5
  	      || (do_debug_macinfo  && streq (name, "macinfo"))
Nick Clifton 5a38d5
+ 	      || (do_debug_macinfo  && streq (name, "macro"))
Nick Clifton 5a38d5
  	      || (do_debug_str      && streq (name, "str"))
Nick Clifton 5a38d5
  	      || (do_debug_loc      && streq (name, "loc"))
Nick Clifton 5a38d5
  	      )
Nick Clifton 5a38d5
*** ../binutils-2.21.53.0.1.orig/include/dwarf2.h	2011-07-27 09:57:55.773568001 +0100
Nick Clifton 5a38d5
--- include/dwarf2.h	2011-07-27 10:20:37.147568000 +0100
Nick Clifton 5a38d5
*************** enum dwarf_attribute
Nick Clifton 5a38d5
*** 366,371 ****
Nick Clifton 5a38d5
--- 366,373 ----
Nick Clifton 5a38d5
      DW_AT_GNU_all_tail_call_sites = 0x2116,
Nick Clifton 5a38d5
      DW_AT_GNU_all_call_sites = 0x2117,
Nick Clifton 5a38d5
      DW_AT_GNU_all_source_call_sites = 0x2118,
Nick Clifton 5a38d5
+     /* Section offset into .debug_macro section.  */
Nick Clifton 5a38d5
+     DW_AT_GNU_macros = 0x2119,
Nick Clifton 5a38d5
      /* VMS extensions.  */
Nick Clifton 5a38d5
      DW_AT_VMS_rtnbeg_pd_address = 0x2201,
Nick Clifton 5a38d5
      /* GNAT extensions.  */
Nick Clifton 5a38d5
*************** enum dwarf_macinfo_record_type
Nick Clifton 5a38d5
*** 880,885 ****
Nick Clifton 5a38d5
--- 882,901 ----
Nick Clifton 5a38d5
      DW_MACINFO_vendor_ext = 255
Nick Clifton 5a38d5
    };
Nick Clifton 5a38d5
  
Nick Clifton 5a38d5
+ /* Names and codes for new style macro information.  */
Nick Clifton 5a38d5
+ enum dwarf_macro_record_type
Nick Clifton 5a38d5
+   {
Nick Clifton 5a38d5
+     DW_MACRO_GNU_define = 1,
Nick Clifton 5a38d5
+     DW_MACRO_GNU_undef = 2,
Nick Clifton 5a38d5
+     DW_MACRO_GNU_start_file = 3,
Nick Clifton 5a38d5
+     DW_MACRO_GNU_end_file = 4,
Nick Clifton 5a38d5
+     DW_MACRO_GNU_define_indirect = 5,
Nick Clifton 5a38d5
+     DW_MACRO_GNU_undef_indirect = 6,
Nick Clifton 5a38d5
+     DW_MACRO_GNU_transparent_include = 7,
Nick Clifton 5a38d5
+     DW_MACRO_GNU_lo_user = 0xe0,
Nick Clifton 5a38d5
+     DW_MACRO_GNU_hi_user = 0xff
Nick Clifton 5a38d5
+   };
Nick Clifton 5a38d5
+ 
Nick Clifton 5a38d5
  /* @@@ For use with GNU frame unwind information.  */
Nick Clifton 5a38d5
  
Nick Clifton 5a38d5
  #define DW_EH_PE_absptr		0x00