powerpc TLS in PIEs
[deliverable/binutils-gdb.git] / bfd / elf32-cris.c
index 387c7c7475b7a76e98b29bac6d640734c014d518..012e663c3636461416e47b2b2e1ab4ad21abfed5 100644 (file)
@@ -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
This page took 0.025138 seconds and 4 git commands to generate.