include/coff
[binutils-gdb.git] / bfd / dwarf2.c
index 6983a1c349ed0901519a6b94ea147ea0e66af826..02e69a8672887426d4414e911b11cfb683f268e3 100644 (file)
@@ -275,6 +275,60 @@ struct attr_abbrev
   enum dwarf_form form;
 };
 
+/* Map of uncompressed DWARF debug section name to compressed one.  It
+   is terminated by NULL uncompressed_name.  */
+
+const struct dwarf_debug_section dwarf_debug_sections[] =
+{
+  { ".debug_abbrev",           ".zdebug_abbrev" },
+  { ".debug_aranges",          ".zdebug_aranges" },
+  { ".debug_frame",            ".zdebug_frame" },
+  { ".debug_info",             ".zdebug_info" },
+  { ".debug_line",             ".zdebug_line" },
+  { ".debug_loc",              ".zdebug_loc" },
+  { ".debug_macinfo",          ".zdebug_macinfo" },
+  { ".debug_pubnames",         ".zdebug_pubnames" },
+  { ".debug_pubtypes",         ".zdebug_pubtypes" },
+  { ".debug_ranges",           ".zdebug_ranges" },
+  { ".debug_static_func",      ".zdebug_static_func" },
+  { ".debug_static_vars",      ".zdebug_static_vars" },
+  { ".debug_str",              ".zdebug_str", },
+  { ".debug_types",            ".zdebug_types" },
+  /* GNU DWARF 1 extensions */
+  { ".debug_sfnames",          ".zdebug_sfnames" },
+  { ".debug_srcinfo",          ".zebug_srcinfo" },
+  /* SGI/MIPS DWARF 2 extensions */
+  { ".debug_funcnames",                ".zdebug_funcnames" },
+  { ".debug_typenames",                ".zdebug_typenames" },
+  { ".debug_varnames",         ".zdebug_varnames" },
+  { ".debug_weaknames",                ".zdebug_weaknames" },
+  { NULL,                      NULL },
+};
+
+enum dwarf_debug_section_enum
+{
+  debug_abbrev = 0,
+  debug_aranges,
+  debug_frame,
+  debug_info,
+  debug_line,
+  debug_loc,
+  debug_macinfo,
+  debug_pubnames,
+  debug_pubtypes,
+  debug_ranges,
+  debug_static_func,
+  debug_static_vars,
+  debug_str,
+  debug_types,
+  debug_sfnames,
+  debug_srcinfo,
+  debug_funcnames,
+  debug_typenames,
+  debug_varnames,
+  debug_weaknames
+};
+
 #ifndef ABBREV_HASH_SIZE
 #define ABBREV_HASH_SIZE 121
 #endif
@@ -405,54 +459,6 @@ lookup_info_hash_table (struct info_hash_table *hash_table, const char *key)
   return entry ? entry->head : NULL;
 }
 
-/* Read a section, uncompress it if necessary, and relocate it.  */
-
-static bfd_boolean
-read_and_uncompress_section (bfd *           abfd,
-                            asection *      msec,
-                            bfd_boolean     section_is_compressed,
-                            asymbol **      syms,
-                            bfd_byte **     section_buffer,
-                            bfd_size_type * section_size)
-{
-  /* Get the unrelocated contents of the section.  */
-  *section_buffer = (bfd_byte *) bfd_malloc (*section_size);
-  if (! *section_buffer)
-    return FALSE;
-  if (! bfd_get_section_contents (abfd, msec, *section_buffer,
-                                 0, *section_size))
-    return FALSE;
-
-  if (section_is_compressed)
-    {
-      if (! bfd_uncompress_section_contents (section_buffer, section_size))
-       {
-         (*_bfd_error_handler) (_("Dwarf Error: unable to decompress %s section."),
-                                bfd_get_section_name (abfd, msec));
-         bfd_set_error (bfd_error_bad_value);
-         return FALSE;
-       }
-    }
-
-  if (syms)
-    {
-      /* We want to relocate the data we've already read (and
-        decompressed), so we store a pointer to the data in
-        the bfd_section, and tell it that the contents are
-        already in memory.  */
-      BFD_ASSERT (msec->contents == NULL && (msec->flags & SEC_IN_MEMORY) == 0);
-      msec->contents = *section_buffer;
-      msec->flags |= SEC_IN_MEMORY;
-      msec->size = *section_size;
-      *section_buffer
-         = bfd_simple_get_relocated_section_contents (abfd, msec, NULL, syms);
-      if (! *section_buffer)
-       return FALSE;
-    }
-
-  return TRUE;
-}
-
 /* Read a section into its appropriate place in the dwarf2_debug
    struct (indicated by SECTION_BUFFER and SECTION_SIZE).  If SYMS is
    not NULL, use bfd_simple_get_relocated_section_contents to read the
@@ -461,24 +467,23 @@ read_and_uncompress_section (bfd *           abfd,
 
 static bfd_boolean
 read_section (bfd *           abfd,
-             const char *    section_name,
-             const char *    compressed_section_name,
+             enum dwarf_debug_section_enum sec,
              asymbol **      syms,
              bfd_uint64_t    offset,
              bfd_byte **     section_buffer,
              bfd_size_type * section_size)
 {
   asection *msec;
-  bfd_boolean section_is_compressed = FALSE;
+  const char *section_name = dwarf_debug_sections[sec].uncompressed_name;
 
   /* read_section is a noop if the section has already been read.  */
   if (!*section_buffer)
     {
       msec = bfd_get_section_by_name (abfd, section_name);
-      if (! msec && compressed_section_name)
+      if (! msec)
        {
-         msec = bfd_get_section_by_name (abfd, compressed_section_name);
-         section_is_compressed = TRUE;
+         section_name = dwarf_debug_sections[sec].compressed_name;
+         msec = bfd_get_section_by_name (abfd, section_name);
        }
       if (! msec)
        {
@@ -488,10 +493,22 @@ read_section (bfd *           abfd,
        }
 
       *section_size = msec->rawsize ? msec->rawsize : msec->size;
-
-      if (! read_and_uncompress_section (abfd, msec, section_is_compressed,
-                                        syms, section_buffer, section_size))
-       return FALSE;
+      if (syms)
+       {
+         *section_buffer
+             = bfd_simple_get_relocated_section_contents (abfd, msec, NULL, syms);
+         if (! *section_buffer)
+           return FALSE;
+       }
+      else
+       {
+         *section_buffer = (bfd_byte *) bfd_malloc (*section_size);
+         if (! *section_buffer)
+           return FALSE;
+         if (! bfd_get_section_contents (abfd, msec, *section_buffer,
+                                         0, *section_size))
+           return FALSE;
+       }
     }
 
   /* It is possible to get a bad value for the offset into the section
@@ -587,8 +604,7 @@ read_indirect_string (struct comp_unit * unit,
 
   *bytes_read_ptr = unit->offset_size;
 
-  if (! read_section (unit->abfd, ".debug_str", ".zdebug_str",
-                     stash->syms, offset,
+  if (! read_section (unit->abfd, debug_str, stash->syms, offset,
                      &stash->dwarf_str_buffer, &stash->dwarf_str_size))
     return NULL;
 
@@ -670,8 +686,7 @@ read_abbrevs (bfd *abfd, bfd_uint64_t offset, struct dwarf2_debug *stash)
   unsigned int abbrev_form, hash_number;
   bfd_size_type amt;
 
-  if (! read_section (abfd, ".debug_abbrev", ".zdebug_abbrev",
-                     stash->syms, offset,
+  if (! read_section (abfd, debug_abbrev, stash->syms, offset,
                      &stash->dwarf_abbrev_buffer, &stash->dwarf_abbrev_size))
     return NULL;
 
@@ -1379,8 +1394,7 @@ decode_line_info (struct comp_unit *unit, struct dwarf2_debug *stash)
   unsigned char op_code, extended_op, adj_opcode;
   bfd_size_type amt;
 
-  if (! read_section (abfd, ".debug_line", ".zdebug_line",
-                     stash->syms, unit->line_offset,
+  if (! read_section (abfd, debug_line, stash->syms, unit->line_offset,
                      &stash->dwarf_line_buffer, &stash->dwarf_line_size))
     return NULL;
 
@@ -1795,8 +1809,7 @@ static bfd_boolean
 read_debug_ranges (struct comp_unit *unit)
 {
   struct dwarf2_debug *stash = unit->stash;
-  return read_section (unit->abfd, ".debug_ranges", ".zdebug_ranges",
-                      stash->syms, 0,
+  return read_section (unit->abfd, debug_ranges, stash->syms, 0,
                       &stash->dwarf_ranges_buffer, &stash->dwarf_ranges_size);
 }
 
@@ -2135,7 +2148,7 @@ scan_unit_for_symbols (struct comp_unit *unit)
        {
          info_ptr = read_attribute (&attr, &abbrev->attrs[i], unit, info_ptr);
          if (info_ptr == NULL)
-           return FALSE;
+           goto fail;
 
          if (func)
            {
@@ -2151,6 +2164,7 @@ scan_unit_for_symbols (struct comp_unit *unit)
                  break;
 
                case DW_AT_abstract_origin:
+               case DW_AT_specification:
                  func->name = find_abstract_instance_name (unit, &attr);
                  break;
 
@@ -3218,80 +3232,37 @@ find_line (bfd *abfd,
        {
          /* Case 1: only one info section.  */
          total_size = msec->size;
-         if (! read_section (debug_bfd, ".debug_info", ".zdebug_info",
-                             symbols, 0,
+         if (! read_section (debug_bfd, debug_info, symbols, 0,
                              &stash->info_ptr_memory, &total_size))
            goto done;
        }
       else
        {
-         int all_uncompressed = 1;
+         /* Case 2: multiple sections.  */
          for (total_size = 0; msec; msec = find_debug_info (debug_bfd, msec))
-           {
-             total_size += msec->size;
-             if (strcmp (msec->name, DWARF2_COMPRESSED_DEBUG_INFO) == 0)
-               all_uncompressed = 0;
-           }
-         if (all_uncompressed)
-           {
-             /* Case 2: multiple sections, but none is compressed.  */
-             stash->info_ptr_memory = (bfd_byte *) bfd_malloc (total_size);
-             if (stash->info_ptr_memory == NULL)
-               goto done;
+           total_size += msec->size;
 
-             total_size = 0;
-             for (msec = find_debug_info (debug_bfd, NULL);
-                  msec;
-                  msec = find_debug_info (debug_bfd, msec))
-               {
-                 bfd_size_type size;
+         stash->info_ptr_memory = (bfd_byte *) bfd_malloc (total_size);
+         if (stash->info_ptr_memory == NULL)
+           goto done;
 
-                 size = msec->size;
-                 if (size == 0)
-                   continue;
+         total_size = 0;
+         for (msec = find_debug_info (debug_bfd, NULL);
+              msec;
+              msec = find_debug_info (debug_bfd, msec))
+           {
+             bfd_size_type size;
 
-                 if (!(bfd_simple_get_relocated_section_contents
-                       (debug_bfd, msec, stash->info_ptr_memory + total_size,
-                        symbols)))
-                   goto done;
+             size = msec->size;
+             if (size == 0)
+               continue;
 
-                 total_size += size;
-               }
-           }
-         else
-           {
-             /* Case 3: multiple sections, some or all compressed.  */
-             stash->info_ptr_memory = NULL;
-             total_size = 0;
-             for (msec = find_debug_info (debug_bfd, NULL);
-                  msec;
-                  msec = find_debug_info (debug_bfd, msec))
-               {
-                 bfd_size_type size = msec->size;
-                 bfd_byte *buffer, *tmp;
-                 bfd_boolean is_compressed =
-                     strcmp (msec->name, DWARF2_COMPRESSED_DEBUG_INFO) == 0;
-
-                 if (size == 0)
-                   continue;
-
-                 if (! read_and_uncompress_section (debug_bfd, msec,
-                                                    is_compressed, symbols,
-                                                    &buffer, &size))
-                   goto done;
-
-                 tmp = (bfd_byte *) bfd_realloc (stash->info_ptr_memory,
-                                                 total_size + size);
-                 if (tmp == NULL)
-                   {
-                     free (buffer);
-                     goto done;
-                   }
-                 stash->info_ptr_memory = tmp;
-                 memcpy (stash->info_ptr_memory + total_size, buffer, size);
-                 free (buffer);
-                 total_size += size;
-               }
+             if (!(bfd_simple_get_relocated_section_contents
+                   (debug_bfd, msec, stash->info_ptr_memory + total_size,
+                    symbols)))
+               goto done;
+
+             total_size += size;
            }
        }