aboutsummaryrefslogtreecommitdiff
path: root/bfd/elf64-ppc.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2010-02-09 12:08:19 +0000
committerAlan Modra <amodra@gmail.com>2010-02-09 12:08:19 +0000
commitd77c8a4bbe737a06b9005f8e241102be365ede38 (patch)
tree1a86e5dbc1ea8dd1d179b8e6e7d8f92108add197 /bfd/elf64-ppc.c
parentd0fae19df2b768f3a3a1462acd52f03b55ec881a (diff)
downloadgdb-d77c8a4bbe737a06b9005f8e241102be365ede38.zip
gdb-d77c8a4bbe737a06b9005f8e241102be365ede38.tar.gz
gdb-d77c8a4bbe737a06b9005f8e241102be365ede38.tar.bz2
* 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.
Diffstat (limited to 'bfd/elf64-ppc.c')
-rw-r--r--bfd/elf64-ppc.c23
1 files changed, 13 insertions, 10 deletions
diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c
index f44c733..15ccf32 100644
--- a/bfd/elf64-ppc.c
+++ b/bfd/elf64-ppc.c
@@ -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);