Fix feature checks based on ARM architecture value
[deliverable/binutils-gdb.git] / bfd / elf32-mcore.c
index e978cdc0051b6f0ad6b4e9df2b750cc4b84d456f..e2851e2275d4aba50c3153102fce1f63d47c6f60 100644 (file)
@@ -1,12 +1,11 @@
 /* Motorola MCore specific support for 32-bit ELF
 /* Motorola MCore specific support for 32-bit ELF
-   Copyright 1994, 1995, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
-   Free Software Foundation, Inc.
+   Copyright (C) 1994-2016 Free Software Foundation, Inc.
 
    This file is part of BFD, the Binary File Descriptor library.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
 
    This file is part of BFD, the Binary File Descriptor library.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301,
-   USA.  */
+   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
 
 /* This file is based on a preliminary RCE ELF ABI.  The
    information may not match the final RCE ELF ABI.   */
 
 
 /* This file is based on a preliminary RCE ELF ABI.  The
    information may not match the final RCE ELF ABI.   */
 
-#include "bfd.h"
 #include "sysdep.h"
 #include "sysdep.h"
+#include "bfd.h"
 #include "bfdlink.h"
 #include "libbfd.h"
 #include "elf-bfd.h"
 #include "bfdlink.h"
 #include "libbfd.h"
 #include "elf-bfd.h"
@@ -54,7 +54,7 @@ mcore_elf_merge_private_bfd_data (bfd * ibfd, bfd * obfd)
   flagword old_flags;
   flagword new_flags;
 
   flagword old_flags;
   flagword new_flags;
 
-  /* Check if we have the same endianess.  */
+  /* Check if we have the same endianness.  */
   if (! _bfd_generic_verify_endian_match (ibfd, obfd))
     return FALSE;
 
   if (! _bfd_generic_verify_endian_match (ibfd, obfd))
     return FALSE;
 
@@ -88,7 +88,7 @@ static bfd_reloc_status_type
 mcore_elf_unsupported_reloc (bfd * abfd,
                             arelent * reloc_entry,
                             asymbol * symbol ATTRIBUTE_UNUSED,
 mcore_elf_unsupported_reloc (bfd * abfd,
                             arelent * reloc_entry,
                             asymbol * symbol ATTRIBUTE_UNUSED,
-                            PTR data ATTRIBUTE_UNUSED,
+                            void * data ATTRIBUTE_UNUSED,
                             asection * input_section ATTRIBUTE_UNUSED,
                             bfd * output_bfd ATTRIBUTE_UNUSED,
                             char ** error_message ATTRIBUTE_UNUSED)
                             asection * input_section ATTRIBUTE_UNUSED,
                             bfd * output_bfd ATTRIBUTE_UNUSED,
                             char ** error_message ATTRIBUTE_UNUSED)
@@ -110,11 +110,11 @@ static reloc_howto_type mcore_elf_howto_raw[] =
   /* This reloc does nothing.  */
   HOWTO (R_MCORE_NONE,         /* type */
         0,                     /* rightshift */
   /* This reloc does nothing.  */
   HOWTO (R_MCORE_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 */
         FALSE,                 /* pc_relative */
         0,                     /* bitpos */
-        complain_overflow_bitfield,  /* complain_on_overflow */
+        complain_overflow_dont,  /* complain_on_overflow */
         NULL,                  /* special_function */
         "R_MCORE_NONE",        /* name */
         FALSE,                 /* partial_inplace */
         NULL,                  /* special_function */
         "R_MCORE_NONE",        /* name */
         FALSE,                 /* partial_inplace */
@@ -317,6 +317,22 @@ mcore_elf_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED,
   return mcore_elf_howto_table [(int) mcore_reloc];
 };
 
   return mcore_elf_howto_table [(int) mcore_reloc];
 };
 
+static reloc_howto_type *
+mcore_elf_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
+                            const char *r_name)
+{
+  unsigned int i;
+
+  for (i = 0;
+       i < sizeof (mcore_elf_howto_raw) / sizeof (mcore_elf_howto_raw[0]);
+       i++)
+    if (mcore_elf_howto_raw[i].name != NULL
+       && strcasecmp (mcore_elf_howto_raw[i].name, r_name) == 0)
+      return &mcore_elf_howto_raw[i];
+
+  return NULL;
+}
+
 /* Set the howto pointer for a RCE ELF reloc.  */
 
 static void
 /* Set the howto pointer for a RCE ELF reloc.  */
 
 static void
@@ -324,13 +340,22 @@ mcore_elf_info_to_howto (bfd * abfd ATTRIBUTE_UNUSED,
                         arelent * cache_ptr,
                         Elf_Internal_Rela * dst)
 {
                         arelent * cache_ptr,
                         Elf_Internal_Rela * dst)
 {
+  unsigned int r_type;
+
   if (! mcore_elf_howto_table [R_MCORE_PCRELIMM8BY4])
     /* Initialize howto table if needed.  */
     mcore_elf_howto_init ();
 
   if (! mcore_elf_howto_table [R_MCORE_PCRELIMM8BY4])
     /* Initialize howto table if needed.  */
     mcore_elf_howto_init ();
 
-  BFD_ASSERT (ELF32_R_TYPE (dst->r_info) < (unsigned int) R_MCORE_max);
+  r_type = ELF32_R_TYPE (dst->r_info);
+  if (r_type >= R_MCORE_max)
+    {
+      (*_bfd_error_handler) (_("%B: unrecognised MCore reloc number: %d"),
+                            abfd, r_type);
+      bfd_set_error (bfd_error_bad_value);
+      r_type = R_MCORE_NONE;
+    }
 
 
-  cache_ptr->howto = mcore_elf_howto_table [ELF32_R_TYPE (dst->r_info)];
+  cache_ptr->howto = mcore_elf_howto_table [r_type];
 }
 \f
 /* The RELOCATE_SECTION function is called by the ELF backend linker
 }
 \f
 /* The RELOCATE_SECTION function is called by the ELF backend linker
@@ -384,12 +409,9 @@ mcore_elf_relocate_section (bfd * output_bfd,
      input_bfd,
      input_section,
      (long) input_section->reloc_count,
      input_bfd,
      input_section,
      (long) input_section->reloc_count,
-     (info->relocatable) ? " (relocatable)" : "");
+     (bfd_link_relocatable (info)) ? " (relocatable)" : "");
 #endif
 
 #endif
 
-  if (info->relocatable)
-    return TRUE;
-
   if (! mcore_elf_howto_table [R_MCORE_PCRELIMM8BY4])  /* Initialize howto table if needed */
     mcore_elf_howto_init ();
 
   if (! mcore_elf_howto_table [R_MCORE_PCRELIMM8BY4])  /* Initialize howto table if needed */
     mcore_elf_howto_init ();
 
@@ -444,14 +466,21 @@ mcore_elf_relocate_section (bfd * output_bfd,
        }
       else
        {
        }
       else
        {
-         bfd_boolean unresolved_reloc, warned;
+         bfd_boolean unresolved_reloc, warned, ignored;
 
          RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
                                   r_symndx, symtab_hdr, sym_hashes,
                                   h, sec, relocation,
 
          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 (sec != NULL && discarded_section (sec))
+       RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+                                        rel, 1, relend, howto, 0, contents);
+
+      if (bfd_link_relocatable (info))
+       continue;
+
       switch (r_type)
        {
        default:
       switch (r_type)
        {
        default:
@@ -526,37 +555,21 @@ mcore_elf_relocate_section (bfd * output_bfd,
    relocation.  */
 
 static asection *
    relocation.  */
 
 static asection *
-mcore_elf_gc_mark_hook (asection *                   sec,
-                       struct bfd_link_info *       info ATTRIBUTE_UNUSED,
-                       Elf_Internal_Rela *          rel,
-                       struct elf_link_hash_entry * h,
-                       Elf_Internal_Sym *           sym)
+mcore_elf_gc_mark_hook (asection *sec,
+                       struct bfd_link_info *info,
+                       Elf_Internal_Rela *rel,
+                       struct elf_link_hash_entry *h,
+                       Elf_Internal_Sym *sym)
 {
 {
-  if (h == NULL)
-    return bfd_section_from_elf_index (sec->owner, sym->st_shndx);
-
-  switch (ELF32_R_TYPE (rel->r_info))
-    {
-    case R_MCORE_GNU_VTINHERIT:
-    case R_MCORE_GNU_VTENTRY:
-      break;
-
-    default:
-      switch (h->root.type)
-       {
-       case bfd_link_hash_defined:
-       case bfd_link_hash_defweak:
-         return h->root.u.def.section;
-
-       case bfd_link_hash_common:
-         return h->root.u.c.p->section;
-
-       default:
-         break;
-       }
-    }
-
-  return NULL;
+  if (h != NULL)
+    switch (ELF32_R_TYPE (rel->r_info))
+      {
+      case R_MCORE_GNU_VTINHERIT:
+      case R_MCORE_GNU_VTENTRY:
+       return NULL;
+      }
+
+  return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
 }
 
 /* Update the got entry reference counts for the section being removed.  */
 }
 
 /* Update the got entry reference counts for the section being removed.  */
@@ -582,18 +595,14 @@ mcore_elf_check_relocs (bfd * abfd,
 {
   Elf_Internal_Shdr * symtab_hdr;
   struct elf_link_hash_entry ** sym_hashes;
 {
   Elf_Internal_Shdr * symtab_hdr;
   struct elf_link_hash_entry ** sym_hashes;
-  struct elf_link_hash_entry ** sym_hashes_end;
   const Elf_Internal_Rela * rel;
   const Elf_Internal_Rela * rel_end;
 
   const Elf_Internal_Rela * rel;
   const Elf_Internal_Rela * rel_end;
 
-  if (info->relocatable)
+  if (bfd_link_relocatable (info))
     return TRUE;
 
   symtab_hdr = & elf_tdata (abfd)->symtab_hdr;
   sym_hashes = elf_sym_hashes (abfd);
     return TRUE;
 
   symtab_hdr = & elf_tdata (abfd)->symtab_hdr;
   sym_hashes = elf_sym_hashes (abfd);
-  sym_hashes_end = sym_hashes + symtab_hdr->sh_size / sizeof (Elf32_External_Sym);
-  if (!elf_bad_symtab (abfd))
-    sym_hashes_end -= symtab_hdr->sh_info;
 
   rel_end = relocs + sec->reloc_count;
 
 
   rel_end = relocs + sec->reloc_count;
 
@@ -612,6 +621,10 @@ mcore_elf_check_relocs (bfd * abfd,
          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;
          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;
        }
 
       switch (ELF32_R_TYPE (rel->r_info))
        }
 
       switch (ELF32_R_TYPE (rel->r_info))
@@ -626,7 +639,9 @@ mcore_elf_check_relocs (bfd * abfd,
         /* This relocation describes which C++ vtable entries are actually
            used.  Record for later use during GC.  */
         case R_MCORE_GNU_VTENTRY:
         /* This relocation describes which C++ vtable entries are actually
            used.  Record for later use during GC.  */
         case R_MCORE_GNU_VTENTRY:
-          if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
+          BFD_ASSERT (h != NULL);
+          if (h != NULL
+              && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
             return FALSE;
           break;
         }
             return FALSE;
           break;
         }
@@ -642,9 +657,9 @@ static const struct bfd_elf_special_section mcore_elf_special_sections[]=
   { NULL,                     0,  0, 0,            0 }
 };
 
   { NULL,                     0,  0, 0,            0 }
 };
 
-#define TARGET_BIG_SYM         bfd_elf32_mcore_big_vec
+#define TARGET_BIG_SYM         mcore_elf32_be_vec
 #define TARGET_BIG_NAME                "elf32-mcore-big"
 #define TARGET_BIG_NAME                "elf32-mcore-big"
-#define TARGET_LITTLE_SYM       bfd_elf32_mcore_little_vec
+#define TARGET_LITTLE_SYM       mcore_elf32_le_vec
 #define TARGET_LITTLE_NAME      "elf32-mcore-little"
 
 #define ELF_ARCH               bfd_arch_mcore
 #define TARGET_LITTLE_NAME      "elf32-mcore-little"
 
 #define ELF_ARCH               bfd_arch_mcore
@@ -656,6 +671,7 @@ static const struct bfd_elf_special_section mcore_elf_special_sections[]=
 #define bfd_elf32_bfd_merge_private_bfd_data   mcore_elf_merge_private_bfd_data
 #define bfd_elf32_bfd_set_private_flags                mcore_elf_set_private_flags
 #define bfd_elf32_bfd_reloc_type_lookup                mcore_elf_reloc_type_lookup
 #define bfd_elf32_bfd_merge_private_bfd_data   mcore_elf_merge_private_bfd_data
 #define bfd_elf32_bfd_set_private_flags                mcore_elf_set_private_flags
 #define bfd_elf32_bfd_reloc_type_lookup                mcore_elf_reloc_type_lookup
+#define bfd_elf32_bfd_reloc_name_lookup        mcore_elf_reloc_name_lookup
 #define elf_backend_relocate_section           mcore_elf_relocate_section
 #define elf_backend_gc_mark_hook               mcore_elf_gc_mark_hook
 #define elf_backend_gc_sweep_hook              mcore_elf_gc_sweep_hook
 #define elf_backend_relocate_section           mcore_elf_relocate_section
 #define elf_backend_gc_mark_hook               mcore_elf_gc_mark_hook
 #define elf_backend_gc_sweep_hook              mcore_elf_gc_sweep_hook
This page took 0.028574 seconds and 4 git commands to generate.