enum dwarf_form form;
};
+/* Map of uncompressed DWARF debug section name to compressed one. It
+ is terminated by NULL uncompressed_name. */
+
+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
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
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)
{
}
*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
*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;
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;
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;
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);
}
{
info_ptr = read_attribute (&attr, &abbrev->attrs[i], unit, info_ptr);
if (info_ptr == NULL)
- return FALSE;
+ goto fail;
if (func)
{
{
/* 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;
}
}