Add -Wshadow to the gcc command line options used when compiling the binutils.
[deliverable/binutils-gdb.git] / binutils / dwarf.c
index 5a42d798e777b332fa04c193d42c37fc59f85fca..eb6c2d70905731f09a2f21efdc46cf9e857a43ea 100644 (file)
@@ -1,5 +1,5 @@
 /* dwarf.c -- display DWARF contents of a BFD binary file
-   Copyright 2005, 2006, 2007, 2008
+   Copyright 2005, 2006, 2007, 2008, 2009
    Free Software Foundation, Inc.
 
    This file is part of GNU Binutils.
@@ -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;
@@ -72,6 +73,11 @@ byte_get_little_endian (unsigned char *field, int size)
       return  ((unsigned int) (field[0]))
        |    (((unsigned int) (field[1])) << 8);
 
+    case 3:
+      return  ((unsigned long) (field[0]))
+       |    (((unsigned long) (field[1])) << 8)
+       |    (((unsigned long) (field[2])) << 16);
+
     case 4:
       return  ((unsigned long) (field[0]))
        |    (((unsigned long) (field[1])) << 8)
@@ -114,6 +120,11 @@ byte_get_big_endian (unsigned char *field, int size)
     case 2:
       return ((unsigned int) (field[1])) | (((int) (field[0])) << 8);
 
+    case 3:
+      return ((unsigned long) (field[2]))
+       |   (((unsigned long) (field[1])) << 8)
+       |   (((unsigned long) (field[0])) << 16);
+
     case 4:
       return ((unsigned long) (field[3]))
        |   (((unsigned long) (field[2])) << 8)
@@ -427,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;
@@ -454,7 +465,7 @@ add_abbrev (unsigned long number, unsigned long tag, int children)
 {
   abbrev_entry *entry;
 
-  entry = malloc (sizeof (*entry));
+  entry = (abbrev_entry *) malloc (sizeof (*entry));
 
   if (entry == NULL)
     /* ugg */
@@ -480,7 +491,7 @@ add_abbrev_attr (unsigned long attribute, unsigned long form)
 {
   abbrev_attr *attr;
 
-  attr = malloc (sizeof (*attr));
+  attr = (abbrev_attr *) malloc (sizeof (*attr));
 
   if (attr == NULL)
     /* ugg */
@@ -618,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";
@@ -658,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];
@@ -1295,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;
@@ -1318,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;
-                 debug_info_p->loc_offsets
-                   = xcrealloc (debug_info_p->loc_offsets,
-                                max, sizeof (*debug_info_p->loc_offsets));
-                 debug_info_p->have_frame_base
-                   = xcrealloc (debug_info_p->have_frame_base,
-                                max, sizeof (*debug_info_p->have_frame_base));
-                 debug_info_p->max_loc_offsets = max;
+                 lmax += 1024;
+                 debug_info_p->loc_offsets = (long unsigned int *)
+                      xcrealloc (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,
+                                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;
@@ -1347,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;
-                 debug_info_p->range_lists
-                   = xcrealloc (debug_info_p->range_lists,
-                                max, sizeof (*debug_info_p->range_lists));
-                 debug_info_p->max_range_lists = max;
+                 lmax += 1024;
+                 debug_info_p->range_lists = (long unsigned int *)
+                      xcrealloc (debug_info_p->range_lists,
+                                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++;
@@ -1422,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.  */
@@ -1578,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)
@@ -1706,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";
@@ -1738,13 +1787,21 @@ 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";
 
       /* UPC extension.  */
     case DW_AT_upc_threads_scaled:     return "DW_AT_upc_threads_scaled";
@@ -1791,12 +1848,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;
@@ -1805,7 +1864,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;
 
@@ -1848,8 +1908,8 @@ process_debug_info (struct dwarf_section *section,
        }
 
       /* Then allocate an array to hold the information.  */
-      debug_information = cmalloc (num_units,
-                                  sizeof (* debug_information));
+      debug_information = (debug_info *) cmalloc (num_units,
+                                                  sizeof (* debug_information));
       if (debug_information == NULL)
        {
          error (_("Not enough memory for a debug info array of %u entries"),
@@ -1883,6 +1943,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;
 
@@ -1913,8 +1975,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
@@ -1937,6 +2015,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
@@ -1985,9 +2072,22 @@ process_debug_info (struct dwarf_section *section,
          abbrev_number = read_leb128 (tags, & bytes_read, 0);
          tags += bytes_read;
 
-         /* A null DIE marks the end of a list of siblings.  */
+         /* A null DIE marks the end of a list of siblings or it may also be
+            a section padding.  */
          if (abbrev_number == 0)
            {
+             /* Check if it can be a section padding for the last CU.  */
+             if (level == 0 && start == end)
+               {
+                 unsigned char *chk;
+
+                 for (chk = tags; chk < start; chk++)
+                   if (*chk != 0)
+                     break;
+                 if (chk == start)
+                   break;
+               }
+
              --level;
              if (level < 0)
                {
@@ -2071,7 +2171,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)
@@ -2106,7 +2207,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;
@@ -2125,7 +2226,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;
@@ -2138,13 +2239,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;
@@ -2155,7 +2256,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"),
@@ -2164,55 +2265,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"));
@@ -2274,14 +2375,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);
@@ -2289,7 +2390,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:
@@ -2298,7 +2399,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,
@@ -2341,8 +2442,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);
@@ -2410,7 +2511,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;
@@ -2427,13 +2528,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;
@@ -2444,7 +2545,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"));
@@ -2452,47 +2553,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)
            {
@@ -2501,7 +2601,8 @@ display_debug_lines_decoded (struct dwarf_section *section,
            }
 
           /* Go through the directory table again to save the directories.  */
-          directory_table = xmalloc (n_directories * sizeof (unsigned char *));
+          directory_table = (unsigned char **)
+              xmalloc (n_directories * sizeof (unsigned char *));
 
           i = 0;
           while (*ptr_directory_table != 0)
@@ -2519,7 +2620,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)
             {
@@ -2539,7 +2639,7 @@ display_debug_lines_decoded (struct dwarf_section *section,
             }
 
           /* Go through the file table again to save the strings.  */
-          file_table = xmalloc (n_files * sizeof (File_Entry));
+          file_table = (File_Entry *) xmalloc (n_files * sizeof (File_Entry));
 
           i = 0;
           while (*ptr_file_name_table != 0)
@@ -2598,13 +2698,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;
             }
@@ -2613,7 +2713,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;
 
@@ -2631,7 +2730,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 =
@@ -2664,7 +2763,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;
@@ -2711,8 +2810,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;
 
@@ -2759,7 +2858,7 @@ display_debug_lines_decoded (struct dwarf_section *section,
 
               if ((fileNameLength > MAX_FILENAME_LENGTH) && (!do_wide))
                 {
-                  newFileName = xmalloc (MAX_FILENAME_LENGTH + 1);
+                  newFileName = (char *) xmalloc (MAX_FILENAME_LENGTH + 1);
                   /* Truncate file name */
                   strncpy (newFileName,
                            fileName + fileNameLength - MAX_FILENAME_LENGTH,
@@ -2767,7 +2866,7 @@ display_debug_lines_decoded (struct dwarf_section *section,
                 }
               else
                 {
-                  newFileName = xmalloc (fileNameLength + 1);
+                  newFileName = (char *) xmalloc (fileNameLength + 1);
                   strncpy (newFileName, fileName, fileNameLength + 1);
                 }
 
@@ -2813,6 +2912,9 @@ display_debug_lines (struct dwarf_section *section, void *file)
       return 0;
     }
 
+  if (do_debug_lines == 0)
+    do_debug_lines |= FLAG_DEBUG_LINES_RAW;
+
   if (do_debug_lines & FLAG_DEBUG_LINES_RAW)
     retValRaw = display_debug_lines_raw (section, data, end);
 
@@ -2844,7 +2946,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;
 
@@ -2862,11 +2964,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;
@@ -2877,24 +2979,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;
 
@@ -2908,13 +3010,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"));
 
@@ -2953,7 +3055,7 @@ display_debug_macinfo (struct dwarf_section *section,
       unsigned int lineno;
       const char *string;
 
-      op = *curr;
+      op = (enum dwarf_macinfo_record_type) *curr;
       curr++;
 
       switch (op)
@@ -3333,9 +3435,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,
@@ -3354,7 +3461,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;
@@ -3426,24 +3533,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);
@@ -3474,8 +3581,8 @@ struct range_entry
 static int
 range_entry_compar (const void *ap, const void *bp)
 {
-  const struct range_entry *a_re = ap;
-  const struct range_entry *b_re = bp;
+  const struct range_entry *a_re = (const struct range_entry *) ap;
+  const struct range_entry *b_re = (const struct range_entry *) bp;
   const unsigned long a = a_re->ranges_offset;
   const unsigned long b = b_re->ranges_offset;
 
@@ -3516,7 +3623,8 @@ display_debug_ranges (struct dwarf_section *section,
   if (num_range_list == 0)
     error (_("No range lists in .debug_info section!\n"));
 
-  range_entries = xmalloc (sizeof (*range_entries) * num_range_list);
+  range_entries = (struct range_entry *)
+      xmalloc (sizeof (*range_entries) * num_range_list);
   range_entry_fill = range_entries;
 
   for (i = 0; i < num_debug_info_entries; i++)
@@ -3667,8 +3775,9 @@ frame_need_space (Frame_Chunk *fc, unsigned int reg)
     return -1;
 
   fc->ncols = reg + 1;
-  fc->col_type = xcrealloc (fc->col_type, fc->ncols, sizeof (short int));
-  fc->col_offset = xcrealloc (fc->col_offset, fc->ncols, sizeof (int));
+  fc->col_type = (short int *) xcrealloc (fc->col_type, fc->ncols,
+                                          sizeof (short int));
+  fc->col_offset = (int *) xcrealloc (fc->col_offset, fc->ncols, sizeof (int));
 
   while (prev < fc->ncols)
     {
@@ -3768,11 +3877,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)
@@ -3902,15 +4011,15 @@ display_debug_frames (struct dwarf_section *section,
        {
          int version;
 
-         fc = xmalloc (sizeof (Frame_Chunk));
+         fc = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
          memset (fc, 0, sizeof (Frame_Chunk));
 
          fc->next = chunks;
          chunks = fc;
          fc->chunk_start = saved_start;
          fc->ncols = 0;
-         fc->col_type = xmalloc (sizeof (short int));
-         fc->col_offset = xmalloc (sizeof (int));
+         fc->col_type = (short int *) xmalloc (sizeof (short int));
+         fc->col_offset = (int *) xmalloc (sizeof (int));
          frame_need_space (fc, max_regs - 1);
 
          version = *start++;
@@ -4033,8 +4142,8 @@ display_debug_frames (struct dwarf_section *section,
              warn ("Invalid CIE pointer %#08lx in FDE at %#08lx\n",
                    cie_id, (unsigned long)(saved_start - section_start));
              fc->ncols = 0;
-             fc->col_type = xmalloc (sizeof (short int));
-             fc->col_offset = xmalloc (sizeof (int));
+             fc->col_type = (short int *) xmalloc (sizeof (short int));
+             fc->col_offset = (int *) xmalloc (sizeof (int));
              frame_need_space (fc, max_regs - 1);
              cie = fc;
              fc->augmentation = "";
@@ -4043,8 +4152,8 @@ display_debug_frames (struct dwarf_section *section,
          else
            {
              fc->ncols = cie->ncols;
-             fc->col_type = xcmalloc (fc->ncols, sizeof (short int));
-             fc->col_offset = xcmalloc (fc->ncols, sizeof (int));
+             fc->col_type = (short int *) xcmalloc (fc->ncols, sizeof (short int));
+             fc->col_offset =  (int *) xcmalloc (fc->ncols, sizeof (int));
              memcpy (fc->col_type, cie->col_type, fc->ncols * sizeof (short int));
              memcpy (fc->col_offset, cie->col_offset, fc->ncols * sizeof (int));
              fc->augmentation = cie->augmentation;
@@ -4106,7 +4215,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;
@@ -4177,14 +4286,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;
@@ -4418,10 +4527,11 @@ display_debug_frames (struct dwarf_section *section,
            case DW_CFA_remember_state:
              if (! do_debug_frames_interp)
                printf ("  DW_CFA_remember_state\n");
-             rs = xmalloc (sizeof (Frame_Chunk));
+             rs = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
              rs->ncols = fc->ncols;
-             rs->col_type = xcmalloc (rs->ncols, sizeof (short int));
-             rs->col_offset = xcmalloc (rs->ncols, sizeof (int));
+             rs->col_type = (short int *) xcmalloc (rs->ncols,
+                                                     sizeof (short int));
+             rs->col_offset = (int *) xcmalloc (rs->ncols, sizeof (int));
              memcpy (rs->col_type, fc->col_type, rs->ncols);
              memcpy (rs->col_offset, fc->col_offset, rs->ncols * sizeof (int));
              rs->next = remembered_state;
@@ -4700,12 +4810,12 @@ warn (const char *message, ...)
 void
 free_debug_memory (void)
 {
-  enum dwarf_section_display_enum i;
+  unsigned int i;
 
   free_abbrevs ();
 
   for (i = 0; i < max; i++)
-    free_debug_section (i);
+    free_debug_section ((enum dwarf_section_display_enum) i);
 
   if (debug_information != NULL)
     {
@@ -4736,7 +4846,7 @@ dwarf_select_sections_by_names (const char *names)
   {
     const char * option;
     int *        variable;
-    int val;
+    int          val;
   }
   debug_dump_long_opts;
 
@@ -4755,6 +4865,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 },
@@ -4804,10 +4915,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;
@@ -4829,6 +4940,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;
@@ -4868,6 +4983,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;
@@ -4899,7 +5015,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 },
@@ -4907,7 +5023,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.041096 seconds and 4 git commands to generate.