* dwarf2.c (struct dwarf2_debug): Add field debug_sections.
(read_section): Add sec argument. Adjust the code to get section
names from it.
(read_indirect_string): Adjust call to read_section.
(read_abbrevs): Ditto.
(decode_line_info): Ditto.
(read_debug_ranges): Ditto.
(DWARF2_DEBUG_INFO, DWARF2_COMPRESSED_DEBUG_INFO): Remove.
(find_debug_info): Add debug_sections parameter. Use it instead
the above macros.
(place_sections): Get section names from stash.
(find_line): Add debug_sections argument. Initialize
debug_sections field of stash from it.
Adjust calls to find_debug_info.
(_bfd_dwarf2_find_nearest_line): Add debug_sections argument.
Adjust call to find_line.
(_bfd_dwarf2_find_line): Adjust call to find_line.
* libcoff-in.h (struct dwarf_debug_section): New declaration.
(coff_find_nearest_line_with_names): Likewise.
* libcoff.h: Regenerate.
* libbfd-in.h (struct dwarf_debug_section): Move declaration.
(dwarf_debug_sections): Likewise.
(_bfd_dwarf2_find_nearest_line): Add debug_sections argument.
* libbfd.h: Regenerate.
* elf.c (_bfd_elf_find_nearest_line): Adjust call to
_bfd_dwarf2_find_nearest_line.
* elfxx-mips.c (_bfd_mips_elf_find_nearest_line): Ditto.
* elf64-alpha.c (elf64_alpha_find_nearest_line): Ditto.
* elf32-arm.c (elf32_arm_find_nearest_line): Ditto.
* coffgen.c (coff_find_nearest_line_with_names): New function.
(coff_find_nearest_line): Calls coff_find_nearest_line_with_names.
* coff-rs6000.c (xcoff_debug_sections): New constant.
(xcoff_find_nearest_line): New function.
(rs6000coff_vec): Use xcoff_find_nearest_line.
(pmac_xcoff_vec): Ditto.
+2011-09-30 Tristan Gingold <gingold@adacore.com>
+
+ * dwarf2.c (struct dwarf2_debug): Add field debug_sections.
+ (read_section): Add sec argument. Adjust the code to get section
+ names from it.
+ (read_indirect_string): Adjust call to read_section.
+ (read_abbrevs): Ditto.
+ (decode_line_info): Ditto.
+ (read_debug_ranges): Ditto.
+ (DWARF2_DEBUG_INFO, DWARF2_COMPRESSED_DEBUG_INFO): Remove.
+ (find_debug_info): Add debug_sections parameter. Use it instead
+ the above macros.
+ (place_sections): Get section names from stash.
+ (find_line): Add debug_sections argument. Initialize
+ debug_sections field of stash from it.
+ Adjust calls to find_debug_info.
+ (_bfd_dwarf2_find_nearest_line): Add debug_sections argument.
+ Adjust call to find_line.
+ (_bfd_dwarf2_find_line): Adjust call to find_line.
+ * libcoff-in.h (struct dwarf_debug_section): New declaration.
+ (coff_find_nearest_line_with_names): Likewise.
+ * libcoff.h: Regenerate.
+ * libbfd-in.h (struct dwarf_debug_section): Move declaration.
+ (dwarf_debug_sections): Likewise.
+ (_bfd_dwarf2_find_nearest_line): Add debug_sections argument.
+ * libbfd.h: Regenerate.
+ * elf.c (_bfd_elf_find_nearest_line): Adjust call to
+ _bfd_dwarf2_find_nearest_line.
+ * elfxx-mips.c (_bfd_mips_elf_find_nearest_line): Ditto.
+ * elf64-alpha.c (elf64_alpha_find_nearest_line): Ditto.
+ * elf32-arm.c (elf32_arm_find_nearest_line): Ditto.
+ * coffgen.c (coff_find_nearest_line_with_names): New function.
+ (coff_find_nearest_line): Calls coff_find_nearest_line_with_names.
+ * coff-rs6000.c (xcoff_debug_sections): New constant.
+ (xcoff_find_nearest_line): New function.
+ (rs6000coff_vec): Use xcoff_find_nearest_line.
+ (pmac_xcoff_vec): Ditto.
+
2011-09-30 Alan Modra <amodra@gmail.com>
PR ld/13235
{
return FALSE;
}
+
+static const struct dwarf_debug_section xcoff_debug_sections[] =
+{
+ { ".dwabrev", NULL },
+ { ".dwarnge", NULL },
+ { NULL, NULL }, /* .debug_frame */
+ { ".dwinfo", NULL },
+ { ".dwline", NULL },
+ { NULL, NULL }, /* .debug_loc */
+ { NULL, NULL }, /* .debug_macinfo */
+ { NULL, NULL }, /* .debug_macro */
+ { ".dwpbnms", NULL },
+ { ".dwpbtyp", NULL },
+ { ".dwrnges", NULL },
+ { NULL, NULL }, /* .debug_static_func */
+ { NULL, NULL }, /* .debug_static_vars */
+ { ".dwstr", NULL },
+ { NULL, NULL }, /* .debug_types */
+ /* GNU DWARF 1 extensions */
+ { NULL, NULL }, /* .debug_sfnames */
+ { NULL, NULL }, /* .debug_srcinfo */
+ /* SGI/MIPS DWARF 2 extensions */
+ { NULL, NULL }, /* .debug_funcnames */
+ { NULL, NULL }, /* .debug_typenames */
+ { NULL, NULL }, /* .debug_varnames */
+ { NULL, NULL }, /* .debug_weaknames */
+ { NULL, NULL },
+};
+
+static bfd_boolean
+xcoff_find_nearest_line (bfd *abfd,
+ asection *section,
+ asymbol **symbols,
+ bfd_vma offset,
+ const char **filename_ptr,
+ const char **functionname_ptr,
+ unsigned int *line_ptr)
+{
+ return coff_find_nearest_line_with_names (abfd, xcoff_debug_sections,
+ section, symbols, offset,
+ filename_ptr, functionname_ptr,
+ line_ptr);
+}
+
\f
void
_bfd_xcoff_swap_sym_in (bfd *abfd, PTR ext1, PTR in1)
_bfd_xcoff_is_local_label_name,
coff_bfd_is_target_special_symbol,
coff_get_lineno,
- coff_find_nearest_line,
+ xcoff_find_nearest_line,
_bfd_generic_find_line,
coff_find_inliner_info,
coff_bfd_make_debug_symbol,
_bfd_xcoff_is_local_label_name,
coff_bfd_is_target_special_symbol,
coff_get_lineno,
- coff_find_nearest_line,
+ xcoff_find_nearest_line,
_bfd_generic_find_line,
coff_find_inliner_info,
coff_bfd_make_debug_symbol,
nearest to the wanted location. */
bfd_boolean
-coff_find_nearest_line (bfd *abfd,
- asection *section,
- asymbol **symbols,
- bfd_vma offset,
- const char **filename_ptr,
- const char **functionname_ptr,
- unsigned int *line_ptr)
+coff_find_nearest_line_with_names (bfd *abfd,
+ const struct dwarf_debug_section *debug_sections,
+ asection *section,
+ asymbol **symbols,
+ bfd_vma offset,
+ const char **filename_ptr,
+ const char **functionname_ptr,
+ unsigned int *line_ptr)
{
bfd_boolean found;
unsigned int i;
return TRUE;
/* Also try examining DWARF2 debugging information. */
- if (_bfd_dwarf2_find_nearest_line (abfd, section, symbols, offset,
+ if (_bfd_dwarf2_find_nearest_line (abfd, debug_sections,
+ section, symbols, offset,
filename_ptr, functionname_ptr,
line_ptr, 0,
&coff_data(abfd)->dwarf2_find_line_info))
return TRUE;
}
+bfd_boolean
+coff_find_nearest_line (bfd *abfd,
+ asection *section,
+ asymbol **symbols,
+ bfd_vma offset,
+ const char **filename_ptr,
+ const char **functionname_ptr,
+ unsigned int *line_ptr)
+{
+ return coff_find_nearest_line_with_names (abfd, dwarf_debug_sections,
+ section, symbols, offset,
+ filename_ptr, functionname_ptr,
+ line_ptr);
+}
+
bfd_boolean
coff_find_inliner_info (bfd *abfd,
const char **filename_ptr,
/* Last comp unit in list above. */
struct comp_unit *last_comp_unit;
+ /* Names of the debug sections. */
+ const struct dwarf_debug_section *debug_sections;
+
/* The next unread compilation unit within the .debug_info section.
Zero indicates that the .debug_info section has not been loaded
into a buffer yet. */
static bfd_boolean
read_section (bfd * abfd,
- enum dwarf_debug_section_enum sec,
+ const struct dwarf_debug_section *sec,
asymbol ** syms,
bfd_uint64_t offset,
bfd_byte ** section_buffer,
bfd_size_type * section_size)
{
asection *msec;
- const char *section_name = dwarf_debug_sections[sec].uncompressed_name;
+ const char *section_name = 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)
{
- section_name = dwarf_debug_sections[sec].compressed_name;
- msec = bfd_get_section_by_name (abfd, section_name);
+ section_name = sec->compressed_name;
+ if (section_name != NULL)
+ msec = bfd_get_section_by_name (abfd, section_name);
}
if (! msec)
{
- (*_bfd_error_handler) (_("Dwarf Error: Can't find %s section."), section_name);
+ (*_bfd_error_handler) (_("Dwarf Error: Can't find %s section."),
+ sec->uncompressed_name);
bfd_set_error (bfd_error_bad_value);
return FALSE;
}
*bytes_read_ptr = unit->offset_size;
- if (! read_section (unit->abfd, debug_str, stash->syms, offset,
+ if (! read_section (unit->abfd, &stash->debug_sections[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, stash->syms, offset,
+ if (! read_section (abfd, &stash->debug_sections[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, stash->syms, unit->line_offset,
+ if (! read_section (abfd, &stash->debug_sections[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, stash->syms, 0,
+ return read_section (unit->abfd, &stash->debug_sections[debug_ranges],
+ stash->syms, 0,
&stash->dwarf_ranges_buffer, &stash->dwarf_ranges_size);
}
/* Locate a section in a BFD containing debugging info. The search starts
from the section after AFTER_SEC, or from the first section in the BFD if
AFTER_SEC is NULL. The search works by examining the names of the
- sections. There are two permissiable names. The first is .debug_info.
- This is the standard DWARF2 name. The second is a prefix .gnu.linkonce.wi.
+ sections. There are three permissiable names. The first two are given
+ by DEBUG_SECTIONS[debug_info] (whose standard DWARF2 names are .debug_info
+ and .zdebug_info). The third is a prefix .gnu.linkonce.wi.
This is a variation on the .debug_info section which has a checksum
describing the contents appended onto the name. This allows the linker to
identify and discard duplicate debugging sections for different
compilation units. */
-#define DWARF2_DEBUG_INFO ".debug_info"
-#define DWARF2_COMPRESSED_DEBUG_INFO ".zdebug_info"
#define GNU_LINKONCE_INFO ".gnu.linkonce.wi."
static asection *
-find_debug_info (bfd *abfd, asection *after_sec)
+find_debug_info (bfd *abfd, const struct dwarf_debug_section *debug_sections,
+ asection *after_sec)
{
asection * msec;
while (msec)
{
- if (strcmp (msec->name, DWARF2_DEBUG_INFO) == 0)
+ if (strcmp (msec->name,
+ debug_sections[debug_info].uncompressed_name) == 0)
return msec;
- if (strcmp (msec->name, DWARF2_COMPRESSED_DEBUG_INFO) == 0)
+ if (debug_sections[debug_info].compressed_name != NULL
+ && strcmp (msec->name,
+ debug_sections[debug_info].compressed_name) == 0)
return msec;
if (CONST_STRNEQ (msec->name, GNU_LINKONCE_INFO))
asection *sect;
bfd_vma last_vma = 0, last_dwarf = 0;
bfd_size_type amt;
+ const char *debug_info_name;
+ debug_info_name = stash->debug_sections[debug_info].uncompressed_name;
i = 0;
for (sect = abfd->sections; sect != NULL; sect = sect->next)
{
/* We need to adjust the VMAs of any .debug_info sections.
Skip compressed ones, since no relocations could target
them - they should not appear in object files anyway. */
- if (strcmp (sect->name, DWARF2_DEBUG_INFO) == 0)
+ if (strcmp (sect->name, debug_info_name) == 0)
is_debug_info = 1;
else if (CONST_STRNEQ (sect->name, GNU_LINKONCE_INFO))
is_debug_info = 1;
/* We need to adjust the VMAs of any .debug_info sections.
Skip compressed ones, since no relocations could target
them - they should not appear in object files anyway. */
- if (strcmp (sect->name, DWARF2_DEBUG_INFO) == 0)
+ if (strcmp (sect->name, debug_info_name) == 0)
is_debug_info = 1;
else if (CONST_STRNEQ (sect->name, GNU_LINKONCE_INFO))
is_debug_info = 1;
FILENAME_PTR and LINENUMBER_PTR. In the case where SYMBOL was
NULL the FUNCTIONNAME_PTR is also filled in.
SYMBOLS contains the symbol table for ABFD.
+ DEBUG_SECTIONS contains the name of the dwarf debug sections.
ADDR_SIZE is the number of bytes in the initial .debug_info length
field and in the abbreviation offset, or zero to indicate that the
default value should be used. */
static bfd_boolean
find_line (bfd *abfd,
+ const struct dwarf_debug_section *debug_sections,
asection *section,
bfd_vma offset,
asymbol *symbol,
stash = (struct dwarf2_debug *) bfd_zalloc (abfd, amt);
if (! stash)
return FALSE;
+ stash->debug_sections = debug_sections;
}
/* In a relocatable file, 2 functions may have the same address.
*pinfo = stash;
- msec = find_debug_info (abfd, NULL);
+ msec = find_debug_info (abfd, debug_sections, NULL);
if (msec == NULL)
{
char * debug_filename = bfd_follow_gnu_debuglink (abfd, DEBUGDIR);
if ((debug_bfd = bfd_openr (debug_filename, NULL)) == NULL
|| ! bfd_check_format (debug_bfd, bfd_object)
- || (msec = find_debug_info (debug_bfd, NULL)) == NULL)
+ || (msec = find_debug_info (debug_bfd,
+ debug_sections, NULL)) == NULL)
{
if (debug_bfd)
bfd_close (debug_bfd);
some or all sections are compressed, then do things the slow
way, with a bunch of reallocs. */
- if (! find_debug_info (debug_bfd, msec))
+ if (! find_debug_info (debug_bfd, debug_sections, msec))
{
/* Case 1: only one info section. */
total_size = msec->size;
- if (! read_section (debug_bfd, debug_info, symbols, 0,
+ if (! read_section (debug_bfd, &stash->debug_sections[debug_info],
+ symbols, 0,
&stash->info_ptr_memory, &total_size))
goto done;
}
else
{
/* Case 2: multiple sections. */
- for (total_size = 0; msec; msec = find_debug_info (debug_bfd, msec))
+ for (total_size = 0;
+ msec;
+ msec = find_debug_info (debug_bfd, debug_sections, msec))
total_size += msec->size;
stash->info_ptr_memory = (bfd_byte *) bfd_malloc (total_size);
goto done;
total_size = 0;
- for (msec = find_debug_info (debug_bfd, NULL);
+ for (msec = find_debug_info (debug_bfd, debug_sections, NULL);
msec;
- msec = find_debug_info (debug_bfd, msec))
+ msec = find_debug_info (debug_bfd, debug_sections, msec))
{
bfd_size_type size;
stash->info_ptr = stash->info_ptr_memory;
stash->info_ptr_end = stash->info_ptr + total_size;
- stash->sec = find_debug_info (debug_bfd, NULL);
+ stash->sec = find_debug_info (debug_bfd, debug_sections, NULL);
stash->sec_info_ptr = stash->info_ptr;
stash->syms = symbols;
stash->bfd_ptr = debug_bfd;
if ((bfd_vma) (stash->info_ptr - stash->sec_info_ptr)
== stash->sec->size)
{
- stash->sec = find_debug_info (stash->bfd_ptr, stash->sec);
+ stash->sec = find_debug_info (stash->bfd_ptr, debug_sections,
+ stash->sec);
stash->sec_info_ptr = stash->info_ptr;
}
bfd_boolean
_bfd_dwarf2_find_nearest_line (bfd *abfd,
+ const struct dwarf_debug_section *debug_sections,
asection *section,
asymbol **symbols,
bfd_vma offset,
unsigned int addr_size,
void **pinfo)
{
- return find_line (abfd, section, offset, NULL, symbols, filename_ptr,
- functionname_ptr, linenumber_ptr, addr_size,
+ return find_line (abfd, debug_sections, section, offset, NULL, symbols,
+ filename_ptr, functionname_ptr, linenumber_ptr, addr_size,
pinfo);
}
unsigned int addr_size,
void **pinfo)
{
- return find_line (abfd, NULL, 0, symbol, symbols, filename_ptr,
- NULL, linenumber_ptr, addr_size,
- pinfo);
+ return find_line (abfd, dwarf_debug_sections, NULL, 0, symbol, symbols,
+ filename_ptr, NULL, linenumber_ptr, addr_size, pinfo);
}
bfd_boolean
return TRUE;
}
- if (_bfd_dwarf2_find_nearest_line (abfd, section, symbols, offset,
+ if (_bfd_dwarf2_find_nearest_line (abfd, dwarf_debug_sections,
+ section, symbols, offset,
filename_ptr, functionname_ptr,
line_ptr, 0,
&elf_tdata (abfd)->dwarf2_find_line_info))
/* We skip _bfd_dwarf1_find_nearest_line since no known ARM toolchain uses it. */
- if (_bfd_dwarf2_find_nearest_line (abfd, section, symbols, offset,
+ if (_bfd_dwarf2_find_nearest_line (abfd, dwarf_debug_sections,
+ section, symbols, offset,
filename_ptr, functionname_ptr,
line_ptr, 0,
& elf_tdata (abfd)->dwarf2_find_line_info))
{
asection *msec;
- if (_bfd_dwarf2_find_nearest_line (abfd, section, symbols, offset,
+ if (_bfd_dwarf2_find_nearest_line (abfd, dwarf_debug_sections,
+ section, symbols, offset,
filename_ptr, functionname_ptr,
line_ptr, 0,
&elf_tdata (abfd)->dwarf2_find_line_info))
line_ptr))
return TRUE;
- if (_bfd_dwarf2_find_nearest_line (abfd, section, symbols, offset,
+ if (_bfd_dwarf2_find_nearest_line (abfd, dwarf_debug_sections,
+ section, symbols, offset,
filename_ptr, functionname_ptr,
line_ptr, ABI_64_P (abfd) ? 8 : 0,
&elf_tdata (abfd)->dwarf2_find_line_info))
(bfd *, asection *, asymbol **, bfd_vma, const char **,
const char **, unsigned int *);
+struct dwarf_debug_section
+{
+ const char *uncompressed_name;
+ const char *compressed_name;
+};
+
+/* Map of uncompressed DWARF debug section name to compressed one. It
+ is terminated by NULL uncompressed_name. */
+
+extern const struct dwarf_debug_section dwarf_debug_sections[];
+
/* Find the nearest line using DWARF 2 debugging information. */
extern bfd_boolean _bfd_dwarf2_find_nearest_line
- (bfd *, asection *, asymbol **, bfd_vma, const char **, const char **,
- unsigned int *, unsigned int, void **);
+ (bfd *, const struct dwarf_debug_section *, asection *, asymbol **, bfd_vma,
+ const char **, const char **, unsigned int *, unsigned int, void **);
/* Find the line using DWARF 2 debugging information. */
extern bfd_boolean _bfd_dwarf2_find_line
extern bfd_vma read_unsigned_leb128 (bfd *, bfd_byte *, unsigned int *);
extern bfd_signed_vma read_signed_leb128 (bfd *, bfd_byte *, unsigned int *);
-
-struct dwarf_debug_section
-{
- const char *uncompressed_name;
- const char *compressed_name;
-};
-
-/* Map of uncompressed DWARF debug section name to compressed one. It
- is terminated by NULL uncompressed_name. */
-
-extern const struct dwarf_debug_section dwarf_debug_sections[];
(bfd *, asection *, asymbol **, bfd_vma, const char **,
const char **, unsigned int *);
+struct dwarf_debug_section
+{
+ const char *uncompressed_name;
+ const char *compressed_name;
+};
+
+/* Map of uncompressed DWARF debug section name to compressed one. It
+ is terminated by NULL uncompressed_name. */
+
+extern const struct dwarf_debug_section dwarf_debug_sections[];
+
/* Find the nearest line using DWARF 2 debugging information. */
extern bfd_boolean _bfd_dwarf2_find_nearest_line
- (bfd *, asection *, asymbol **, bfd_vma, const char **, const char **,
- unsigned int *, unsigned int, void **);
+ (bfd *, const struct dwarf_debug_section *, asection *, asymbol **, bfd_vma,
+ const char **, const char **, unsigned int *, unsigned int, void **);
/* Find the line using DWARF 2 debugging information. */
extern bfd_boolean _bfd_dwarf2_find_line
extern bfd_vma read_unsigned_leb128 (bfd *, bfd_byte *, unsigned int *);
extern bfd_signed_vma read_signed_leb128 (bfd *, bfd_byte *, unsigned int *);
-
-struct dwarf_debug_section
-{
- const char *uncompressed_name;
- const char *compressed_name;
-};
-
-/* Map of uncompressed DWARF debug section name to compressed one. It
- is terminated by NULL uncompressed_name. */
-
-extern const struct dwarf_debug_section dwarf_debug_sections[];
/* Extracted from init.c. */
/* Extracted from libbfd.c. */
bfd_boolean bfd_write_bigendian_4byte_int (bfd *, unsigned int);
extern bfd_boolean coff_find_nearest_line
(bfd *, asection *, asymbol **, bfd_vma, const char **,
const char **, unsigned int *);
+struct dwarf_debug_section;
+extern bfd_boolean coff_find_nearest_line_with_names
+ (bfd *, const struct dwarf_debug_section *, asection *, asymbol **,
+ bfd_vma, const char **, const char **, unsigned int *);
extern bfd_boolean coff_find_inliner_info
(bfd *, const char **, const char **, unsigned int *);
extern int coff_sizeof_headers
extern bfd_boolean coff_find_nearest_line
(bfd *, asection *, asymbol **, bfd_vma, const char **,
const char **, unsigned int *);
+struct dwarf_debug_section;
+extern bfd_boolean coff_find_nearest_line_with_names
+ (bfd *, const struct dwarf_debug_section *, asection *, asymbol **,
+ bfd_vma, const char **, const char **, unsigned int *);
extern bfd_boolean coff_find_inliner_info
(bfd *, const char **, const char **, unsigned int *);
extern int coff_sizeof_headers