sim: tweak static order on hw_glue_ports
[deliverable/binutils-gdb.git] / binutils / dwarf.c
index 5eeef088911ac3f3ee2ac1d66b9f9e360e125955..e51aa647e590da813d2f7fa4d68900b1822f60b8 100644 (file)
@@ -45,6 +45,7 @@ int do_debug_info;
 int do_debug_abbrevs;
 int do_debug_lines;
 int do_debug_pubnames;
+int do_debug_pubtypes;
 int do_debug_aranges;
 int do_debug_ranges;
 int do_debug_frames;
@@ -226,7 +227,7 @@ print_dwarf_vma (dwarf_vma val, unsigned byte_size)
   fputs (buff + (byte_size == 4 ? 8 : 0), stdout);
 }
 
-static unsigned long int
+unsigned long int
 read_leb128 (unsigned char *data, unsigned int *length_return, int sign)
 {
   unsigned long int result = 0;
@@ -437,23 +438,23 @@ static abbrev_entry *last_abbrev = NULL;
 static void
 free_abbrevs (void)
 {
-  abbrev_entry *abbrev;
+  abbrev_entry *abbrv;
 
-  for (abbrev = first_abbrev; abbrev;)
+  for (abbrv = first_abbrev; abbrv;)
     {
-      abbrev_entry *next = abbrev->next;
+      abbrev_entry *next_abbrev = abbrv->next;
       abbrev_attr *attr;
 
-      for (attr = abbrev->first_attr; attr;)
+      for (attr = abbrv->first_attr; attr;)
        {
-         abbrev_attr *next = attr->next;
+         abbrev_attr *next_attr = attr->next;
 
          free (attr);
-         attr = next;
+         attr = next_attr;
        }
 
-      free (abbrev);
-      abbrev = next;
+      free (abbrv);
+      abbrv = next_abbrev;
     }
 
   last_abbrev = first_abbrev = NULL;
@@ -628,6 +629,12 @@ get_TAG_name (unsigned long tag)
     case DW_TAG_unspecified_type:      return "DW_TAG_unspecified_type";
     case DW_TAG_partial_unit:          return "DW_TAG_partial_unit";
     case DW_TAG_imported_unit:         return "DW_TAG_imported_unit";
+    case DW_TAG_condition:             return "DW_TAG_condition";
+    case DW_TAG_shared_type:           return "DW_TAG_shared_type";
+      /* DWARF 4 values.  */
+    case DW_TAG_type_unit:             return "DW_TAG_type_unit";
+    case DW_TAG_rvalue_reference_type: return "DW_TAG_rvalue_reference_type";
+    case DW_TAG_template_alias:                return "DW_TAG_template_alias";
       /* UPC values.  */
     case DW_TAG_upc_shared_type:       return "DW_TAG_upc_shared_type";
     case DW_TAG_upc_strict_type:       return "DW_TAG_upc_strict_type";
@@ -668,6 +675,11 @@ get_FORM_name (unsigned long form)
     case DW_FORM_ref8:         return "DW_FORM_ref8";
     case DW_FORM_ref_udata:    return "DW_FORM_ref_udata";
     case DW_FORM_indirect:     return "DW_FORM_indirect";
+      /* DWARF 4 values.  */
+    case DW_FORM_sec_offset:   return "DW_FORM_sec_offset";
+    case DW_FORM_exprloc:      return "DW_FORM_exprloc";
+    case DW_FORM_flag_present: return "DW_FORM_flag_present";
+    case DW_FORM_ref_sig8:     return "DW_FORM_ref_sig8";
     default:
       {
        static char buffer[100];
@@ -1305,6 +1317,21 @@ read_and_display_attr_value (unsigned long attribute,
       /* Handled above.  */
       break;
 
+    case DW_FORM_ref_sig8:
+      if (!do_loc)
+       {
+         int i;
+         printf (" signature: ");
+         for (i = 0; i < 8; i++)
+           {
+             printf ("%02x", (unsigned) byte_get (data, 1));
+             data += 1;
+           }
+       }
+      else
+        data += 8;
+      break;
+
     default:
       warn (_("Unrecognized form: %lu\n"), form);
       break;
@@ -1328,19 +1355,19 @@ read_and_display_attr_value (unsigned long attribute,
          if (form == DW_FORM_data4 || form == DW_FORM_data8)
            {
              /* Process location list.  */
-             unsigned int max = debug_info_p->max_loc_offsets;
+             unsigned int lmax = debug_info_p->max_loc_offsets;
              unsigned int num = debug_info_p->num_loc_offsets;
 
-             if (max == 0 || num >= max)
+             if (lmax == 0 || num >= lmax)
                {
-                 max += 1024;
+                 lmax += 1024;
                  debug_info_p->loc_offsets = (long unsigned int *)
                       xcrealloc (debug_info_p->loc_offsets,
-                                max, sizeof (*debug_info_p->loc_offsets));
+                                lmax, sizeof (*debug_info_p->loc_offsets));
                  debug_info_p->have_frame_base = (int *)
                       xcrealloc (debug_info_p->have_frame_base,
-                                max, sizeof (*debug_info_p->have_frame_base));
-                 debug_info_p->max_loc_offsets = max;
+                                lmax, sizeof (*debug_info_p->have_frame_base));
+                 debug_info_p->max_loc_offsets = lmax;
                }
              debug_info_p->loc_offsets [num] = uvalue;
              debug_info_p->have_frame_base [num] = have_frame_base;
@@ -1357,16 +1384,16 @@ read_and_display_attr_value (unsigned long attribute,
          if (form == DW_FORM_data4 || form == DW_FORM_data8)
            {
              /* Process range list.  */
-             unsigned int max = debug_info_p->max_range_lists;
+             unsigned int lmax = debug_info_p->max_range_lists;
              unsigned int num = debug_info_p->num_range_lists;
 
-             if (max == 0 || num >= max)
+             if (lmax == 0 || num >= lmax)
                {
-                 max += 1024;
+                 lmax += 1024;
                  debug_info_p->range_lists = (long unsigned int *)
                       xcrealloc (debug_info_p->range_lists,
-                                max, sizeof (*debug_info_p->range_lists));
-                 debug_info_p->max_range_lists = max;
+                                lmax, sizeof (*debug_info_p->range_lists));
+                 debug_info_p->max_range_lists = lmax;
                }
              debug_info_p->range_lists [num] = uvalue;
              debug_info_p->num_range_lists++;
@@ -1432,6 +1459,8 @@ read_and_display_attr_value (unsigned long attribute,
        case DW_LANG_ObjC_plus_plus:    printf ("(Objective C++)"); break;
        case DW_LANG_UPC:               printf ("(Unified Parallel C)"); break;
        case DW_LANG_D:                 printf ("(D)"); break;
+         /* DWARF 4 values.  */
+       case DW_LANG_Python:            printf ("(Python)"); break;
          /* MIPS extension.  */
        case DW_LANG_Mips_Assembler:    printf ("(MIPS assembler)"); break;
          /* UPC extension.  */
@@ -1588,6 +1617,9 @@ read_and_display_attr_value (unsigned long attribute,
 
     case DW_AT_import:
       {
+        if (form == DW_FORM_ref_sig8)
+          break;
+
        if (form == DW_FORM_ref1
            || form == DW_FORM_ref2
            || form == DW_FORM_ref4)
@@ -1716,6 +1748,13 @@ get_AT_name (unsigned long attribute)
     case DW_AT_elemental:              return "DW_AT_elemental";
     case DW_AT_pure:                   return "DW_AT_pure";
     case DW_AT_recursive:              return "DW_AT_recursive";
+      /* DWARF 4 values.  */
+    case DW_AT_signature:              return "DW_AT_signature";
+    case DW_AT_main_subprogram:                return "DW_AT_main_subprogram";
+    case DW_AT_data_bit_offset:                return "DW_AT_data_bit_offset";
+    case DW_AT_const_expr:             return "DW_AT_const_expr";
+    case DW_AT_enum_class:             return "DW_AT_enum_class";
+    case DW_AT_linkage_name:           return "DW_AT_linkage_name";
 
       /* HP and SGI/MIPS extensions.  */
     case DW_AT_MIPS_loop_begin:                        return "DW_AT_MIPS_loop_begin";
@@ -1748,13 +1787,23 @@ get_AT_name (unsigned long attribute)
     case DW_AT_MIPS_fde:                       return "DW_AT_MIPS_fde or DW_AT_HP_unmodifiable";
 
       /* GNU extensions.  */
-    case DW_AT_sf_names:               return "DW_AT_sf_names";
-    case DW_AT_src_info:               return "DW_AT_src_info";
-    case DW_AT_mac_info:               return "DW_AT_mac_info";
-    case DW_AT_src_coords:             return "DW_AT_src_coords";
-    case DW_AT_body_begin:             return "DW_AT_body_begin";
-    case DW_AT_body_end:               return "DW_AT_body_end";
-    case DW_AT_GNU_vector:             return "DW_AT_GNU_vector";
+    case DW_AT_sf_names:                       return "DW_AT_sf_names";
+    case DW_AT_src_info:                       return "DW_AT_src_info";
+    case DW_AT_mac_info:                       return "DW_AT_mac_info";
+    case DW_AT_src_coords:                     return "DW_AT_src_coords";
+    case DW_AT_body_begin:                     return "DW_AT_body_begin";
+    case DW_AT_body_end:                       return "DW_AT_body_end";
+    case DW_AT_GNU_vector:                     return "DW_AT_GNU_vector";
+    case DW_AT_GNU_guarded_by:                 return "DW_AT_GNU_guarded_by";
+    case DW_AT_GNU_pt_guarded_by:              return "DW_AT_GNU_pt_guarded_by";
+    case DW_AT_GNU_guarded:                    return "DW_AT_GNU_guarded";
+    case DW_AT_GNU_pt_guarded:                 return "DW_AT_GNU_pt_guarded";
+    case DW_AT_GNU_locks_excluded:             return "DW_AT_GNU_locks_excluded";
+    case DW_AT_GNU_exclusive_locks_required:   return "DW_AT_GNU_exclusive_locks_required";
+    case DW_AT_GNU_shared_locks_required:      return "DW_AT_GNU_shared_locks_required";
+    case DW_AT_GNU_odr_signature:              return "DW_AT_GNU_odr_signature";
+    case DW_AT_use_GNAT_descriptive_type:      return "DW_AT_use_GNAT_descriptive_type";
+    case DW_AT_GNAT_descriptive_type:          return "DW_AT_GNAT_descriptive_type";
 
       /* UPC extension.  */
     case DW_AT_upc_threads_scaled:     return "DW_AT_upc_threads_scaled";
@@ -1801,12 +1850,14 @@ read_and_display_attr (unsigned long attribute,
 
 /* Process the contents of a .debug_info section.  If do_loc is non-zero
    then we are scanning for location lists and we do not want to display
-   anything to the user.  */
+   anything to the user.  If do_types is non-zero, we are processing
+   a .debug_types section instead of a .debug_info section.  */
 
 static int
 process_debug_info (struct dwarf_section *section,
                    void *file,
-                   int do_loc)
+                   int do_loc,
+                   int do_types)
 {
   unsigned char *start = section->start;
   unsigned char *end = start + section->size;
@@ -1815,7 +1866,8 @@ process_debug_info (struct dwarf_section *section,
   unsigned int num_units = 0;
 
   if ((do_loc || do_debug_loc || do_debug_ranges)
-      && num_debug_info_entries == 0)
+      && num_debug_info_entries == 0
+      && ! do_types)
     {
       unsigned long length;
 
@@ -1893,6 +1945,8 @@ process_debug_info (struct dwarf_section *section,
       unsigned long cu_offset;
       int offset_size;
       int initial_length_size;
+      unsigned char signature[8];
+      unsigned long type_offset = 0;
 
       hdrptr = start;
 
@@ -1923,8 +1977,24 @@ process_debug_info (struct dwarf_section *section,
 
       compunit.cu_pointer_size = byte_get (hdrptr, 1);
       hdrptr += 1;
+
+      if (do_types)
+        {
+          int i;
+
+          for (i = 0; i < 8; i++)
+            {
+              signature[i] = byte_get (hdrptr, 1);
+              hdrptr += 1;
+            }
+
+          type_offset = byte_get (hdrptr, offset_size);
+          hdrptr += offset_size;
+        }
+
       if ((do_loc || do_debug_loc || do_debug_ranges)
-         && num_debug_info_entries == 0)
+         && num_debug_info_entries == 0
+         && ! do_types)
        {
          debug_information [unit].cu_offset = cu_offset;
          debug_information [unit].pointer_size
@@ -1947,6 +2017,15 @@ process_debug_info (struct dwarf_section *section,
          printf (_("   Version:       %d\n"), compunit.cu_version);
          printf (_("   Abbrev Offset: %ld\n"), compunit.cu_abbrev_offset);
          printf (_("   Pointer Size:  %d\n"), compunit.cu_pointer_size);
+         if (do_types)
+           {
+             int i;
+             printf (_("   Signature:     "));
+             for (i = 0; i < 8; i++)
+               printf ("%02x", signature[i]);
+             printf ("\n");
+             printf (_("   Type Offset:   0x%lx\n"), type_offset);
+           }
        }
 
       if (cu_offset + compunit.cu_length + initial_length_size
@@ -2094,7 +2173,8 @@ process_debug_info (struct dwarf_section *section,
   /* Set num_debug_info_entries here so that it can be used to check if
      we need to process .debug_loc and .debug_ranges sections.  */
   if ((do_loc || do_debug_loc || do_debug_ranges)
-      && num_debug_info_entries == 0)
+      && num_debug_info_entries == 0
+      && ! do_types)
     num_debug_info_entries = num_units;
 
   if (!do_loc)
@@ -2129,7 +2209,7 @@ load_debug_info (void * file)
     return num_debug_info_entries;
 
   if (load_debug_section (info, file)
-      && process_debug_info (&debug_displays [info].section, file, 1))
+      && process_debug_info (&debug_displays [info].section, file, 1, 0))
     return num_debug_info_entries;
 
   num_debug_info_entries = DEBUG_INFO_UNAVAILABLE;
@@ -2148,7 +2228,7 @@ display_debug_lines_raw (struct dwarf_section *section,
 
   while (data < end)
     {
-      DWARF2_Internal_LineInfo info;
+      DWARF2_Internal_LineInfo linfo;
       unsigned char *standard_opcodes;
       unsigned char *end_of_sequence;
       unsigned char *hdrptr;
@@ -2161,13 +2241,13 @@ display_debug_lines_raw (struct dwarf_section *section,
       hdroff = hdrptr - start;
 
       /* Check the length of the block.  */
-      info.li_length = byte_get (hdrptr, 4);
+      linfo.li_length = byte_get (hdrptr, 4);
       hdrptr += 4;
 
-      if (info.li_length == 0xffffffff)
+      if (linfo.li_length == 0xffffffff)
        {
          /* This section is 64-bit DWARF 3.  */
-         info.li_length = byte_get (hdrptr, 8);
+         linfo.li_length = byte_get (hdrptr, 8);
          hdrptr += 8;
          offset_size = 8;
          initial_length_size = 12;
@@ -2178,7 +2258,7 @@ display_debug_lines_raw (struct dwarf_section *section,
          initial_length_size = 4;
        }
 
-      if (info.li_length + initial_length_size > section->size)
+      if (linfo.li_length + initial_length_size > section->size)
        {
          warn
            (_("The information in section %s appears to be corrupt - the section is too small\n"),
@@ -2187,55 +2267,55 @@ display_debug_lines_raw (struct dwarf_section *section,
        }
 
       /* Check its version number.  */
-      info.li_version = byte_get (hdrptr, 2);
+      linfo.li_version = byte_get (hdrptr, 2);
       hdrptr += 2;
-      if (info.li_version != 2 && info.li_version != 3)
+      if (linfo.li_version != 2 && linfo.li_version != 3)
        {
          warn (_("Only DWARF version 2 and 3 line info is currently supported.\n"));
          return 0;
        }
 
-      info.li_prologue_length = byte_get (hdrptr, offset_size);
+      linfo.li_prologue_length = byte_get (hdrptr, offset_size);
       hdrptr += offset_size;
-      info.li_min_insn_length = byte_get (hdrptr, 1);
+      linfo.li_min_insn_length = byte_get (hdrptr, 1);
       hdrptr++;
-      info.li_default_is_stmt = byte_get (hdrptr, 1);
+      linfo.li_default_is_stmt = byte_get (hdrptr, 1);
       hdrptr++;
-      info.li_line_base = byte_get (hdrptr, 1);
+      linfo.li_line_base = byte_get (hdrptr, 1);
       hdrptr++;
-      info.li_line_range = byte_get (hdrptr, 1);
+      linfo.li_line_range = byte_get (hdrptr, 1);
       hdrptr++;
-      info.li_opcode_base = byte_get (hdrptr, 1);
+      linfo.li_opcode_base = byte_get (hdrptr, 1);
       hdrptr++;
 
       /* Sign extend the line base field.  */
-      info.li_line_base <<= 24;
-      info.li_line_base >>= 24;
+      linfo.li_line_base <<= 24;
+      linfo.li_line_base >>= 24;
 
       printf (_("  Offset:                      0x%lx\n"), hdroff);
-      printf (_("  Length:                      %ld\n"), info.li_length);
-      printf (_("  DWARF Version:               %d\n"), info.li_version);
-      printf (_("  Prologue Length:             %d\n"), info.li_prologue_length);
-      printf (_("  Minimum Instruction Length:  %d\n"), info.li_min_insn_length);
-      printf (_("  Initial value of 'is_stmt':  %d\n"), info.li_default_is_stmt);
-      printf (_("  Line Base:                   %d\n"), info.li_line_base);
-      printf (_("  Line Range:                  %d\n"), info.li_line_range);
-      printf (_("  Opcode Base:                 %d\n"), info.li_opcode_base);
+      printf (_("  Length:                      %ld\n"), linfo.li_length);
+      printf (_("  DWARF Version:               %d\n"), linfo.li_version);
+      printf (_("  Prologue Length:             %d\n"), linfo.li_prologue_length);
+      printf (_("  Minimum Instruction Length:  %d\n"), linfo.li_min_insn_length);
+      printf (_("  Initial value of 'is_stmt':  %d\n"), linfo.li_default_is_stmt);
+      printf (_("  Line Base:                   %d\n"), linfo.li_line_base);
+      printf (_("  Line Range:                  %d\n"), linfo.li_line_range);
+      printf (_("  Opcode Base:                 %d\n"), linfo.li_opcode_base);
 
-      end_of_sequence = data + info.li_length + initial_length_size;
+      end_of_sequence = data + linfo.li_length + initial_length_size;
 
-      reset_state_machine (info.li_default_is_stmt);
+      reset_state_machine (linfo.li_default_is_stmt);
 
       /* Display the contents of the Opcodes table.  */
       standard_opcodes = hdrptr;
 
       printf (_("\n Opcodes:\n"));
 
-      for (i = 1; i < info.li_opcode_base; i++)
+      for (i = 1; i < linfo.li_opcode_base; i++)
        printf (_("  Opcode %d has %d args\n"), i, standard_opcodes[i - 1]);
 
       /* Display the contents of the Directory table.  */
-      data = standard_opcodes + info.li_opcode_base - 1;
+      data = standard_opcodes + linfo.li_opcode_base - 1;
 
       if (*data == 0)
        printf (_("\n The Directory Table is empty.\n"));
@@ -2297,14 +2377,14 @@ display_debug_lines_raw (struct dwarf_section *section,
 
          op_code = *data++;
 
-         if (op_code >= info.li_opcode_base)
+         if (op_code >= linfo.li_opcode_base)
            {
-             op_code -= info.li_opcode_base;
-             uladv = (op_code / info.li_line_range) * info.li_min_insn_length;
+             op_code -= linfo.li_opcode_base;
+             uladv = (op_code / linfo.li_line_range) * linfo.li_min_insn_length;
              state_machine_regs.address += uladv;
              printf (_("  Special opcode %d: advance Address by %lu to 0x%lx"),
                      op_code, uladv, state_machine_regs.address);
-             adv = (op_code % info.li_line_range) + info.li_line_base;
+             adv = (op_code % linfo.li_line_range) + linfo.li_line_base;
              state_machine_regs.line += adv;
              printf (_(" and Line by %d to %d\n"),
                      adv, state_machine_regs.line);
@@ -2312,7 +2392,7 @@ display_debug_lines_raw (struct dwarf_section *section,
          else switch (op_code)
            {
            case DW_LNS_extended_op:
-             data += process_extended_line_op (data, info.li_default_is_stmt);
+             data += process_extended_line_op (data, linfo.li_default_is_stmt);
              break;
 
            case DW_LNS_copy:
@@ -2321,7 +2401,7 @@ display_debug_lines_raw (struct dwarf_section *section,
 
            case DW_LNS_advance_pc:
              uladv = read_leb128 (data, & bytes_read, 0);
-             uladv *= info.li_min_insn_length;
+             uladv *= linfo.li_min_insn_length;
              data += bytes_read;
              state_machine_regs.address += uladv;
              printf (_("  Advance PC by %lu to 0x%lx\n"), uladv,
@@ -2364,8 +2444,8 @@ display_debug_lines_raw (struct dwarf_section *section,
              break;
 
            case DW_LNS_const_add_pc:
-             uladv = (((255 - info.li_opcode_base) / info.li_line_range)
-                     * info.li_min_insn_length);
+             uladv = (((255 - linfo.li_opcode_base) / linfo.li_line_range)
+                     * linfo.li_min_insn_length);
              state_machine_regs.address += uladv;
              printf (_("  Advance PC by constant %lu to 0x%lx\n"), uladv,
                      state_machine_regs.address);
@@ -2433,7 +2513,7 @@ display_debug_lines_decoded (struct dwarf_section *section,
   while (data < end)
     {
       /* This loop amounts to one iteration per compilation unit.  */
-      DWARF2_Internal_LineInfo info;
+      DWARF2_Internal_LineInfo linfo;
       unsigned char *standard_opcodes;
       unsigned char *end_of_sequence;
       unsigned char *hdrptr;
@@ -2450,13 +2530,13 @@ display_debug_lines_decoded (struct dwarf_section *section,
         (section 6.2.4 in the Dwarf3 doc).  */
 
       /* Get the length of this CU's line number information block.  */
-      info.li_length = byte_get (hdrptr, 4);
+      linfo.li_length = byte_get (hdrptr, 4);
       hdrptr += 4;
 
-      if (info.li_length == 0xffffffff)
+      if (linfo.li_length == 0xffffffff)
         {
           /* This section is 64-bit DWARF 3.  */
-          info.li_length = byte_get (hdrptr, 8);
+          linfo.li_length = byte_get (hdrptr, 8);
           hdrptr += 8;
           offset_size = 8;
           initial_length_size = 12;
@@ -2467,7 +2547,7 @@ display_debug_lines_decoded (struct dwarf_section *section,
           initial_length_size = 4;
         }
 
-      if (info.li_length + initial_length_size > section->size)
+      if (linfo.li_length + initial_length_size > section->size)
         {
           warn (_("The line info appears to be corrupt - "
                   "the section is too small\n"));
@@ -2475,47 +2555,46 @@ display_debug_lines_decoded (struct dwarf_section *section,
         }
 
       /* Get this CU's Line Number Block version number.  */
-      info.li_version = byte_get (hdrptr, 2);
+      linfo.li_version = byte_get (hdrptr, 2);
       hdrptr += 2;
-      if (info.li_version != 2 && info.li_version != 3)
+      if (linfo.li_version != 2 && linfo.li_version != 3)
         {
           warn (_("Only DWARF version 2 and 3 line info is currently "
                 "supported.\n"));
           return 0;
         }
 
-      info.li_prologue_length = byte_get (hdrptr, offset_size);
+      linfo.li_prologue_length = byte_get (hdrptr, offset_size);
       hdrptr += offset_size;
-      info.li_min_insn_length = byte_get (hdrptr, 1);
+      linfo.li_min_insn_length = byte_get (hdrptr, 1);
       hdrptr++;
-      info.li_default_is_stmt = byte_get (hdrptr, 1);
+      linfo.li_default_is_stmt = byte_get (hdrptr, 1);
       hdrptr++;
-      info.li_line_base = byte_get (hdrptr, 1);
+      linfo.li_line_base = byte_get (hdrptr, 1);
       hdrptr++;
-      info.li_line_range = byte_get (hdrptr, 1);
+      linfo.li_line_range = byte_get (hdrptr, 1);
       hdrptr++;
-      info.li_opcode_base = byte_get (hdrptr, 1);
+      linfo.li_opcode_base = byte_get (hdrptr, 1);
       hdrptr++;
 
       /* Sign extend the line base field.  */
-      info.li_line_base <<= 24;
-      info.li_line_base >>= 24;
+      linfo.li_line_base <<= 24;
+      linfo.li_line_base >>= 24;
 
       /* Find the end of this CU's Line Number Information Block.  */
-      end_of_sequence = data + info.li_length + initial_length_size;
+      end_of_sequence = data + linfo.li_length + initial_length_size;
 
-      reset_state_machine (info.li_default_is_stmt);
+      reset_state_machine (linfo.li_default_is_stmt);
 
       /* Save a pointer to the contents of the Opcodes table.  */
       standard_opcodes = hdrptr;
 
       /* Traverse the Directory table just to count entries.  */
-      data = standard_opcodes + info.li_opcode_base - 1;
+      data = standard_opcodes + linfo.li_opcode_base - 1;
       if (*data != 0)
         {
           unsigned int n_directories = 0;
           unsigned char *ptr_directory_table = data;
-          int i;
 
          while (*data != 0)
            {
@@ -2543,7 +2622,6 @@ display_debug_lines_decoded (struct dwarf_section *section,
         {
           unsigned int n_files = 0;
           unsigned char *ptr_file_name_table = data;
-          int i;
 
           while (*data != 0)
             {
@@ -2622,13 +2700,13 @@ display_debug_lines_decoded (struct dwarf_section *section,
           op_code = *data++;
           prev_line = state_machine_regs.line;
 
-          if (op_code >= info.li_opcode_base)
+          if (op_code >= linfo.li_opcode_base)
            {
-             op_code -= info.li_opcode_base;
-              uladv = (op_code / info.li_line_range) * info.li_min_insn_length;
+             op_code -= linfo.li_opcode_base;
+              uladv = (op_code / linfo.li_line_range) * linfo.li_min_insn_length;
               state_machine_regs.address += uladv;
 
-              adv = (op_code % info.li_line_range) + info.li_line_base;
+              adv = (op_code % linfo.li_line_range) + linfo.li_line_base;
               state_machine_regs.line += adv;
               is_special_opcode = 1;
             }
@@ -2637,7 +2715,6 @@ display_debug_lines_decoded (struct dwarf_section *section,
             case DW_LNS_extended_op:
               {
                 unsigned int ext_op_code_len;
-                unsigned int bytes_read;
                 unsigned char ext_op_code;
                 unsigned char *op_code_data = data;
 
@@ -2655,7 +2732,7 @@ display_debug_lines_decoded (struct dwarf_section *section,
                 switch (ext_op_code)
                   {
                   case DW_LNE_end_sequence:
-                    reset_state_machine (info.li_default_is_stmt);
+                    reset_state_machine (linfo.li_default_is_stmt);
                     break;
                   case DW_LNE_set_address:
                     state_machine_regs.address =
@@ -2688,7 +2765,7 @@ display_debug_lines_decoded (struct dwarf_section *section,
 
             case DW_LNS_advance_pc:
               uladv = read_leb128 (data, & bytes_read, 0);
-              uladv *= info.li_min_insn_length;
+              uladv *= linfo.li_min_insn_length;
               data += bytes_read;
               state_machine_regs.address += uladv;
               break;
@@ -2735,8 +2812,8 @@ display_debug_lines_decoded (struct dwarf_section *section,
               break;
 
             case DW_LNS_const_add_pc:
-              uladv = (((255 - info.li_opcode_base) / info.li_line_range)
-                       * info.li_min_insn_length);
+              uladv = (((255 - linfo.li_opcode_base) / linfo.li_line_range)
+                       * linfo.li_min_insn_length);
               state_machine_regs.address += uladv;
               break;
 
@@ -2871,7 +2948,7 @@ static int
 display_debug_pubnames (struct dwarf_section *section,
                        void *file ATTRIBUTE_UNUSED)
 {
-  DWARF2_Internal_PubNames pubnames;
+  DWARF2_Internal_PubNames names;
   unsigned char *start = section->start;
   unsigned char *end = start + section->size;
 
@@ -2889,11 +2966,11 @@ display_debug_pubnames (struct dwarf_section *section,
 
       data = start;
 
-      pubnames.pn_length = byte_get (data, 4);
+      names.pn_length = byte_get (data, 4);
       data += 4;
-      if (pubnames.pn_length == 0xffffffff)
+      if (names.pn_length == 0xffffffff)
        {
-         pubnames.pn_length = byte_get (data, 8);
+         names.pn_length = byte_get (data, 8);
          data += 8;
          offset_size = 8;
          initial_length_size = 12;
@@ -2904,24 +2981,24 @@ display_debug_pubnames (struct dwarf_section *section,
          initial_length_size = 4;
        }
 
-      pubnames.pn_version = byte_get (data, 2);
+      names.pn_version = byte_get (data, 2);
       data += 2;
 
-      pubnames.pn_offset = byte_get (data, offset_size);
+      names.pn_offset = byte_get (data, offset_size);
       data += offset_size;
 
       if (num_debug_info_entries != DEBUG_INFO_UNAVAILABLE
          && num_debug_info_entries > 0
-         && find_debug_info_for_offset (pubnames.pn_offset) == NULL)
+         && find_debug_info_for_offset (names.pn_offset) == NULL)
        warn (_(".debug_info offset of 0x%lx in %s section does not point to a CU header.\n"),
-             pubnames.pn_offset, section->name);
+             names.pn_offset, section->name);
 
-      pubnames.pn_size = byte_get (data, offset_size);
+      names.pn_size = byte_get (data, offset_size);
       data += offset_size;
 
-      start += pubnames.pn_length + initial_length_size;
+      start += names.pn_length + initial_length_size;
 
-      if (pubnames.pn_version != 2 && pubnames.pn_version != 3)
+      if (names.pn_version != 2 && names.pn_version != 3)
        {
          static int warned = 0;
 
@@ -2935,13 +3012,13 @@ display_debug_pubnames (struct dwarf_section *section,
        }
 
       printf (_("  Length:                              %ld\n"),
-             pubnames.pn_length);
+             names.pn_length);
       printf (_("  Version:                             %d\n"),
-             pubnames.pn_version);
+             names.pn_version);
       printf (_("  Offset into .debug_info section:     0x%lx\n"),
-             pubnames.pn_offset);
+             names.pn_offset);
       printf (_("  Size of area in .debug_info section: %ld\n"),
-             pubnames.pn_size);
+             names.pn_size);
 
       printf (_("\n    Offset\tName\n"));
 
@@ -3360,9 +3437,14 @@ display_debug_str (struct dwarf_section *section,
 static int
 display_debug_info (struct dwarf_section *section, void *file)
 {
-  return process_debug_info (section, file, 0);
+  return process_debug_info (section, file, 0, 0);
 }
 
+static int
+display_debug_types (struct dwarf_section *section, void *file)
+{
+  return process_debug_info (section, file, 0, 1);
+}
 
 static int
 display_debug_aranges (struct dwarf_section *section,
@@ -3381,7 +3463,7 @@ display_debug_aranges (struct dwarf_section *section,
     {
       unsigned char *hdrptr;
       DWARF2_Internal_ARange arange;
-      unsigned char *ranges;
+      unsigned char *addr_ranges;
       dwarf_vma length;
       dwarf_vma address;
       unsigned char address_size;
@@ -3453,24 +3535,24 @@ display_debug_aranges (struct dwarf_section *section,
       else
        printf (_("\n    Address    Length\n"));
 
-      ranges = hdrptr;
+      addr_ranges = hdrptr;
 
       /* Must pad to an alignment boundary that is twice the address size.  */
       excess = (hdrptr - start) % (2 * address_size);
       if (excess)
-       ranges += (2 * address_size) - excess;
+       addr_ranges += (2 * address_size) - excess;
 
       start += arange.ar_length + initial_length_size;
 
-      while (ranges + 2 * address_size <= start)
+      while (addr_ranges + 2 * address_size <= start)
        {
-         address = byte_get (ranges, address_size);
+         address = byte_get (addr_ranges, address_size);
 
-         ranges += address_size;
+         addr_ranges += address_size;
 
-         length  = byte_get (ranges, address_size);
+         length  = byte_get (addr_ranges, address_size);
 
-         ranges += address_size;
+         addr_ranges += address_size;
 
          printf ("    ");
          print_dwarf_vma (address, address_size);
@@ -3797,11 +3879,11 @@ frame_display_row (Frame_Chunk *fc, int *need_col_headers, int *max_regs)
 
   if (*need_col_headers)
     {
-      static const char *loc = "   LOC";
+      static const char *sloc = "   LOC";
 
       *need_col_headers = 0;
 
-      printf ("%-*s CFA      ", eh_addr_size * 2, loc);
+      printf ("%-*s CFA      ", eh_addr_size * 2, sloc);
 
       for (r = 0; r < *max_regs; r++)
        if (fc->col_type[r] != DW_CFA_unreferenced)
@@ -4032,6 +4114,8 @@ display_debug_frames (struct dwarf_section *section,
                    q += 1 + size_of_encoded_value (*q);
                  else if (*p == 'R')
                    fc->fde_encoding = *q++;
+                 else if (*p == 'S')
+                   ;
                  else
                    break;
                  p++;
@@ -4135,7 +4219,7 @@ display_debug_frames (struct dwarf_section *section,
          while (start < block_end)
            {
              unsigned op, opa;
-             unsigned long reg, tmp;
+             unsigned long reg, temp;
 
              op = *start++;
              opa = op & 0x3f;
@@ -4206,14 +4290,14 @@ display_debug_frames (struct dwarf_section *section,
                  LEB ();
                  break;
                case DW_CFA_def_cfa_expression:
-                 tmp = LEB ();
-                 start += tmp;
+                 temp = LEB ();
+                 start += temp;
                  break;
                case DW_CFA_expression:
                case DW_CFA_val_expression:
                  reg = LEB ();
-                 tmp = LEB ();
-                 start += tmp;
+                 temp = LEB ();
+                 start += temp;
                  if (frame_need_space (fc, reg) >= 0)
                    fc->col_type[reg] = DW_CFA_undefined;
                  break;
@@ -4766,7 +4850,7 @@ dwarf_select_sections_by_names (const char *names)
   {
     const char * option;
     int *        variable;
-    int val;
+    int          val;
   }
   debug_dump_long_opts;
 
@@ -4785,6 +4869,7 @@ dwarf_select_sections_by_names (const char *names)
       { "loc",  & do_debug_loc, 1 },
       { "macro", & do_debug_macinfo, 1 },
       { "pubnames", & do_debug_pubnames, 1 },
+      { "pubtypes", & do_debug_pubtypes, 1 },
       /* This entry is for compatability
         with earlier versions of readelf.  */
       { "ranges", & do_debug_aranges, 1 },
@@ -4834,10 +4919,10 @@ dwarf_select_sections_by_names (const char *names)
 void
 dwarf_select_sections_by_letters (const char *letters)
 {
-  unsigned int index = 0;
+  unsigned int lindex = 0;
 
-  while (letters[index])
-    switch (letters[index++])
+  while (letters[lindex])
+    switch (letters[lindex++])
       {
       case 'i':
        do_debug_info = 1;
@@ -4859,6 +4944,10 @@ dwarf_select_sections_by_letters (const char *letters)
        do_debug_pubnames = 1;
        break;
        
+      case 't':
+       do_debug_pubtypes = 1;
+       break;
+       
       case 'r':
        do_debug_aranges = 1;
        break;
@@ -4898,6 +4987,7 @@ dwarf_select_sections_all (void)
   do_debug_abbrevs = 1;
   do_debug_lines = FLAG_DEBUG_LINES_RAW;
   do_debug_pubnames = 1;
+  do_debug_pubtypes = 1;
   do_debug_aranges = 1;
   do_debug_ranges = 1;
   do_debug_frames = 1;
@@ -4929,7 +5019,7 @@ struct dwarf_section_display debug_displays[] =
   { { ".debug_loc",            ".zdebug_loc",          NULL,   NULL,   0,      0 },
     display_debug_loc,                 &do_debug_loc,          1 },
   { { ".debug_pubtypes",       ".zdebug_pubtypes",     NULL,   NULL,   0,      0 },
-    display_debug_pubnames,            &do_debug_pubnames,     0 },
+    display_debug_pubnames,            &do_debug_pubtypes,     0 },
   { { ".debug_ranges",         ".zdebug_ranges",       NULL,   NULL,   0,      0 },
     display_debug_ranges,              &do_debug_ranges,       1 },
   { { ".debug_static_func",    ".zdebug_static_func",  NULL,   NULL,   0,      0 },
@@ -4937,7 +5027,7 @@ struct dwarf_section_display debug_displays[] =
   { { ".debug_static_vars",    ".zdebug_static_vars",  NULL,   NULL,   0,      0 },
     display_debug_not_supported,       NULL,                   0 },
   { { ".debug_types",          ".zdebug_types",        NULL,   NULL,   0,      0 },
-    display_debug_not_supported,       NULL,                   0 },
+    display_debug_types,               &do_debug_info,         1 },
   { { ".debug_weaknames",      ".zdebug_weaknames",    NULL,   NULL,   0,      0 },
     display_debug_not_supported,       NULL,                   0 }
 };
This page took 0.039016 seconds and 4 git commands to generate.