From 7bd52534211c4f3cb648dc23cbc5b158612f283b Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Wed, 30 Oct 2013 17:30:43 +1030 Subject: [PATCH] Simplify ppc64 code setting toc_off. (cherry picked from commit 8b974ba3e8216b7f6659d2803444e0ddceaeded7) --- bfd/ChangeLog | 4 ++++ bfd/elf64-ppc.c | 53 +++++++++++++++++-------------------------------- 2 files changed, 22 insertions(+), 35 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index f5a4cb32cb2..07060519cd1 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,6 +1,10 @@ 2013-11-15 Alan Modra Apply changes from mainline to 2.24 + 2013-11-02 Alan Modra + * elf64-ppc.c (ppc64_elf_next_input_section): Always set toc_off + to value for object file. + 2013-10-30 Alan Modra * elf32-ppc.c (ppc_elf_size_dynamic_sections): Use new DT_PPC_OPT tag to specify tls optimisation. diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c index 6a8ec513468..7f690efcdcd 100644 --- a/bfd/elf64-ppc.c +++ b/bfd/elf64-ppc.c @@ -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; } -- 2.47.3