* elf-bfd.h (struct elf_obj_tdata): Move find_line_info, local_stubs,

local_call_stubs, elf_data_symbol, elf_text_symbol, elf_data_section,
	and elf_text_section to..
	* elfxx-mips.c (struct mips_elf_obj_tdata): ..here.  Update all refs.
	* elf64-alpha.c (struct mips_elf_find_line): Rename to..
	(struct alpha_elf_find_line): ..this.
	(struct alpha_elf_obj_tdata): Add find_line_info, update refs.
This commit is contained in:
Alan Modra 2013-02-18 02:56:58 +00:00
parent bdeb34ba52
commit 698600e4b4
4 changed files with 68 additions and 59 deletions

View File

@ -1,3 +1,13 @@
2013-02-18 Alan Modra <amodra@gmail.com>
* elf-bfd.h (struct elf_obj_tdata): Move find_line_info, local_stubs,
local_call_stubs, elf_data_symbol, elf_text_symbol, elf_data_section,
and elf_text_section to..
* elfxx-mips.c (struct mips_elf_obj_tdata): ..here. Update all refs.
* elf64-alpha.c (struct mips_elf_find_line): Rename to..
(struct alpha_elf_find_line): ..this.
(struct alpha_elf_obj_tdata): Add find_line_info, update refs.
2013-02-16 H.J. Lu <hongjiu.lu@intel.com> 2013-02-16 H.J. Lu <hongjiu.lu@intel.com>
PR ld/15146 PR ld/15146

View File

@ -1586,12 +1586,6 @@ struct elf_obj_tdata
/* Used by find_nearest_line entry point. */ /* Used by find_nearest_line entry point. */
void *line_info; void *line_info;
/* Used by MIPS ELF find_nearest_line entry point. The structure
could be included directly in this one, but there's no point to
wasting the memory just for the infrequently called
find_nearest_line. */
struct mips_elf_find_line *find_line_info;
/* A place to stash dwarf1 info for this bfd. */ /* A place to stash dwarf1 info for this bfd. */
struct dwarf1_debug *dwarf1_find_line_info; struct dwarf1_debug *dwarf1_find_line_info;
@ -1601,12 +1595,6 @@ struct elf_obj_tdata
/* Stash away info for yet another find line/function variant. */ /* Stash away info for yet another find line/function variant. */
void *elf_find_function_cache; void *elf_find_function_cache;
/* An array of stub sections indexed by symbol number, used by the
MIPS ELF linker. FIXME: We should figure out some way to only
include this field for a MIPS ELF target. */
asection **local_stubs;
asection **local_call_stubs;
/* Used to determine if PT_GNU_EH_FRAME segment header should be /* Used to determine if PT_GNU_EH_FRAME segment header should be
created. */ created. */
asection *eh_frame_hdr; asection *eh_frame_hdr;
@ -1629,13 +1617,6 @@ struct elf_obj_tdata
/* Symbol version references to external objects. */ /* Symbol version references to external objects. */
Elf_Internal_Verneed *verref; Elf_Internal_Verneed *verref;
/* The Irix 5 support uses two virtual sections, which represent
text/data symbols defined in dynamic objects. */
asymbol *elf_data_symbol;
asymbol *elf_text_symbol;
asection *elf_data_section;
asection *elf_text_section;
/* A pointer to the .eh_frame section. */ /* A pointer to the .eh_frame section. */
asection *eh_frame_section; asection *eh_frame_section;

View File

@ -299,6 +299,15 @@ elf64_alpha_bfd_link_hash_table_create (bfd *abfd)
return &ret->root.root; return &ret->root.root;
} }
/* Alpha ELF follows MIPS ELF in using a special find_nearest_line
routine in order to handle the ECOFF debugging information. */
struct alpha_elf_find_line
{
struct ecoff_debug_info d;
struct ecoff_find_line i;
};
/* We have some private fields hanging off of the elf_tdata structure. */ /* We have some private fields hanging off of the elf_tdata structure. */
struct alpha_elf_obj_tdata struct alpha_elf_obj_tdata
@ -328,6 +337,10 @@ struct alpha_elf_obj_tdata
/* For every got, this is the sum of the number of words required /* For every got, this is the sum of the number of words required
to hold all of the member object's local got. */ to hold all of the member object's local got. */
int local_got_size; int local_got_size;
/* Used by elf64_alpha_find_nearest_line entry point. */
struct alpha_elf_find_line *find_line_info;
}; };
#define alpha_elf_tdata(abfd) \ #define alpha_elf_tdata(abfd) \
@ -1430,17 +1443,6 @@ elf64_alpha_is_local_label_name (bfd *abfd ATTRIBUTE_UNUSED, const char *name)
return name[0] == '$'; return name[0] == '$';
} }
/* Alpha ELF follows MIPS ELF in using a special find_nearest_line
routine in order to handle the ECOFF debugging information. We
still call this mips_elf_find_line because of the slot
find_line_info in elf_obj_tdata is declared that way. */
struct mips_elf_find_line
{
struct ecoff_debug_info d;
struct ecoff_find_line i;
};
static bfd_boolean static bfd_boolean
elf64_alpha_find_nearest_line (bfd *abfd, asection *section, asymbol **symbols, elf64_alpha_find_nearest_line (bfd *abfd, asection *section, asymbol **symbols,
bfd_vma offset, const char **filename_ptr, bfd_vma offset, const char **filename_ptr,
@ -1460,7 +1462,7 @@ elf64_alpha_find_nearest_line (bfd *abfd, asection *section, asymbol **symbols,
if (msec != NULL) if (msec != NULL)
{ {
flagword origflags; flagword origflags;
struct mips_elf_find_line *fi; struct alpha_elf_find_line *fi;
const struct ecoff_debug_swap * const swap = const struct ecoff_debug_swap * const swap =
get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap; get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
@ -1471,16 +1473,16 @@ elf64_alpha_find_nearest_line (bfd *abfd, asection *section, asymbol **symbols,
if (elf_section_data (msec)->this_hdr.sh_type != SHT_NOBITS) if (elf_section_data (msec)->this_hdr.sh_type != SHT_NOBITS)
msec->flags |= SEC_HAS_CONTENTS; msec->flags |= SEC_HAS_CONTENTS;
fi = elf_tdata (abfd)->find_line_info; fi = alpha_elf_tdata (abfd)->find_line_info;
if (fi == NULL) if (fi == NULL)
{ {
bfd_size_type external_fdr_size; bfd_size_type external_fdr_size;
char *fraw_src; char *fraw_src;
char *fraw_end; char *fraw_end;
struct fdr *fdr_ptr; struct fdr *fdr_ptr;
bfd_size_type amt = sizeof (struct mips_elf_find_line); bfd_size_type amt = sizeof (struct alpha_elf_find_line);
fi = (struct mips_elf_find_line *) bfd_zalloc (abfd, amt); fi = (struct alpha_elf_find_line *) bfd_zalloc (abfd, amt);
if (fi == NULL) if (fi == NULL)
{ {
msec->flags = origflags; msec->flags = origflags;
@ -1509,7 +1511,7 @@ elf64_alpha_find_nearest_line (bfd *abfd, asection *section, asymbol **symbols,
for (; fraw_src < fraw_end; fraw_src += external_fdr_size, fdr_ptr++) for (; fraw_src < fraw_end; fraw_src += external_fdr_size, fdr_ptr++)
(*swap->swap_fdr_in) (abfd, fraw_src, fdr_ptr); (*swap->swap_fdr_in) (abfd, fraw_src, fdr_ptr);
elf_tdata (abfd)->find_line_info = fi; alpha_elf_tdata (abfd)->find_line_info = fi;
/* Note that we don't bother to ever free this information. /* Note that we don't bother to ever free this information.
find_nearest_line is either called all the time, as in find_nearest_line is either called all the time, as in

View File

@ -499,6 +499,22 @@ struct mips_elf_obj_tdata
/* The GOT requirements of input bfds. */ /* The GOT requirements of input bfds. */
struct mips_got_info *got; struct mips_got_info *got;
/* Used by _bfd_mips_elf_find_nearest_line. The structure could be
included directly in this one, but there's no point to wasting
the memory just for the infrequently called find_nearest_line. */
struct mips_elf_find_line *find_line_info;
/* An array of stub sections indexed by symbol number. */
asection **local_stubs;
asection **local_call_stubs;
/* The Irix 5 support uses two virtual sections, which represent
text/data symbols defined in dynamic objects. */
asymbol *elf_data_symbol;
asymbol *elf_text_symbol;
asection *elf_data_section;
asection *elf_text_section;
}; };
/* Get MIPS ELF private object data from BFD's tdata. */ /* Get MIPS ELF private object data from BFD's tdata. */
@ -5180,8 +5196,8 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
&& h->fn_stub != NULL && h->fn_stub != NULL
&& (r_type != R_MIPS16_CALL16 || h->need_fn_stub)) && (r_type != R_MIPS16_CALL16 || h->need_fn_stub))
|| (local_p || (local_p
&& elf_tdata (input_bfd)->local_stubs != NULL && mips_elf_tdata (input_bfd)->local_stubs != NULL
&& elf_tdata (input_bfd)->local_stubs[r_symndx] != NULL)) && mips_elf_tdata (input_bfd)->local_stubs[r_symndx] != NULL))
&& !section_allows_mips16_refs_p (input_section)) && !section_allows_mips16_refs_p (input_section))
{ {
/* This is a 32- or 64-bit call to a 16-bit function. We should /* This is a 32- or 64-bit call to a 16-bit function. We should
@ -5189,7 +5205,7 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
stub. */ stub. */
if (local_p) if (local_p)
{ {
sec = elf_tdata (input_bfd)->local_stubs[r_symndx]; sec = mips_elf_tdata (input_bfd)->local_stubs[r_symndx];
value = 0; value = 0;
} }
else else
@ -5220,12 +5236,12 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
else if (r_type == R_MIPS16_26 && !info->relocatable else if (r_type == R_MIPS16_26 && !info->relocatable
&& ((h != NULL && (h->call_stub != NULL || h->call_fp_stub != NULL)) && ((h != NULL && (h->call_stub != NULL || h->call_fp_stub != NULL))
|| (local_p || (local_p
&& elf_tdata (input_bfd)->local_call_stubs != NULL && mips_elf_tdata (input_bfd)->local_call_stubs != NULL
&& elf_tdata (input_bfd)->local_call_stubs[r_symndx] != NULL)) && mips_elf_tdata (input_bfd)->local_call_stubs[r_symndx] != NULL))
&& !target_is_16_bit_code_p) && !target_is_16_bit_code_p)
{ {
if (local_p) if (local_p)
sec = elf_tdata (input_bfd)->local_call_stubs[r_symndx]; sec = mips_elf_tdata (input_bfd)->local_call_stubs[r_symndx];
else else
{ {
/* If both call_stub and call_fp_stub are defined, we can figure /* If both call_stub and call_fp_stub are defined, we can figure
@ -7009,7 +7025,7 @@ _bfd_mips_elf_add_symbol_hook (bfd *abfd, struct bfd_link_info *info,
case SHN_MIPS_TEXT: case SHN_MIPS_TEXT:
/* This section is used in a shared object. */ /* This section is used in a shared object. */
if (elf_tdata (abfd)->elf_text_section == NULL) if (mips_elf_tdata (abfd)->elf_text_section == NULL)
{ {
asymbol *elf_text_symbol; asymbol *elf_text_symbol;
asection *elf_text_section; asection *elf_text_section;
@ -7026,11 +7042,11 @@ _bfd_mips_elf_add_symbol_hook (bfd *abfd, struct bfd_link_info *info,
/* Initialize the section. */ /* Initialize the section. */
elf_tdata (abfd)->elf_text_section = elf_text_section; mips_elf_tdata (abfd)->elf_text_section = elf_text_section;
elf_tdata (abfd)->elf_text_symbol = elf_text_symbol; mips_elf_tdata (abfd)->elf_text_symbol = elf_text_symbol;
elf_text_section->symbol = elf_text_symbol; elf_text_section->symbol = elf_text_symbol;
elf_text_section->symbol_ptr_ptr = &elf_tdata (abfd)->elf_text_symbol; elf_text_section->symbol_ptr_ptr = &mips_elf_tdata (abfd)->elf_text_symbol;
elf_text_section->name = ".text"; elf_text_section->name = ".text";
elf_text_section->flags = SEC_NO_FLAGS; elf_text_section->flags = SEC_NO_FLAGS;
@ -7043,14 +7059,14 @@ _bfd_mips_elf_add_symbol_hook (bfd *abfd, struct bfd_link_info *info,
/* This code used to do *secp = bfd_und_section_ptr if /* This code used to do *secp = bfd_und_section_ptr if
info->shared. I don't know why, and that doesn't make sense, info->shared. I don't know why, and that doesn't make sense,
so I took it out. */ so I took it out. */
*secp = elf_tdata (abfd)->elf_text_section; *secp = mips_elf_tdata (abfd)->elf_text_section;
break; break;
case SHN_MIPS_ACOMMON: case SHN_MIPS_ACOMMON:
/* Fall through. XXX Can we treat this as allocated data? */ /* Fall through. XXX Can we treat this as allocated data? */
case SHN_MIPS_DATA: case SHN_MIPS_DATA:
/* This section is used in a shared object. */ /* This section is used in a shared object. */
if (elf_tdata (abfd)->elf_data_section == NULL) if (mips_elf_tdata (abfd)->elf_data_section == NULL)
{ {
asymbol *elf_data_symbol; asymbol *elf_data_symbol;
asection *elf_data_section; asection *elf_data_section;
@ -7067,11 +7083,11 @@ _bfd_mips_elf_add_symbol_hook (bfd *abfd, struct bfd_link_info *info,
/* Initialize the section. */ /* Initialize the section. */
elf_tdata (abfd)->elf_data_section = elf_data_section; mips_elf_tdata (abfd)->elf_data_section = elf_data_section;
elf_tdata (abfd)->elf_data_symbol = elf_data_symbol; mips_elf_tdata (abfd)->elf_data_symbol = elf_data_symbol;
elf_data_section->symbol = elf_data_symbol; elf_data_section->symbol = elf_data_symbol;
elf_data_section->symbol_ptr_ptr = &elf_tdata (abfd)->elf_data_symbol; elf_data_section->symbol_ptr_ptr = &mips_elf_tdata (abfd)->elf_data_symbol;
elf_data_section->name = ".data"; elf_data_section->name = ".data";
elf_data_section->flags = SEC_NO_FLAGS; elf_data_section->flags = SEC_NO_FLAGS;
@ -7084,7 +7100,7 @@ _bfd_mips_elf_add_symbol_hook (bfd *abfd, struct bfd_link_info *info,
/* This code used to do *secp = bfd_und_section_ptr if /* This code used to do *secp = bfd_und_section_ptr if
info->shared. I don't know why, and that doesn't make sense, info->shared. I don't know why, and that doesn't make sense,
so I took it out. */ so I took it out. */
*secp = elf_tdata (abfd)->elf_data_section; *secp = mips_elf_tdata (abfd)->elf_data_section;
break; break;
case SHN_MIPS_SUNDEFINED: case SHN_MIPS_SUNDEFINED:
@ -7590,7 +7606,7 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
/* Record this stub in an array of local symbol stubs for /* Record this stub in an array of local symbol stubs for
this BFD. */ this BFD. */
if (elf_tdata (abfd)->local_stubs == NULL) if (mips_elf_tdata (abfd)->local_stubs == NULL)
{ {
unsigned long symcount; unsigned long symcount;
asection **n; asection **n;
@ -7604,11 +7620,11 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
n = bfd_zalloc (abfd, amt); n = bfd_zalloc (abfd, amt);
if (n == NULL) if (n == NULL)
return FALSE; return FALSE;
elf_tdata (abfd)->local_stubs = n; mips_elf_tdata (abfd)->local_stubs = n;
} }
sec->flags |= SEC_KEEP; sec->flags |= SEC_KEEP;
elf_tdata (abfd)->local_stubs[r_symndx] = sec; mips_elf_tdata (abfd)->local_stubs[r_symndx] = sec;
/* We don't need to set mips16_stubs_seen in this case. /* We don't need to set mips16_stubs_seen in this case.
That flag is used to see whether we need to look through That flag is used to see whether we need to look through
@ -7715,7 +7731,7 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
/* Record this stub in an array of local symbol call_stubs for /* Record this stub in an array of local symbol call_stubs for
this BFD. */ this BFD. */
if (elf_tdata (abfd)->local_call_stubs == NULL) if (mips_elf_tdata (abfd)->local_call_stubs == NULL)
{ {
unsigned long symcount; unsigned long symcount;
asection **n; asection **n;
@ -7729,11 +7745,11 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
n = bfd_zalloc (abfd, amt); n = bfd_zalloc (abfd, amt);
if (n == NULL) if (n == NULL)
return FALSE; return FALSE;
elf_tdata (abfd)->local_call_stubs = n; mips_elf_tdata (abfd)->local_call_stubs = n;
} }
sec->flags |= SEC_KEEP; sec->flags |= SEC_KEEP;
elf_tdata (abfd)->local_call_stubs[r_symndx] = sec; mips_elf_tdata (abfd)->local_call_stubs[r_symndx] = sec;
/* We don't need to set mips16_stubs_seen in this case. /* We don't need to set mips16_stubs_seen in this case.
That flag is used to see whether we need to look through That flag is used to see whether we need to look through
@ -11649,7 +11665,7 @@ _bfd_mips_elf_find_nearest_line (bfd *abfd, asection *section,
if (elf_section_data (msec)->this_hdr.sh_type != SHT_NOBITS) if (elf_section_data (msec)->this_hdr.sh_type != SHT_NOBITS)
msec->flags |= SEC_HAS_CONTENTS; msec->flags |= SEC_HAS_CONTENTS;
fi = elf_tdata (abfd)->find_line_info; fi = mips_elf_tdata (abfd)->find_line_info;
if (fi == NULL) if (fi == NULL)
{ {
bfd_size_type external_fdr_size; bfd_size_type external_fdr_size;
@ -11687,7 +11703,7 @@ _bfd_mips_elf_find_nearest_line (bfd *abfd, asection *section,
for (; fraw_src < fraw_end; fraw_src += external_fdr_size, fdr_ptr++) for (; fraw_src < fraw_end; fraw_src += external_fdr_size, fdr_ptr++)
(*swap->swap_fdr_in) (abfd, fraw_src, fdr_ptr); (*swap->swap_fdr_in) (abfd, fraw_src, fdr_ptr);
elf_tdata (abfd)->find_line_info = fi; mips_elf_tdata (abfd)->find_line_info = fi;
/* Note that we don't bother to ever free this information. /* Note that we don't bother to ever free this information.
find_nearest_line is either called all the time, as in find_nearest_line is either called all the time, as in