This is the mail archive of the binutils-cvs@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] MIPS/BFD: Remove duplicate NewABI JALR relocation handling


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=5d58c7337972bb24caea7598d0ae4d461b0fc22b

commit 5d58c7337972bb24caea7598d0ae4d461b0fc22b
Author: Maciej W. Rozycki <macro@imgtec.com>
Date:   Thu Feb 23 22:27:50 2017 +0000

    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.

Diff:
---
 bfd/ChangeLog                                    |   7 +
 bfd/elf64-mips.c                                 |   1 -
 bfd/elfn32-mips.c                                |   1 -
 bfd/elfxx-mips.c                                 | 161 -----------------------
 bfd/elfxx-mips.h                                 |   2 -
 ld/ChangeLog                                     |   8 ++
 ld/testsuite/ld-mips-elf/relax-jalr-n32-shared.d |   2 +-
 ld/testsuite/ld-mips-elf/relax-jalr-n32.d        |   2 +-
 ld/testsuite/ld-mips-elf/relax-jalr-n64-shared.d |   2 +-
 ld/testsuite/ld-mips-elf/relax-jalr-n64.d        |   2 +-
 10 files changed, 19 insertions(+), 169 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
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 3e88456..420a9ab 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 3b56441..2eb8152 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 3a4b0b6..b0ea9c0 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 c0138ea..fcb0b12 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 6b4f3f5..e3518ba 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.*


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]