From e46b0fa84db6e5360c16e13505863d56abb8e441 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Mon, 9 Aug 2004 00:54:28 +0000 Subject: [PATCH] * elf64-ppc.c (struct ppc_link_hash_table): Remove have_undefweak. (func_desc_adjust): Don't set have_undefweak. (ppc64_elf_func_desc_adjust): Don't add an extr nop to sfpr. (ppc64_elf_relocate_section): NOP out calls to undefweak functions. --- bfd/ChangeLog | 5 +++++ bfd/elf64-ppc.c | 45 +++++++++------------------------------------ 2 files changed, 14 insertions(+), 36 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index c0b19d3d37..a2bf677acb 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,5 +1,10 @@ 2004-08-09 Alan Modra + * elf64-ppc.c (struct ppc_link_hash_table): Remove have_undefweak. + (func_desc_adjust): Don't set have_undefweak. + (ppc64_elf_func_desc_adjust): Don't add an extr nop to sfpr. + (ppc64_elf_relocate_section): NOP out calls to undefweak functions. + * elf64-ppc.c (struct ppc_link_hash_entry): Make "oh" a "struct ppc_link_hash_entry *". Adjust all references. (ppc64_elf_hide_symbol): Correct a comment. diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c index e314d97f30..c32eba4a32 100644 --- a/bfd/elf64-ppc.c +++ b/bfd/elf64-ppc.c @@ -2872,9 +2872,6 @@ struct ppc_link_hash_table select suitable defaults for the stub group size. */ unsigned int has_14bit_branch; - /* Set if we detect a reference undefined weak symbol. */ - unsigned int have_undefweak; - /* Incremented every time we size stubs. */ unsigned int stub_iteration; @@ -4355,10 +4352,6 @@ func_desc_adjust (struct elf_link_hash_entry *h, void *inf) if (!fh->is_func) return TRUE; - if (fh->elf.root.type == bfd_link_hash_undefweak - && (fh->elf.elf_link_hash_flags & ELF_LINK_HASH_REF_REGULAR)) - htab->have_undefweak = TRUE; - for (ent = fh->elf.plt.plist; ent != NULL; ent = ent->next) if (ent->plt.refcount > 0) break; @@ -4525,13 +4518,8 @@ ppc64_elf_func_desc_adjust (bfd *obfd ATTRIBUTE_UNUSED, if (htab->sfpr->size == 0) { - if (!htab->have_undefweak) - { - _bfd_strip_section_from_output (info, htab->sfpr); - return TRUE; - } - - htab->sfpr->size = 4; + _bfd_strip_section_from_output (info, htab->sfpr); + return TRUE; } p = bfd_alloc (htab->elf.dynobj, htab->sfpr->size); @@ -4559,11 +4547,8 @@ ppc64_elf_func_desc_adjust (bfd *obfd ATTRIBUTE_UNUSED, bfd_put_32 (htab->elf.dynobj, LFD_FR0_0R1 + fpr + stackoff, p); p += 4; } - if (lowest_restf <= MAX_SAVE_FPR - || htab->sfpr->size == 4) - { - bfd_put_32 (htab->elf.dynobj, BLR, p); - } + if (lowest_restf <= MAX_SAVE_FPR) + bfd_put_32 (htab->elf.dynobj, BLR, p); return TRUE; } @@ -7988,28 +7973,16 @@ ppc64_elf_relocate_section (bfd *output_bfd, } } + /* NOP out calls to undefined weak functions. + We can thus call a weak function without first + checking whether the function is defined. */ if (h != NULL && h->root.type == bfd_link_hash_undefweak && relocation == 0 && rel->r_addend == 0) { - /* Tweak calls to undefined weak functions to point at a - blr. We can thus call a weak function without first - checking whether the function is defined. We have a - blr at the end of .sfpr. */ - BFD_ASSERT (htab->sfpr->size != 0); - relocation = (htab->sfpr->size - 4 - + htab->sfpr->output_offset - + htab->sfpr->output_section->vma); - from = (rel->r_offset - + input_section->output_offset - + input_section->output_section->vma); - - /* But let's not be silly about it. If the blr isn't in - reach, just go to the next instruction. */ - if (relocation - from + (1 << 25) >= (1 << 26) - || htab->sfpr->size == 0) - relocation = from + 4; + bfd_put_32 (output_bfd, NOP, contents + rel->r_offset); + continue; } break; } -- 2.11.0