diff options
author | Maciej W. Rozycki <macro@imgtec.com> | 2017-02-23 22:27:50 +0000 |
---|---|---|
committer | Maciej W. Rozycki <macro@imgtec.com> | 2017-02-23 23:49:14 +0000 |
commit | 5d58c7337972bb24caea7598d0ae4d461b0fc22b (patch) | |
tree | 96686077f399e4fa5f176c269f0c014c3352cd84 /bfd | |
parent | c1556ecd7843912269aba283a0fd307729fa0c3a (diff) | |
download | gdb-5d58c7337972bb24caea7598d0ae4d461b0fc22b.zip gdb-5d58c7337972bb24caea7598d0ae4d461b0fc22b.tar.gz gdb-5d58c7337972bb24caea7598d0ae4d461b0fc22b.tar.bz2 |
MIPS/BFD: Remove duplicate NewABI JALR relocation handling
Remove separate original NewABI JALR relocation handling, introduced
with commit d06471104a83 ("relax jalr $t9 [R_MIPS_JALR symbol] to bal
symbol"), <https://sourceware.org/ml/binutils/2003-03/msg00394.html>,
and only used by LD with the `--relax' option specified, and rely solely
on `mips_elf_perform_relocation' code, which has been introduced with
commit 1367d393bb74 ("On the RM9000 convert jal to bal if in range"),
<https://www.sourceware.org/ml/binutils/2004-12/msg00088.html> and since
made more complete, across all the three ABIs.
Also remove the `--relax' option, now irrelevant, from the tests added
with the former commit.
bfd/
* elfxx-mips.h (_bfd_mips_relax_section): Remove prototype.
* elfxx-mips.c (_bfd_mips_relax_section): Remove function.
* elf64-mips.c (bfd_elf64_bfd_relax_section): Remove macro.
* elfn32-mips.c (bfd_elf32_bfd_relax_section): Likewise.
ld/
* testsuite/ld-mips-elf/relax-jalr-n32.d: Remove `--relax'
option.
* testsuite/ld-mips-elf/relax-jalr-n32-shared.d: Likewise.
* testsuite/ld-mips-elf/relax-jalr-n64.d: Likewise.
* testsuite/ld-mips-elf/relax-jalr-n64-shared.d: Likewise.
Diffstat (limited to 'bfd')
-rw-r--r-- | bfd/ChangeLog | 7 | ||||
-rw-r--r-- | bfd/elf64-mips.c | 1 | ||||
-rw-r--r-- | bfd/elfn32-mips.c | 1 | ||||
-rw-r--r-- | bfd/elfxx-mips.c | 161 | ||||
-rw-r--r-- | bfd/elfxx-mips.h | 2 |
5 files changed, 7 insertions, 165 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 46f5f9c..7435d5a 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,5 +1,12 @@ 2017-02-23 Maciej W. Rozycki <macro@imgtec.com> + * elfxx-mips.h (_bfd_mips_relax_section): Remove prototype. + * elfxx-mips.c (_bfd_mips_relax_section): Remove function. + * elf64-mips.c (bfd_elf64_bfd_relax_section): Remove macro. + * elfn32-mips.c (bfd_elf32_bfd_relax_section): Likewise. + +2017-02-23 Maciej W. Rozycki <macro@imgtec.com> + * elfxx-mips.c (mips_elf_calculate_relocation) <R_MIPS_JALR> <R_MICROMIPS_JALR>: Discard relocation if `cross_mode_jump_p' or misaligned. diff --git a/bfd/elf64-mips.c b/bfd/elf64-mips.c index 5edbd4a..a66c319 100644 --- a/bfd/elf64-mips.c +++ b/bfd/elf64-mips.c @@ -4507,7 +4507,6 @@ const struct elf_size_info mips_elf64_size_info = #define bfd_elf64_canonicalize_reloc mips_elf64_canonicalize_reloc #define bfd_elf64_get_dynamic_reloc_upper_bound mips_elf64_get_dynamic_reloc_upper_bound #define bfd_elf64_canonicalize_dynamic_reloc mips_elf64_canonicalize_dynamic_reloc -#define bfd_elf64_bfd_relax_section _bfd_mips_relax_section #define bfd_elf64_mkobject _bfd_mips_elf_mkobject /* The SGI style (n)64 NewABI. */ diff --git a/bfd/elfn32-mips.c b/bfd/elfn32-mips.c index c09713a..dce7ba1 100644 --- a/bfd/elfn32-mips.c +++ b/bfd/elfn32-mips.c @@ -3721,7 +3721,6 @@ static const struct ecoff_debug_swap mips_elf32_ecoff_debug_swap = { #define bfd_elf32_bfd_set_private_flags _bfd_mips_elf_set_private_flags #define bfd_elf32_bfd_print_private_bfd_data \ _bfd_mips_elf_print_private_bfd_data -#define bfd_elf32_bfd_relax_section _bfd_mips_relax_section #define bfd_elf32_mkobject _bfd_mips_elf_mkobject /* Support for SGI-ish mips targets using n32 ABI. */ diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c index ec086de..9693442 100644 --- a/bfd/elfxx-mips.c +++ b/bfd/elfxx-mips.c @@ -8889,167 +8889,6 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, return TRUE; } -bfd_boolean -_bfd_mips_relax_section (bfd *abfd, asection *sec, - struct bfd_link_info *link_info, - bfd_boolean *again) -{ - Elf_Internal_Rela *internal_relocs; - Elf_Internal_Rela *irel, *irelend; - Elf_Internal_Shdr *symtab_hdr; - bfd_byte *contents = NULL; - size_t extsymoff; - bfd_boolean changed_contents = FALSE; - bfd_vma sec_start = sec->output_section->vma + sec->output_offset; - Elf_Internal_Sym *isymbuf = NULL; - - /* We are not currently changing any sizes, so only one pass. */ - *again = FALSE; - - if (bfd_link_relocatable (link_info)) - return TRUE; - - internal_relocs = _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL, - link_info->keep_memory); - if (internal_relocs == NULL) - return TRUE; - - irelend = internal_relocs + sec->reloc_count - * get_elf_backend_data (abfd)->s->int_rels_per_ext_rel; - symtab_hdr = &elf_tdata (abfd)->symtab_hdr; - extsymoff = (elf_bad_symtab (abfd)) ? 0 : symtab_hdr->sh_info; - - for (irel = internal_relocs; irel < irelend; irel++) - { - bfd_vma symval; - bfd_signed_vma sym_offset; - unsigned int r_type; - unsigned long r_symndx; - asection *sym_sec; - unsigned long instruction; - - /* Turn jalr into bgezal, and jr into beq, if they're marked - with a JALR relocation, that indicate where they jump to. - This saves some pipeline bubbles. */ - r_type = ELF_R_TYPE (abfd, irel->r_info); - if (r_type != R_MIPS_JALR) - continue; - - r_symndx = ELF_R_SYM (abfd, irel->r_info); - /* Compute the address of the jump target. */ - if (r_symndx >= extsymoff) - { - struct mips_elf_link_hash_entry *h - = ((struct mips_elf_link_hash_entry *) - elf_sym_hashes (abfd) [r_symndx - extsymoff]); - - while (h->root.root.type == bfd_link_hash_indirect - || h->root.root.type == bfd_link_hash_warning) - h = (struct mips_elf_link_hash_entry *) h->root.root.u.i.link; - - /* If a symbol is undefined, or if it may be overridden, - skip it. */ - if (! ((h->root.root.type == bfd_link_hash_defined - || h->root.root.type == bfd_link_hash_defweak) - && h->root.root.u.def.section) - || (bfd_link_pic (link_info) && ! link_info->symbolic - && !h->root.forced_local)) - continue; - - sym_sec = h->root.root.u.def.section; - if (sym_sec->output_section) - symval = (h->root.root.u.def.value - + sym_sec->output_section->vma - + sym_sec->output_offset); - else - symval = h->root.root.u.def.value; - } - else - { - Elf_Internal_Sym *isym; - - /* Read this BFD's symbols if we haven't done so already. */ - if (isymbuf == NULL && symtab_hdr->sh_info != 0) - { - isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents; - if (isymbuf == NULL) - isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr, - symtab_hdr->sh_info, 0, - NULL, NULL, NULL); - if (isymbuf == NULL) - goto relax_return; - } - - isym = isymbuf + r_symndx; - if (isym->st_shndx == SHN_UNDEF) - continue; - else if (isym->st_shndx == SHN_ABS) - sym_sec = bfd_abs_section_ptr; - else if (isym->st_shndx == SHN_COMMON) - sym_sec = bfd_com_section_ptr; - else - sym_sec - = bfd_section_from_elf_index (abfd, isym->st_shndx); - symval = isym->st_value - + sym_sec->output_section->vma - + sym_sec->output_offset; - } - - /* Compute branch offset, from delay slot of the jump to the - branch target. */ - sym_offset = (symval + irel->r_addend) - - (sec_start + irel->r_offset + 4); - - /* Branch offset must be properly aligned. */ - if ((sym_offset & 3) != 0) - continue; - - sym_offset >>= 2; - - /* Check that it's in range. */ - if (sym_offset < -0x8000 || sym_offset >= 0x8000) - continue; - - /* Get the section contents if we haven't done so already. */ - if (!mips_elf_get_section_contents (abfd, sec, &contents)) - goto relax_return; - - instruction = bfd_get_32 (abfd, contents + irel->r_offset); - - /* If it was jalr <reg>, turn it into bgezal $zero, <target>. */ - if ((instruction & 0xfc1fffff) == 0x0000f809) - instruction = 0x04110000; - /* If it was jr <reg>, turn it into b <target>. */ - else if ((instruction & 0xfc1fffff) == 0x00000008) - instruction = 0x10000000; - else - continue; - - instruction |= (sym_offset & 0xffff); - bfd_put_32 (abfd, instruction, contents + irel->r_offset); - changed_contents = TRUE; - } - - if (contents != NULL - && elf_section_data (sec)->this_hdr.contents != contents) - { - if (!changed_contents && !link_info->keep_memory) - free (contents); - else - { - /* Cache the section contents for elf_link_input_bfd. */ - elf_section_data (sec)->this_hdr.contents = contents; - } - } - return TRUE; - - relax_return: - if (contents != NULL - && elf_section_data (sec)->this_hdr.contents != contents) - free (contents); - return FALSE; -} - /* Allocate space for global sym dynamic relocs. */ static bfd_boolean diff --git a/bfd/elfxx-mips.h b/bfd/elfxx-mips.h index fa5b5d2..32d8e91 100644 --- a/bfd/elfxx-mips.h +++ b/bfd/elfxx-mips.h @@ -139,8 +139,6 @@ extern bfd_reloc_status_type _bfd_mips_elf_generic_reloc (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); extern unsigned long _bfd_elf_mips_mach (flagword); -extern bfd_boolean _bfd_mips_relax_section - (bfd *, asection *, struct bfd_link_info *, bfd_boolean *); extern bfd_vma _bfd_mips_elf_sign_extend (bfd_vma, int); extern void _bfd_mips_elf_merge_symbol_attribute |