]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
Simplify ppc64 code setting toc_off.
authorAlan Modra <amodra@gmail.com>
Wed, 30 Oct 2013 07:00:43 +0000 (17:30 +1030)
committerAlan Modra <amodra@gmail.com>
Fri, 15 Nov 2013 05:18:09 +0000 (15:48 +1030)
(cherry picked from commit 8b974ba3e8216b7f6659d2803444e0ddceaeded7)

bfd/ChangeLog
bfd/elf64-ppc.c

index f5a4cb32cb229aed4f9acdcded6afcf8ec8d2b32..07060519cd11afdf951fc66e7f6e737f81133808 100644 (file)
@@ -1,6 +1,10 @@
 2013-11-15  Alan Modra  <amodra@gmail.com>
 
        Apply changes from mainline to 2.24
+       2013-11-02  Alan Modra  <amodra@gmail.com>
+       * elf64-ppc.c (ppc64_elf_next_input_section): Always set toc_off
+       to value for object file.
+
        2013-10-30  Alan Modra  <amodra@gmail.com>
        * elf32-ppc.c (ppc_elf_size_dynamic_sections): Use new DT_PPC_OPT
        tag to specify tls optimisation.
index 6a8ec513468814f83616f3abd581dd27ef238a3f..7f690efcdcdba549b9f91189434f9a30316ccd99 100644 (file)
@@ -11508,42 +11508,25 @@ ppc64_elf_next_input_section (struct bfd_link_info *info, asection *isec)
 
   if (htab->multi_toc_needed)
     {
-      /* If a code section has a function that uses the TOC then we need
-        to use the right TOC (obviously).  Also, make sure that .opd gets
-        the correct TOC value for R_PPC64_TOC relocs that don't have or
-        can't find their function symbol (shouldn't ever happen now).
-        Also specially treat .fixup for the linux kernel.  .fixup
-        contains branches, but only back to the function that hit an
-        exception.  */
-      if (isec->has_toc_reloc
-         || (isec->flags & SEC_CODE) == 0
-         || strcmp (isec->name, ".fixup") == 0)
-       {
-         if (elf_gp (isec->owner) != 0)
-           htab->toc_curr = elf_gp (isec->owner);
-       }
-      else
-       {
-         if (!isec->call_check_done
-             && toc_adjusting_stub_needed (info, isec) < 0)
+      /* Analyse sections that aren't already flagged as needing a
+        valid toc pointer.  Exclude .fixup for the linux kernel.
+        .fixup contains branches, but only back to the function that
+        hit an exception.  */
+      if (!(isec->has_toc_reloc
+           || (isec->flags & SEC_CODE) == 0
+           || strcmp (isec->name, ".fixup") == 0
+           || isec->call_check_done))
+       {
+         if (toc_adjusting_stub_needed (info, isec) < 0)
            return FALSE;
-         /* If we make a local call from this section, ie. a branch
-            without a following nop, then we have no place to put a
-            toc restoring insn.  We must use the same toc group as
-            the callee.
-            Testing makes_toc_func_call actually tests for *any*
-            calls to functions that need a good toc pointer.  A more
-            precise test would be better, as this one will set
-            incorrect values for pasted .init/.fini fragments.
-            (Fixed later in check_pasted_section.)  */
-         if (isec->makes_toc_func_call
-             && elf_gp (isec->owner) != 0)
-           htab->toc_curr = elf_gp (isec->owner);
-       }
-    }
-
-  /* Functions that don't use the TOC can belong in any TOC group.
-     Use the last TOC base.  */
+       }
+      /* Make all sections use the TOC assigned for this object file.
+        This will be wrong for pasted sections;  We fix that in
+        check_pasted_section().  */
+      if (elf_gp (isec->owner) != 0)
+       htab->toc_curr = elf_gp (isec->owner);
+    }
+
   htab->stub_group[isec->id].toc_off = htab->toc_curr;
   return TRUE;
 }