]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
* elf64-ppc.c (has_small_toc_reloc): Don't define.
authorAlan Modra <amodra@gmail.com>
Tue, 9 Feb 2010 12:08:19 +0000 (12:08 +0000)
committerAlan Modra <amodra@gmail.com>
Tue, 9 Feb 2010 12:08:19 +0000 (12:08 +0000)
(makes_toc_func_call, call_check_in_progress): Shuffle flags.
(struct ppc64_elf_obj_tdata): Add has_small_toc_reloc.  Update
code setting the flag.
(ppc64_elf_next_toc_section): Group big-toc sections in
0x80008000 chunks.

bfd/ChangeLog
bfd/elf64-ppc.c

index 97881de0ab0a84e0e19d5ec0a98b246db472f20d..ceca41626f7d2a4a435cbbc8ff5dba8495f3bb87 100644 (file)
@@ -6,6 +6,13 @@
 
        * elf64-ppc.c (ppc64_elf_layout_multitoc): Don't merge local got ents.
 
+       * elf64-ppc.c (has_small_toc_reloc): Don't define.
+       (makes_toc_func_call, call_check_in_progress): Shuffle flags.
+       (struct ppc64_elf_obj_tdata): Add has_small_toc_reloc.  Update
+       code setting the flag.
+       (ppc64_elf_next_toc_section): Group big-toc sections in
+       0x80008000 chunks.
+
 2010-02-08  David S. Miller  <davem@davemloft.net>
 
        * elfxx-sparc.h (struct _bfd_sparc_elf_link_hash_table): Remove sgot,
index f44c73335e5a7c731683aefe4cf346387ba5d969..15ccf32ab3ecbd60ce5f2e9219f60e386f728f96 100644 (file)
@@ -2592,6 +2592,10 @@ struct ppc64_elf_obj_tdata
 
   /* A copy of relocs before they are modified for --emit-relocs.  */
   Elf_Internal_Rela *opd_relocs;
+
+  /* Nonzero if this bfd has small toc/got relocs, ie. that expect
+     the reloc to be in the range -32768 to 32767.  */
+  unsigned int has_small_toc_reloc;
 };
 
 #define ppc64_elf_tdata(bfd) \
@@ -3810,16 +3814,12 @@ struct ppc_link_hash_table
 /* Nonzero if this section has any toc or got relocs.  */
 #define has_toc_reloc sec_flg2
 
-/* Nonzero if this section has small toc/got relocs, ie. that expect
-   the reloc to be in the range -32768 to 32767.  */
-#define has_small_toc_reloc sec_flg3
-
 /* Nonzero if this section has a call to another section that uses
    the toc or got.  */
-#define makes_toc_func_call sec_flg4
+#define makes_toc_func_call sec_flg3
 
 /* Recursion protection when determining above flag.  */
-#define call_check_in_progress sec_flg5
+#define call_check_in_progress sec_flg4
 
 /* Get the ppc64 ELF linker hash table from a link_info structure.  */
 
@@ -5023,7 +5023,7 @@ ppc64_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
              || r_type == R_PPC64_GOT16_DS)
            {
              htab->do_multi_toc = 1;
-             sec->has_small_toc_reloc = 1;
+             ppc64_elf_tdata (abfd)->has_small_toc_reloc = 1;
            }
 
          if (ppc64_elf_tdata (abfd)->got == NULL
@@ -5124,7 +5124,7 @@ ppc64_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
        case R_PPC64_TOC16:
        case R_PPC64_TOC16_DS:
          htab->do_multi_toc = 1;
-         sec->has_small_toc_reloc = 1;
+         ppc64_elf_tdata (abfd)->has_small_toc_reloc = 1;
        case R_PPC64_TOC16_LO:
        case R_PPC64_TOC16_HI:
        case R_PPC64_TOC16_HA:
@@ -9790,7 +9790,7 @@ bfd_boolean
 ppc64_elf_next_toc_section (struct bfd_link_info *info, asection *isec)
 {
   struct ppc_link_hash_table *htab = ppc_hash_table (info);
-  bfd_vma addr, off;
+  bfd_vma addr, off, limit;
 
   if (htab == NULL)
     return FALSE;
@@ -9806,7 +9806,10 @@ ppc64_elf_next_toc_section (struct bfd_link_info *info, asection *isec)
 
       addr = isec->output_offset + isec->output_section->vma;
       off = addr - htab->toc_curr;
-      if (off + isec->size > 0x10000)
+      limit = 0x80008000;
+      if (ppc64_elf_tdata (isec->owner)->has_small_toc_reloc)
+       limit = 0x10000;
+      if (off + isec->size > limit)
        {
          addr = (htab->toc_first_sec->output_offset
                  + htab->toc_first_sec->output_section->vma);