aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaciej W. Rozycki <macro@imgtec.com>2017-02-23 22:27:50 +0000
committerMaciej W. Rozycki <macro@imgtec.com>2017-02-23 23:49:14 +0000
commit5d58c7337972bb24caea7598d0ae4d461b0fc22b (patch)
tree96686077f399e4fa5f176c269f0c014c3352cd84
parentMIPS/BFD: Discard ineligible JALR relocations right away (diff)
downloadbinutils-gdb-5d58c7337972bb24caea7598d0ae4d461b0fc22b.tar.gz
binutils-gdb-5d58c7337972bb24caea7598d0ae4d461b0fc22b.tar.bz2
binutils-gdb-5d58c7337972bb24caea7598d0ae4d461b0fc22b.zip
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.
-rw-r--r--bfd/ChangeLog7
-rw-r--r--bfd/elf64-mips.c1
-rw-r--r--bfd/elfn32-mips.c1
-rw-r--r--bfd/elfxx-mips.c161
-rw-r--r--bfd/elfxx-mips.h2
-rw-r--r--ld/ChangeLog8
-rw-r--r--ld/testsuite/ld-mips-elf/relax-jalr-n32-shared.d2
-rw-r--r--ld/testsuite/ld-mips-elf/relax-jalr-n32.d2
-rw-r--r--ld/testsuite/ld-mips-elf/relax-jalr-n64-shared.d2
-rw-r--r--ld/testsuite/ld-mips-elf/relax-jalr-n64.d2
10 files changed, 19 insertions, 169 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 46f5f9cfdc2..7435d5abdcf 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 5edbd4a5d3f..a66c31977e5 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 c09713ad532..dce7ba1c7a0 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 ec086de76ef..9693442fbf0 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 fa5b5d2de93..32d8e91707c 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
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 3e88456a179..420a9ab5b1d 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,5 +1,13 @@
2017-02-23 Maciej W. Rozycki <macro@imgtec.com>
+ * 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.
+
+2017-02-23 Maciej W. Rozycki <macro@imgtec.com>
+
* testsuite/ld-mips-elf/jalr4.dd: New test.
* testsuite/ld-mips-elf/mips-elf.exp: Run the new test.
diff --git a/ld/testsuite/ld-mips-elf/relax-jalr-n32-shared.d b/ld/testsuite/ld-mips-elf/relax-jalr-n32-shared.d
index 3b564412d5c..2eb81522319 100644
--- a/ld/testsuite/ld-mips-elf/relax-jalr-n32-shared.d
+++ b/ld/testsuite/ld-mips-elf/relax-jalr-n32-shared.d
@@ -2,7 +2,7 @@
#source: relax-jalr.s
#as: -march=from-abi -KPIC -n32 -EB
#objdump: --prefix-addresses -d --show-raw-insn
-#ld: --relax -shared -melf32btsmipn32
+#ld: -shared -melf32btsmipn32
.*: file format elf.*mips.*
diff --git a/ld/testsuite/ld-mips-elf/relax-jalr-n32.d b/ld/testsuite/ld-mips-elf/relax-jalr-n32.d
index 3a4b0b6bb9d..b0ea9c0cf31 100644
--- a/ld/testsuite/ld-mips-elf/relax-jalr-n32.d
+++ b/ld/testsuite/ld-mips-elf/relax-jalr-n32.d
@@ -2,7 +2,7 @@
#source: relax-jalr.s
#as: -march=from-abi -KPIC -n32 -EB
#objdump: --prefix-addresses -d --show-raw-insn
-#ld: --relax -melf32btsmipn32
+#ld: -melf32btsmipn32
.*: file format elf.*mips.*
diff --git a/ld/testsuite/ld-mips-elf/relax-jalr-n64-shared.d b/ld/testsuite/ld-mips-elf/relax-jalr-n64-shared.d
index c0138ea06f9..fcb0b126e31 100644
--- a/ld/testsuite/ld-mips-elf/relax-jalr-n64-shared.d
+++ b/ld/testsuite/ld-mips-elf/relax-jalr-n64-shared.d
@@ -2,7 +2,7 @@
#source: relax-jalr.s
#as: -march=from-abi -KPIC -64 -EB
#objdump: --prefix-addresses -d --show-raw-insn
-#ld: --relax -shared -melf64btsmip
+#ld: -shared -melf64btsmip
.*: file format elf.*mips.*
diff --git a/ld/testsuite/ld-mips-elf/relax-jalr-n64.d b/ld/testsuite/ld-mips-elf/relax-jalr-n64.d
index 6b4f3f5992b..e3518ba0121 100644
--- a/ld/testsuite/ld-mips-elf/relax-jalr-n64.d
+++ b/ld/testsuite/ld-mips-elf/relax-jalr-n64.d
@@ -2,7 +2,7 @@
#source: relax-jalr.s
#as: -march=from-abi -KPIC -64 -EB
#objdump: --prefix-addresses -d --show-raw-insn
-#ld: --relax -melf64btsmip
+#ld: -melf64btsmip
.*: file format elf.*mips.*