diff options
Diffstat (limited to 'bfd/elf32-cris.c')
-rw-r--r-- | bfd/elf32-cris.c | 188 |
1 files changed, 0 insertions, 188 deletions
diff --git a/bfd/elf32-cris.c b/bfd/elf32-cris.c index 387c7c7..012e663 100644 --- a/bfd/elf32-cris.c +++ b/bfd/elf32-cris.c @@ -2456,193 +2456,6 @@ cris_elf_gc_mark_hook (asection *sec, return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym); } -/* Update the got entry reference counts for the section being removed. */ - -static bfd_boolean -cris_elf_gc_sweep_hook (bfd *abfd, - struct bfd_link_info *info, - asection *sec, - const Elf_Internal_Rela *relocs) -{ - struct elf_cris_link_hash_table * htab; - Elf_Internal_Shdr *symtab_hdr; - struct elf_link_hash_entry **sym_hashes; - bfd_signed_vma *local_got_refcounts; - const Elf_Internal_Rela *rel, *relend; - bfd *dynobj; - asection *sgot; - asection *srelgot; - - if (bfd_link_relocatable (info)) - return TRUE; - - dynobj = elf_hash_table (info)->dynobj; - if (dynobj == NULL) - return TRUE; - - htab = elf_cris_hash_table (info); - if (htab == NULL) - return FALSE; - - symtab_hdr = &elf_tdata (abfd)->symtab_hdr; - sym_hashes = elf_sym_hashes (abfd); - local_got_refcounts = elf_local_got_refcounts (abfd); - - sgot = htab->root.sgot; - srelgot = htab->root.srelgot; - - relend = relocs + sec->reloc_count; - for (rel = relocs; rel < relend; rel++) - { - unsigned long r_symndx; - struct elf_link_hash_entry *h = NULL; - bfd_signed_vma got_element_size = 4; - bfd_signed_vma *specific_refcount = NULL; - enum elf_cris_reloc_type r_type; - - r_symndx = ELF32_R_SYM (rel->r_info); - if (r_symndx >= symtab_hdr->sh_info) - { - h = sym_hashes[r_symndx - symtab_hdr->sh_info]; - while (h->root.type == bfd_link_hash_indirect - || h->root.type == bfd_link_hash_warning) - h = (struct elf_link_hash_entry *) h->root.u.i.link; - } - - r_type = ELF32_R_TYPE (rel->r_info); - switch (r_type) - { - case R_CRIS_32_GOT: - case R_CRIS_16_GOT: - case R_CRIS_16_GOTPLT: - case R_CRIS_32_GOTPLT: - specific_refcount = h != NULL - ? &((struct elf_cris_link_hash_entry *) h)->reg_got_refcount - : &local_got_refcounts[LGOT_REG_NDX (r_symndx)]; - break; - - case R_CRIS_32_GD: - case R_CRIS_32_GOT_GD: - case R_CRIS_16_GOT_GD: - got_element_size = 8; - specific_refcount = h != NULL - ? &((struct elf_cris_link_hash_entry *) h)->dtp_refcount - : &local_got_refcounts[LGOT_DTP_NDX (r_symndx)]; - break; - - case R_CRIS_32_IE: - case R_CRIS_16_GOT_TPREL: - case R_CRIS_32_GOT_TPREL: - specific_refcount = h != NULL - ? &((struct elf_cris_link_hash_entry *) h)->tprel_refcount - : &local_got_refcounts[LGOT_TPREL_NDX (r_symndx)]; - break; - - default: - break; - } - - switch (r_type) - { - case R_CRIS_32_IE: - case R_CRIS_32_GD: - case R_CRIS_16_GOT_TPREL: - case R_CRIS_32_GOT_TPREL: - case R_CRIS_32_GOT_GD: - case R_CRIS_16_GOT_GD: - case R_CRIS_16_GOT: - case R_CRIS_32_GOT: - if (h != NULL) - { - /* If the counters are 0 when we got here, we've - miscounted somehow somewhere, an internal error. */ - BFD_ASSERT (h->got.refcount > 0); - --h->got.refcount; - - BFD_ASSERT (*specific_refcount > 0); - --*specific_refcount; - if (*specific_refcount == 0) - { - /* We don't need the .got entry any more. */ - sgot->size -= got_element_size; - srelgot->size -= sizeof (Elf32_External_Rela); - } - break; - } - - local_got_reloc: - if (local_got_refcounts != NULL) - { - /* If the counters are 0 when we got here, we've - miscounted somehow somewhere, an internal error. */ - BFD_ASSERT (local_got_refcounts[r_symndx] > 0); - --local_got_refcounts[r_symndx]; - - BFD_ASSERT (*specific_refcount > 0); - --*specific_refcount; - if (*specific_refcount == 0) - { - /* We don't need the .got entry any more. */ - sgot->size -= got_element_size; - if (bfd_link_pic (info)) - srelgot->size -= sizeof (Elf32_External_Rela); - } - } - break; - - case R_CRIS_16_GOTPLT: - case R_CRIS_32_GOTPLT: - /* For local symbols, treat these like GOT relocs. */ - if (h == NULL) - goto local_got_reloc; - else - /* For global symbols, adjust the reloc-specific refcount. */ - elf_cris_hash_entry (h)->gotplt_refcount--; - /* Fall through. */ - - case R_CRIS_32_PLT_GOTREL: - /* FIXME: We don't garbage-collect away the .got section. */ - if (local_got_refcounts != NULL) - local_got_refcounts[-1]--; - /* Fall through. */ - - case R_CRIS_8: - case R_CRIS_16: - case R_CRIS_32: - case R_CRIS_8_PCREL: - case R_CRIS_16_PCREL: - case R_CRIS_32_PCREL: - case R_CRIS_32_PLT_PCREL: - /* Negate the increment we did in cris_elf_check_relocs. */ - if (h != NULL) - { - if (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT - && h->plt.refcount > 0) - --h->plt.refcount; - } - break; - - case R_CRIS_32_DTPREL: - /* This'd be a .dtpreld entry in e.g. debug info. */ - if ((sec->flags & SEC_ALLOC) == 0) - break; - /* Fall through. */ - case R_CRIS_16_DTPREL: - htab->dtpmod_refcount--; - if (htab->dtpmod_refcount == 0) - htab->next_gotplt_entry -= 8; - BFD_ASSERT (local_got_refcounts != NULL); - local_got_refcounts[-1]--; - break; - - default: - break; - } - } - - return TRUE; -} - /* The elf_backend_plt_sym_val hook function. */ static bfd_vma @@ -4297,7 +4110,6 @@ elf_cris_got_elt_size (bfd *abfd ATTRIBUTE_UNUSED, #define elf_info_to_howto cris_info_to_howto_rela #define elf_backend_relocate_section cris_elf_relocate_section #define elf_backend_gc_mark_hook cris_elf_gc_mark_hook -#define elf_backend_gc_sweep_hook cris_elf_gc_sweep_hook #define elf_backend_plt_sym_val cris_elf_plt_sym_val #define elf_backend_check_relocs cris_elf_check_relocs #define elf_backend_grok_prstatus cris_elf_grok_prstatus |