]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blobdiff - bfd/elf32-tilepro.c
Copyright update for binutils
[thirdparty/binutils-gdb.git] / bfd / elf32-tilepro.c
index db37403b7f8c17736125bce6b258fc1af917cb58..0439800c4adfe2f4a15ff45f51c820586175db06 100644 (file)
@@ -1,5 +1,5 @@
 /* TILEPro-specific support for 32-bit ELF.
-   Copyright 2011, 2012 Free Software Foundation, Inc.
+   Copyright (C) 2011-2016 Free Software Foundation, Inc.
 
    This file is part of BFD, the Binary File Descriptor library.
 
@@ -34,11 +34,11 @@ static reloc_howto_type tilepro_elf_howto_table [] =
   /* This reloc does nothing.  */
   HOWTO (R_TILEPRO_NONE,       /* type */
         0,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
-        32,                    /* bitsize */
+        3,                     /* size (0 = byte, 1 = short, 2 = long) */
+        0,                     /* bitsize */
         FALSE,                 /* pc_relative */
         0,                     /* bitpos */
-        complain_overflow_bitfield, /* complain_on_overflow */
+        complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_TILEPRO_NONE",      /* name */
         FALSE,                 /* partial_inplace */
@@ -774,7 +774,7 @@ tilepro_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED,
 {
   unsigned int i;
 
-  for (i = ARRAY_SIZE (tilepro_reloc_map); --i;)
+  for (i = ARRAY_SIZE (tilepro_reloc_map); i--;)
     {
       const reloc_map * entry;
 
@@ -944,11 +944,11 @@ tilepro_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
     return FALSE;
 
   /* pr_cursig */
-  elf_tdata (abfd)->core_signal =
+  elf_tdata (abfd)->core->signal =
     bfd_get_16 (abfd, note->descdata + TILEPRO_PRSTATUS_OFFSET_PR_CURSIG);
 
   /* pr_pid */
-  elf_tdata (abfd)->core_pid =
+  elf_tdata (abfd)->core->pid =
     bfd_get_32 (abfd, note->descdata + TILEPRO_PRSTATUS_OFFSET_PR_PID);
 
   /* pr_reg */
@@ -966,11 +966,11 @@ tilepro_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
   if (note->descsz != TILEPRO_PRPSINFO_SIZEOF)
     return FALSE;
 
-  elf_tdata (abfd)->core_program
+  elf_tdata (abfd)->core->program
     = _bfd_elfcore_strndup (abfd,
                            note->descdata + TILEPRO_PRPSINFO_OFFSET_PR_FNAME,
                            16);
-  elf_tdata (abfd)->core_command
+  elf_tdata (abfd)->core->command
     = _bfd_elfcore_strndup (abfd,
                            note->descdata + TILEPRO_PRPSINFO_OFFSET_PR_PSARGS,
                            ELF_PR_PSARGS_SIZE);
@@ -980,7 +980,7 @@ tilepro_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
      onto the end of the args in some (at least one anyway)
      implementations, so strip it off if it exists.  */
   {
-    char *command = elf_tdata (abfd)->core_command;
+    char *command = elf_tdata (abfd)->core->command;
     int n = strlen (command);
 
     if (0 < n && command[n - 1] == ' ')
@@ -1308,11 +1308,11 @@ tilepro_elf_create_dynamic_sections (bfd *dynobj,
     return FALSE;
 
   htab->sdynbss = bfd_get_linker_section (dynobj, ".dynbss");
-  if (!info->shared)
+  if (!bfd_link_pic (info))
     htab->srelbss = bfd_get_linker_section (dynobj, ".rela.bss");
 
   if (!htab->elf.splt || !htab->elf.srelplt || !htab->sdynbss
-      || (!info->shared && !htab->srelbss))
+      || (!bfd_link_pic (info) && !htab->srelbss))
     abort ();
 
   return TRUE;
@@ -1454,7 +1454,7 @@ static int
 tilepro_elf_tls_transition (struct bfd_link_info *info, int r_type,
                            int is_local)
 {
-  if (info->shared)
+  if (bfd_link_pic (info))
     return r_type;
 
   if (is_local)
@@ -1479,7 +1479,7 @@ tilepro_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
   asection *sreloc;
   int num_relocs;
 
-  if (info->relocatable)
+  if (bfd_link_relocatable (info))
     return TRUE;
 
   htab = tilepro_elf_hash_table (info);
@@ -1521,6 +1521,10 @@ tilepro_elf_check_relocs (bfd *abfd, struct bfd_link_info *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;
+
+         /* PR15323, ref flags aren't set for references in the same
+            object.  */
+         h->root.non_ir_ref = 1;
        }
 
       r_type = tilepro_elf_tls_transition (info, r_type, h == NULL);
@@ -1534,7 +1538,7 @@ tilepro_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
         case R_TILEPRO_IMM16_X1_TLS_LE_HI:
         case R_TILEPRO_IMM16_X0_TLS_LE_HA:
         case R_TILEPRO_IMM16_X1_TLS_LE_HA:
-         if (info->shared)
+         if (bfd_link_pic (info))
            goto r_tilepro_plt32;
          break;
 
@@ -1546,7 +1550,7 @@ tilepro_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
         case R_TILEPRO_IMM16_X1_TLS_GD_HI:
         case R_TILEPRO_IMM16_X0_TLS_GD_HA:
         case R_TILEPRO_IMM16_X1_TLS_GD_HA:
-         BFD_ASSERT (info->shared);
+         BFD_ASSERT (bfd_link_pic (info));
          tls_type = GOT_TLS_GD;
           goto have_got_reference;
 
@@ -1559,7 +1563,7 @@ tilepro_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
         case R_TILEPRO_IMM16_X0_TLS_IE_HA:
         case R_TILEPRO_IMM16_X1_TLS_IE_HA:
           tls_type = GOT_TLS_IE;
-          if (info->shared)
+          if (bfd_link_pic (info))
             info->flags |= DF_STATIC_TLS;
           goto have_got_reference;
 
@@ -1644,7 +1648,7 @@ tilepro_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
          break;
 
        case R_TILEPRO_TLS_GD_CALL:
-         if (info->shared)
+         if (bfd_link_pic (info))
            {
              /* These are basically R_TILEPRO_JOFFLONG_X1_PLT relocs
                 against __tls_get_addr.  */
@@ -1733,7 +1737,7 @@ tilepro_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
               h->non_got_ref = 1;
 
        r_tilepro_plt32:
-         if (h != NULL && !info->shared)
+         if (h != NULL && !bfd_link_pic (info))
            {
              /* We may need a .plt entry if the function this reloc
                 refers to is in a shared lib.  */
@@ -1761,14 +1765,14 @@ tilepro_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
             may need to keep relocations for symbols satisfied by a
             dynamic library if we manage to avoid copy relocs for the
             symbol.  */
-         if ((info->shared
+         if ((bfd_link_pic (info)
               && (sec->flags & SEC_ALLOC) != 0
               && (! tilepro_elf_howto_table[r_type].pc_relative
                   || (h != NULL
                       && (! info->symbolic
                           || h->root.type == bfd_link_hash_defweak
                           || !h->def_regular))))
-             || (!info->shared
+             || (!bfd_link_pic (info)
                  && (sec->flags & SEC_ALLOC) != 0
                  && h != NULL
                  && (h->root.type == bfd_link_hash_defweak
@@ -1876,8 +1880,8 @@ tilepro_elf_gc_mark_hook (asection *sec,
     }
 
   /* FIXME: The test here, in check_relocs and in relocate_section
-     dealing with TLS optimization, ought to be !info->executable.  */
-  if (info->shared)
+     dealing with TLS optimization, ought to be !bfd_link_executable (info).  */
+  if (bfd_link_pic (info))
     {
       switch (ELF32_R_TYPE (rel->r_info))
        {
@@ -1911,7 +1915,7 @@ tilepro_elf_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info,
   bfd_signed_vma *local_got_refcounts;
   const Elf_Internal_Rela *rel, *relend;
 
-  if (info->relocatable)
+  if (bfd_link_relocatable (info))
     return TRUE;
 
   BFD_ASSERT (is_tilepro_elf (abfd) || sec->reloc_count == 0);
@@ -2044,7 +2048,7 @@ tilepro_elf_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info,
         case R_TILEPRO_SHAMT_X1:
         case R_TILEPRO_SHAMT_Y0:
         case R_TILEPRO_SHAMT_Y1:
-         if (info->shared)
+         if (bfd_link_pic (info))
            break;
          /* Fall through.  */
 
@@ -2134,7 +2138,7 @@ tilepro_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
      only references to the symbol are via the global offset table.
      For such cases we need not do anything here; the relocations will
      be handled correctly by relocate_section.  */
-  if (info->shared)
+  if (bfd_link_pic (info))
     return TRUE;
 
   /* If there are no references to this symbol that do not use the
@@ -2185,7 +2189,7 @@ tilepro_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
       h->needs_copy = 1;
     }
 
-  return _bfd_elf_adjust_dynamic_copy (h, htab->sdynbss);
+  return _bfd_elf_adjust_dynamic_copy (info, h, htab->sdynbss);
 }
 
 /* Allocate space in .plt, .got and associated reloc sections for
@@ -2218,7 +2222,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
            return FALSE;
        }
 
-      if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info->shared, h))
+      if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, bfd_link_pic (info), h))
        {
          asection *s = htab->elf.splt;
 
@@ -2235,7 +2239,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
             location in the .plt.  This is required to make function
             pointers compare as equal between the normal executable and
             the shared library.  */
-         if (! info->shared
+         if (! bfd_link_pic (info)
              && !h->def_regular)
            {
              h->root.u.def.section = s;
@@ -2266,7 +2270,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
   /* If a TLS_IE symbol is now local to the binary, make it a TLS_LE
      requiring no TLS entry.  */
   if (h->got.refcount > 0
-      && !info->shared
+      && !bfd_link_pic (info)
       && h->dynindx == -1
       && tilepro_elf_hash_entry(h)->tls_type == GOT_TLS_IE)
     h->got.offset = (bfd_vma) -1;
@@ -2297,7 +2301,9 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
         global.  */
       if (tls_type == GOT_TLS_GD || tls_type == GOT_TLS_IE)
        htab->elf.srelgot->size += 2 * TILEPRO_ELF_RELA_BYTES;
-      else if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h))
+      else if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
+                                               bfd_link_pic (info),
+                                               h))
        htab->elf.srelgot->size += TILEPRO_ELF_RELA_BYTES;
     }
   else
@@ -2313,7 +2319,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
      space for pc-relative relocs that have become local due to symbol
      visibility changes.  */
 
-  if (info->shared)
+  if (bfd_link_pic (info))
     {
       if (SYMBOL_CALLS_LOCAL (info, h))
        {
@@ -2457,7 +2463,7 @@ tilepro_elf_size_dynamic_sections (bfd *output_bfd,
   if (elf_hash_table (info)->dynamic_sections_created)
     {
       /* Set the contents of the .interp section to the interpreter.  */
-      if (info->executable)
+      if (bfd_link_executable (info) && !info->nointerp)
        {
          s = bfd_get_linker_section (dynobj, ".interp");
          BFD_ASSERT (s != NULL);
@@ -2468,7 +2474,7 @@ tilepro_elf_size_dynamic_sections (bfd *output_bfd,
 
   /* Set up .got offsets for local syms, and space for local dynamic
      relocs.  */
-  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
+  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
     {
       bfd_signed_vma *local_got;
       bfd_signed_vma *end_local_got;
@@ -2522,7 +2528,7 @@ tilepro_elf_size_dynamic_sections (bfd *output_bfd,
              s->size += TILEPRO_BYTES_PER_WORD;
              if (*local_tls_type == GOT_TLS_GD)
                s->size += TILEPRO_BYTES_PER_WORD;
-             if (info->shared
+             if (bfd_link_pic (info)
                  || *local_tls_type == GOT_TLS_GD
                  || *local_tls_type == GOT_TLS_IE)
                srel->size += TILEPRO_ELF_RELA_BYTES;
@@ -2634,7 +2640,7 @@ tilepro_elf_size_dynamic_sections (bfd *output_bfd,
 #define add_dynamic_entry(TAG, VAL) \
   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
 
-      if (info->executable)
+      if (bfd_link_executable (info))
        {
          if (!add_dynamic_entry (DT_DEBUG, 0))
            return FALSE;
@@ -2888,12 +2894,13 @@ tilepro_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
        }
       else
        {
-         bfd_boolean warned;
+         bfd_boolean warned ATTRIBUTE_UNUSED;
+         bfd_boolean ignored ATTRIBUTE_UNUSED;
 
          RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
                                   r_symndx, symtab_hdr, sym_hashes,
                                   h, sec, relocation,
-                                  unresolved_reloc, warned);
+                                  unresolved_reloc, warned, ignored);
          if (warned)
            {
              /* To avoid generating warning messages about truncated
@@ -2910,7 +2917,7 @@ tilepro_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
        RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
                                         rel, 1, relend, howto, 0, contents);
 
-      if (info->relocatable)
+      if (bfd_link_relocatable (info))
        continue;
 
       if (h != NULL)
@@ -2941,8 +2948,8 @@ tilepro_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
          else if (h != NULL)
            tls_type = tilepro_elf_hash_entry(h)->tls_type;
 
-         is_tls_iele = (! info->shared || tls_type == GOT_TLS_IE);
-         is_tls_le = is_tls_iele && (!info->shared
+         is_tls_iele = (! bfd_link_pic (info) || tls_type == GOT_TLS_IE);
+         is_tls_le = is_tls_iele && (!bfd_link_pic (info)
                                      && (h == NULL || h->dynindx == -1));
 
          if (r_type == R_TILEPRO_TLS_GD_CALL)
@@ -3019,7 +3026,7 @@ tilepro_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
            }
          break;
        case R_TILEPRO_TLS_IE_LOAD:
-         if (!info->shared && (h == NULL || h->dynindx == -1))
+         if (!bfd_link_pic (info) && (h == NULL || h->dynindx == -1))
            /* IE -> LE */
            tilepro_replace_insn (contents + rel->r_offset,
                                  insn_mask_X1_no_dest_no_srca,
@@ -3058,8 +3065,10 @@ tilepro_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
              BFD_ASSERT (off != (bfd_vma) -1);
              dyn = elf_hash_table (info)->dynamic_sections_created;
 
-             if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
-                 || (info->shared
+             if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
+                                                    bfd_link_pic (info),
+                                                    h)
+                 || (bfd_link_pic (info)
                      && SYMBOL_REFERENCES_LOCAL (info, h)))
                {
                  /* This is actually a static link, or it is a
@@ -3100,7 +3109,7 @@ tilepro_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
                off &= ~1;
              else
                {
-                 if (info->shared)
+                 if (bfd_link_pic (info))
                    {
                      asection *s;
                      Elf_Internal_Rela outrel;
@@ -3199,13 +3208,13 @@ tilepro_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
          if ((input_section->flags & SEC_ALLOC) == 0)
            break;
 
-         if ((info->shared
+         if ((bfd_link_pic (info)
               && (h == NULL
                   || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
                   || h->root.type != bfd_link_hash_undefweak)
               && (! howto->pc_relative
                   || !SYMBOL_CALLS_LOCAL (info, h)))
-             || (!info->shared
+             || (!bfd_link_pic (info)
                  && h != NULL
                  && h->dynindx != -1
                  && !h->non_got_ref
@@ -3257,7 +3266,7 @@ tilepro_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
              else if (h != NULL &&
                       h->dynindx != -1
                       && (! is_plt
-                          || !info->shared
+                          || !bfd_link_pic (info)
                           || !SYMBOLIC_BIND (info, h)
                           || !h->def_regular))
                {
@@ -3340,7 +3349,7 @@ tilepro_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
         case R_TILEPRO_IMM16_X1_TLS_LE_HI:
         case R_TILEPRO_IMM16_X0_TLS_LE_HA:
         case R_TILEPRO_IMM16_X1_TLS_LE_HA:
-         if (info->shared)
+         if (bfd_link_pic (info))
            {
              Elf_Internal_Rela outrel;
              bfd_boolean skip;
@@ -3395,7 +3404,7 @@ tilepro_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
          else if (h != NULL)
            {
              tls_type = tilepro_elf_hash_entry(h)->tls_type;
-             if (!info->shared && h->dynindx == -1 && tls_type == GOT_TLS_IE)
+             if (!bfd_link_pic (info) && h->dynindx == -1 && tls_type == GOT_TLS_IE)
                r_type = tilepro_tls_translate_to_le (r_type);
            }
          if (tls_type == GOT_TLS_IE)
@@ -3445,8 +3454,10 @@ tilepro_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
                bfd_boolean dyn;
                dyn = htab->elf.dynamic_sections_created;
 
-               if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
-                   && (!info->shared
+               if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
+                                                    bfd_link_pic (info),
+                                                    h)
+                   && (!bfd_link_pic (info)
                        || !SYMBOL_REFERENCES_LOCAL (info, h)))
                  {
                    indx = h->dynindx;
@@ -3455,7 +3466,7 @@ tilepro_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
 
              /* The GOT entries have not been initialized yet.  Do it
                 now, and emit any relocations. */
-             if ((info->shared || indx != 0)
+             if ((bfd_link_pic (info) || indx != 0)
                  && (h == NULL
                      || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
                      || h->root.type != bfd_link_hash_undefweak))
@@ -3778,7 +3789,7 @@ tilepro_elf_finish_dynamic_symbol (bfd *output_bfd,
         the symbol was forced to be local because of a version file.
         The entry in the global offset table will already have been
         initialized in the relocate_section function.  */
-      if (info->shared
+      if (bfd_link_pic (info)
          && (info->symbolic || h->dynindx == -1)
          && h->def_regular)
        {
@@ -3905,8 +3916,9 @@ tilepro_elf_finish_dynamic_sections (bfd *output_bfd,
                  PLT_ENTRY_SIZE - PLT_HEADER_SIZE);
        }
 
-      elf_section_data (splt->output_section)->this_hdr.sh_entsize
-       = PLT_ENTRY_SIZE;
+      if (elf_section_data (splt->output_section) != NULL)
+       elf_section_data (splt->output_section)->this_hdr.sh_entsize
+         = PLT_ENTRY_SIZE;
     }
 
   if (htab->elf.sgotplt)
@@ -3964,7 +3976,9 @@ tilepro_elf_plt_sym_val (bfd_vma i, const asection *plt,
 }
 
 static enum elf_reloc_type_class
-tilepro_reloc_type_class (const Elf_Internal_Rela *rela)
+tilepro_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
+                         const asection *rel_sec ATTRIBUTE_UNUSED,
+                         const Elf_Internal_Rela *rela)
 {
   switch ((int) ELF32_R_TYPE (rela->r_info))
     {
@@ -4013,7 +4027,7 @@ tilepro_additional_program_headers (bfd *abfd,
 #define ELF_MAXPAGESIZE                0x10000
 #define ELF_COMMONPAGESIZE     0x10000
 
-#define TARGET_LITTLE_SYM      bfd_elf32_tilepro_vec
+#define TARGET_LITTLE_SYM      tilepro_elf32_vec
 #define TARGET_LITTLE_NAME     "elf32-tilepro"
 
 #define elf_backend_reloc_type_class        tilepro_reloc_type_class