From dc928a0dbd0e762577c51204b043d6b6f066940d Mon Sep 17 00:00:00 2001
From: Joel Brobecker <brobecker@adacore.com>
Date: Thu, 14 Feb 2013 23:53:25 +0100
Subject: [PATCH] AIX: add DWARF support
* bfd/coff-rs6000.c (xcoff_dwsect_names): Add .dwframe,
.dwloc, .dwmacif and .dwmacro.
* bfd/libxcoff.h (XCOFF_DWSECT_NBR_NAMES): Set to 12.
* xcofflink.c (xcoff_mark): Mark all debugging symbols.
(bfd_xcoff_size_dynamic_sections): Mark all debugging sections.
(xcoff_link_input_bfd): Gah???
* gas/config/tc-ppc.c (ppc_named_section): Add handling
of DWARF sections.
---
bfd/coff-rs6000.c | 6 ++++-
bfd/libxcoff.h | 2 +-
bfd/xcofflink.c | 65 +++++++++++++++++++++++++++++---------------------
gas/config/tc-ppc.c | 29 ++++++++++++++++++++++-
4 files changed, 72 insertions(+), 30 deletions(-)
@@ -3916,7 +3916,11 @@ const struct xcoff_dwsect_name xcoff_dwsect_names[] = {
{ SSUBTYP_DWARNGE, ".dwarnge", TRUE },
{ SSUBTYP_DWABREV, ".dwabrev", FALSE },
{ SSUBTYP_DWSTR, ".dwstr", TRUE },
- { SSUBTYP_DWRNGES, ".dwrnges", TRUE }
+ { SSUBTYP_DWRNGES, ".dwrnges", TRUE },
+ { 0x47000000, ".dwframe", TRUE },
+ { 0x47010000, ".dwloc", TRUE },
+ { 0x47020000, ".dwmacif", FALSE },
+ { 0x47030000, ".dwmacro", FALSE }
};
static const struct xcoff_backend_data_rec bfd_xcoff_backend_data =
@@ -251,7 +251,7 @@ struct xcoff_dwsect_name {
/* Number of entries in the array. The number is known and public so that user
can 'extend' this array by index. */
-#define XCOFF_DWSECT_NBR_NAMES 8
+#define XCOFF_DWSECT_NBR_NAMES 12
/* The dwarf sections array. */
extern const struct xcoff_dwsect_name
@@ -2902,8 +2902,7 @@ xcoff_mark (struct bfd_link_info *info, asection *sec)
sec->flags |= SEC_MARK;
if (sec->owner->xvec == info->output_bfd->xvec
- && coff_section_data (sec->owner, sec) != NULL
- && xcoff_section_data (sec->owner, sec) != NULL)
+ && coff_section_data (sec->owner, sec) != NULL)
{
struct xcoff_link_hash_entry **syms;
struct internal_reloc *rel, *relend;
@@ -2911,18 +2910,21 @@ xcoff_mark (struct bfd_link_info *info, asection *sec)
unsigned long i, first, last;
/* Mark all the symbols in this section. */
- syms = obj_xcoff_sym_hashes (sec->owner);
- csects = xcoff_data (sec->owner)->csects;
- first = xcoff_section_data (sec->owner, sec)->first_symndx;
- last = xcoff_section_data (sec->owner, sec)->last_symndx;
- for (i = first; i <= last; i++)
- if (csects[i] == sec
- && syms[i] != NULL
- && (syms[i]->flags & XCOFF_MARK) == 0)
- {
- if (!xcoff_mark_symbol (info, syms[i]))
- return FALSE;
- }
+ if (xcoff_section_data (sec->owner, sec) != NULL)
+ {
+ syms = obj_xcoff_sym_hashes (sec->owner);
+ csects = xcoff_data (sec->owner)->csects;
+ first = xcoff_section_data (sec->owner, sec)->first_symndx;
+ last = xcoff_section_data (sec->owner, sec)->last_symndx;
+ for (i = first; i <= last; i++)
+ if (csects[i] == sec
+ && syms[i] != NULL
+ && (syms[i]->flags & XCOFF_MARK) == 0)
+ {
+ if (!xcoff_mark_symbol (info, syms[i]))
+ return FALSE;
+ }
+ }
/* Look through the section relocs. */
if ((sec->flags & SEC_RELOC) != 0
@@ -2965,7 +2967,8 @@ xcoff_mark (struct bfd_link_info *info, asection *sec)
/* See if this reloc needs to be copied into the .loader
section. */
- if (xcoff_need_ldrel_p (info, rel, h))
+ if ((sec->flags & SEC_DEBUGGING) == 0
+ && xcoff_need_ldrel_p (info, rel, h))
{
++xcoff_hash_table (info)->ldrel_count;
if (h != NULL)
@@ -3760,6 +3763,17 @@ bfd_xcoff_size_dynamic_sections (bfd *output_bfd,
if (ldinfo.failed)
goto error_return;
}
+ /* Mark all debugging sections. */
+ for (sub = info->input_bfds; sub != NULL; sub = sub->link_next)
+ {
+ asection *o;
+
+ for (o = sub->sections; o != NULL; o = o->next)
+ if ((o->flags & SEC_DEBUGGING) != 0
+ && (o->flags & SEC_MARK) == 0
+ && ! xcoff_mark (info, o))
+ goto error_return;
+ }
xcoff_sweep (info);
xcoff_hash_table (info)->gc = TRUE;
}
@@ -4920,7 +4934,7 @@ xcoff_link_input_bfd (struct xcoff_final_link_info *flinfo,
if (indx != -1)
irel->r_symndx = indx;
- else
+ else if ((o->flags & SEC_DEBUGGING) == 0)
{
struct internal_syment *is;
@@ -4933,19 +4947,16 @@ xcoff_link_input_bfd (struct xcoff_final_link_info *flinfo,
this case, but I don't think it's worth it. */
is = flinfo->internal_syms + r_symndx;
- if (is->n_sclass != C_DWARF)
- {
- name = (_bfd_coff_internal_syment_name
- (input_bfd, is, buf));
+ name = (_bfd_coff_internal_syment_name
+ (input_bfd, is, buf));
- if (name == NULL)
- return FALSE;
+ if (name == NULL)
+ return FALSE;
- if (!(*flinfo->info->callbacks->unattached_reloc)
- (flinfo->info, name, input_bfd, o,
- irel->r_vaddr))
- return FALSE;
- }
+ if (!(*flinfo->info->callbacks->unattached_reloc)
+ (flinfo->info, name, input_bfd, o,
+ irel->r_vaddr))
+ return FALSE;
}
}
}
@@ -3951,7 +3951,34 @@ ppc_named_section (int ignore ATTRIBUTE_UNUSED)
real_name = ".data[RW]";
else
{
- as_bad (_("the XCOFF file format does not support arbitrary sections"));
+ /* Entries in this array correspond to the ones in
+ xcoff_dwsect_names. */
+ static const char * const dwarf_sections[XCOFF_DWSECT_NBR_NAMES] = {
+ ".debug_info",
+ ".debug_line",
+ ".debug_pubnames",
+ ".debug_pubtypes",
+ ".debug_aranges",
+ ".debug_abbrev",
+ ".debug_str",
+ ".debug_ranges",
+ ".debug_frame",
+ ".debug_loc",
+ ".debug_macinfo",
+ ".debug_macro", };
+ int i;
+
+ /* Try dwarf sections. */
+ for (i = 0; i < XCOFF_DWSECT_NBR_NAMES; i++)
+ if (strcmp (user_name, dwarf_sections[i]) == 0)
+ {
+ *input_line_pointer = c;
+ demand_empty_rest_of_line ();
+ ppc_change_debug_section (i, 0);
+ return;
+ }
+
+ as_bad (_("The XCOFF file format does not support arbitrary sections"));
*input_line_pointer = c;
ignore_rest_of_line ();
return;
--
1.6.5.rc2