Fallout from recent bfd_reloc_outofrange changes
[binutils-gdb.git] / bfd / elf32-arc.c
index 27c163981a0ad224c761209b3ddadcec0057da4b..ef71b256ae63f1a02c4af3d7e8a26008df40df84 100644 (file)
@@ -1,13 +1,12 @@
 /* ARC-specific support for 32-bit ELF
 /* ARC-specific support for 32-bit ELF
-   Copyright 1994, 1995, 1997, 1999, 2001, 2002
-   Free Software Foundation, Inc.
+   Copyright (C) 1994-2015 Free Software Foundation, Inc.
    Contributed by Doug Evans (dje@cygnus.com).
 
    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
    Contributed by Doug Evans (dje@cygnus.com).
 
    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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
 
 
-#include "bfd.h"
 #include "sysdep.h"
 #include "sysdep.h"
+#include "bfd.h"
 #include "libbfd.h"
 #include "elf-bfd.h"
 #include "elf/arc.h"
 #include "libiberty.h"
 
 #include "libbfd.h"
 #include "elf-bfd.h"
 #include "elf/arc.h"
 #include "libiberty.h"
 
-static reloc_howto_type *bfd_elf32_bfd_reloc_type_lookup
-  PARAMS ((bfd *abfd, bfd_reloc_code_real_type code));
-static void arc_info_to_howto_rel
-  PARAMS ((bfd *, arelent *, Elf_Internal_Rela *));
-static bfd_boolean arc_elf_object_p
-  PARAMS ((bfd *));
-static void arc_elf_final_write_processing
-  PARAMS ((bfd *, bfd_boolean));
-static bfd_reloc_status_type arc_elf_b22_pcrel
-  PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
-
 /* Try to minimize the amount of space occupied by relocation tables
    on the ROM (not that the ROM won't be swamped by other ELF overhead).  */
 
 #define USE_REL        1
 
 /* Try to minimize the amount of space occupied by relocation tables
    on the ROM (not that the ROM won't be swamped by other ELF overhead).  */
 
 #define USE_REL        1
 
+static bfd_reloc_status_type
+arc_elf_b22_pcrel (bfd * abfd,
+                  arelent * reloc_entry,
+                  asymbol * symbol,
+                  void * data,
+                  asection * input_section,
+                  bfd * output_bfd,
+                  char ** error_message)
+{
+  /* If linking, back up the final symbol address by the address of the
+     reloc.  This cannot be accomplished by setting the pcrel_offset
+     field to TRUE, as bfd_install_relocation will detect this and refuse
+     to install the offset in the first place, but bfd_perform_relocation
+     will still insist on removing it.  */
+  if (output_bfd == NULL)
+    reloc_entry->addend -= reloc_entry->address;
+
+  /* Fall through to the default elf reloc handler.  */
+  return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
+                               input_section, output_bfd, error_message);
+}
+
 static reloc_howto_type elf_arc_howto_table[] =
 {
   /* This reloc does nothing.  */
 static reloc_howto_type elf_arc_howto_table[] =
 {
   /* This reloc does nothing.  */
-  HOWTO (R_ARC_NONE,           /* type  */
-        0,                     /* rightshift  */
-        2,                     /* size (0 = byte, 1 = short, 2 = long)  */
-        32,                    /* bitsize  */
-        FALSE,                 /* pc_relative  */
-        0,                     /* bitpos  */
-        complain_overflow_bitfield, /* complain_on_overflow  */
-        bfd_elf_generic_reloc, /* special_function  */
-        "R_ARC_NONE",          /* name  */
-        TRUE,                  /* partial_inplace  */
-        0,                     /* src_mask  */
-        0,                     /* dst_mask  */
-        FALSE),                /* pcrel_offset  */
+  HOWTO (R_ARC_NONE,           /* Type.  */
+        0,                     /* Rightshift.  */
+        3,                     /* Size (0 = byte, 1 = short, 2 = long).  */
+        0,                     /* Bitsize.  */
+        FALSE,                 /* PC_relative.  */
+        0,                     /* Bitpos.  */
+        complain_overflow_bitfield, /* Complain_on_overflow.  */
+        bfd_elf_generic_reloc, /* Special_function.  */
+        "R_ARC_NONE",          /* Name.  */
+        TRUE,                  /* Partial_inplace.  */
+        0,                     /* Src_mask.  */
+        0,                     /* Dst_mask.  */
+        FALSE),                /* PCrel_offset.  */
 
   /* A standard 32 bit relocation.  */
 
   /* A standard 32 bit relocation.  */
-  HOWTO (R_ARC_32,             /* type  */
-        0,                     /* rightshift  */
-        2,                     /* size (0 = byte, 1 = short, 2 = long)  */
-        32,                    /* bitsize  */
-        FALSE,                 /* pc_relative  */
-        0,                     /* bitpos  */
-        complain_overflow_bitfield, /* complain_on_overflow  */
-        bfd_elf_generic_reloc, /* special_function  */
-        "R_ARC_32",            /* name  */
-        TRUE,                  /* partial_inplace  */
-        0xffffffff,            /* src_mask  */
-        0xffffffff,            /* dst_mask  */
-        FALSE),                /* pcrel_offset  */
+  HOWTO (R_ARC_32,             /* Type.  */
+        0,                     /* Rightshift.  */
+        2,                     /* Size (0 = byte, 1 = short, 2 = long).  */
+        32,                    /* Bitsize.  */
+        FALSE,                 /* PC_relative.  */
+        0,                     /* Bitpos.  */
+        complain_overflow_bitfield, /* Complain_on_overflow.  */
+        bfd_elf_generic_reloc, /* Special_function.  */
+        "R_ARC_32",            /* Name.  */
+        TRUE,                  /* Partial_inplace.  */
+        0xffffffff,            /* Src_mask.  */
+        0xffffffff,            /* Dst_mask.  */
+        FALSE),                /* PCrel_offset.  */
 
   /* A 26 bit absolute branch, right shifted by 2.  */
 
   /* A 26 bit absolute branch, right shifted by 2.  */
-  HOWTO (R_ARC_B26,            /* type  */
-        2,                     /* rightshift  */
-        2,                     /* size (0 = byte, 1 = short, 2 = long)  */
-        26,                    /* bitsize  */
-        FALSE,                 /* pc_relative  */
-        0,                     /* bitpos  */
-        complain_overflow_bitfield, /* complain_on_overflow  */
-        bfd_elf_generic_reloc, /* special_function  */
-        "R_ARC_B26",           /* name  */
-        TRUE,                  /* partial_inplace  */
-        0x00ffffff,            /* src_mask  */
-        0x00ffffff,            /* dst_mask  */
-        FALSE),                /* pcrel_offset  */
+  HOWTO (R_ARC_B26,            /* Type.  */
+        2,                     /* Rightshift.  */
+        2,                     /* Size (0 = byte, 1 = short, 2 = long).  */
+        26,                    /* Bitsize.  */
+        FALSE,                 /* PC_relative.  */
+        0,                     /* Bitpos.  */
+        complain_overflow_bitfield, /* Complain_on_overflow.  */
+        bfd_elf_generic_reloc, /* Special_function.  */
+        "R_ARC_B26",           /* Name.  */
+        TRUE,                  /* Partial_inplace.  */
+        0x00ffffff,            /* Src_mask.  */
+        0x00ffffff,            /* Dst_mask.  */
+        FALSE),                /* PCrel_offset.  */
 
   /* A relative 22 bit branch; bits 21-2 are stored in bits 26-7.  */
 
   /* A relative 22 bit branch; bits 21-2 are stored in bits 26-7.  */
-  HOWTO (R_ARC_B22_PCREL,      /* type  */
-        2,                     /* rightshift  */
-        2,                     /* size (0 = byte, 1 = short, 2 = long)  */
-        22,                    /* bitsize  */
-        TRUE,                  /* pc_relative  */
-        7,                     /* bitpos  */
-        complain_overflow_signed, /* complain_on_overflow  */
-        arc_elf_b22_pcrel,     /* special_function  */
-        "R_ARC_B22_PCREL",     /* name  */
-        TRUE,                  /* partial_inplace  */
-        0x07ffff80,            /* src_mask  */
-        0x07ffff80,            /* dst_mask  */
-        FALSE),                /* pcrel_offset  */
+  HOWTO (R_ARC_B22_PCREL,      /* Type.  */
+        2,                     /* Rightshift.  */
+        2,                     /* Size (0 = byte, 1 = short, 2 = long).  */
+        22,                    /* Bitsize.  */
+        TRUE,                  /* PC_relative.  */
+        7,                     /* Bitpos.  */
+        complain_overflow_signed, /* Complain_on_overflow.  */
+        arc_elf_b22_pcrel,     /* Special_function.  */
+        "R_ARC_B22_PCREL",     /* Name.  */
+        TRUE,                  /* Partial_inplace.  */
+        0x07ffff80,            /* Src_mask.  */
+        0x07ffff80,            /* Dst_mask.  */
+        FALSE),                /* PCrel_offset.  */
 };
 
 /* Map BFD reloc types to ARC ELF reloc types.  */
 };
 
 /* Map BFD reloc types to ARC ELF reloc types.  */
@@ -123,9 +134,8 @@ static const struct arc_reloc_map arc_reloc_map[] =
 };
 
 static reloc_howto_type *
 };
 
 static reloc_howto_type *
-bfd_elf32_bfd_reloc_type_lookup (abfd, code)
-     bfd *abfd ATTRIBUTE_UNUSED;
-     bfd_reloc_code_real_type code;
+bfd_elf32_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
+                                bfd_reloc_code_real_type code)
 {
   unsigned int i;
 
 {
   unsigned int i;
 
@@ -136,26 +146,44 @@ bfd_elf32_bfd_reloc_type_lookup (abfd, code)
   return NULL;
 }
 
   return NULL;
 }
 
+static reloc_howto_type *
+bfd_elf32_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
+                                const char *r_name)
+{
+  unsigned int i;
+
+  for (i = 0;
+       i < sizeof (elf_arc_howto_table) / sizeof (elf_arc_howto_table[0]);
+       i++)
+    if (elf_arc_howto_table[i].name != NULL
+       && strcasecmp (elf_arc_howto_table[i].name, r_name) == 0)
+      return &elf_arc_howto_table[i];
+
+  return NULL;
+}
+
 /* Set the howto pointer for an ARC ELF reloc.  */
 
 static void
 /* Set the howto pointer for an ARC ELF reloc.  */
 
 static void
-arc_info_to_howto_rel (abfd, cache_ptr, dst)
-     bfd *abfd ATTRIBUTE_UNUSED;
-     arelent *cache_ptr;
-     Elf_Internal_Rela *dst;
+arc_info_to_howto_rel (bfd *abfd ATTRIBUTE_UNUSED,
+                      arelent *cache_ptr,
+                      Elf_Internal_Rela *dst)
 {
   unsigned int r_type;
 
   r_type = ELF32_R_TYPE (dst->r_info);
 {
   unsigned int r_type;
 
   r_type = ELF32_R_TYPE (dst->r_info);
-  BFD_ASSERT (r_type < (unsigned int) R_ARC_max);
+  if (r_type >= (unsigned int) R_ARC_max)
+    {
+      _bfd_error_handler (_("%A: invalid ARC reloc number: %d"), abfd, r_type);
+      r_type = 0;
+    }
   cache_ptr->howto = &elf_arc_howto_table[r_type];
 }
 
 /* Set the right machine number for an ARC ELF file.  */
 
 static bfd_boolean
   cache_ptr->howto = &elf_arc_howto_table[r_type];
 }
 
 /* Set the right machine number for an ARC ELF file.  */
 
 static bfd_boolean
-arc_elf_object_p (abfd)
-     bfd *abfd;
+arc_elf_object_p (bfd *abfd)
 {
   unsigned int mach = bfd_mach_arc_6;
 
 {
   unsigned int mach = bfd_mach_arc_6;
 
@@ -187,9 +215,8 @@ arc_elf_object_p (abfd)
    This gets the ARC architecture right based on the machine number.  */
 
 static void
    This gets the ARC architecture right based on the machine number.  */
 
 static void
-arc_elf_final_write_processing (abfd, linker)
-     bfd *abfd;
-     bfd_boolean linker ATTRIBUTE_UNUSED;
+arc_elf_final_write_processing (bfd *abfd,
+                               bfd_boolean linker ATTRIBUTE_UNUSED)
 {
   unsigned long val;
 
 {
   unsigned long val;
 
@@ -213,41 +240,17 @@ arc_elf_final_write_processing (abfd, linker)
   elf_elfheader (abfd)->e_flags |= val;
 }
 
   elf_elfheader (abfd)->e_flags |= val;
 }
 
-bfd_reloc_status_type
-arc_elf_b22_pcrel (abfd, reloc_entry, symbol, data, input_section,
-                  output_bfd, error_message)
-     bfd * abfd;
-     arelent * reloc_entry;
-     asymbol * symbol;
-     PTR data;
-     asection * input_section;
-     bfd * output_bfd;
-     char ** error_message;
-{
-  /* If linking, back up the final symbol address by the address of the
-     reloc.  This cannot be accomplished by setting the pcrel_offset
-     field to TRUE, as bfd_install_relocation will detect this and refuse
-     to install the offset in the first place, but bfd_perform_relocation
-     will still insist on removing it.  */
-  if (output_bfd == (bfd *) NULL)
-    reloc_entry->addend -= reloc_entry->address;
-
-  /* Fall through to the default elf reloc handler.  */
-  return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
-                               input_section, output_bfd, error_message);
-}
-
-#define TARGET_LITTLE_SYM bfd_elf32_littlearc_vec
-#define TARGET_LITTLE_NAME "elf32-littlearc"
-#define TARGET_BIG_SYM bfd_elf32_bigarc_vec
-#define TARGET_BIG_NAME        "elf32-bigarc"
-#define ELF_ARCH bfd_arch_arc
-#define ELF_MACHINE_CODE EM_ARC
-#define ELF_MAXPAGESIZE        0x1000
-
-#define elf_info_to_howto 0
-#define elf_info_to_howto_rel arc_info_to_howto_rel
-#define elf_backend_object_p arc_elf_object_p
-#define elf_backend_final_write_processing arc_elf_final_write_processing
+#define TARGET_LITTLE_SYM   arc_elf32_le_vec
+#define TARGET_LITTLE_NAME  "elf32-littlearc"
+#define TARGET_BIG_SYM      arc_elf32_be_vec
+#define TARGET_BIG_NAME            "elf32-bigarc"
+#define ELF_ARCH            bfd_arch_arc
+#define ELF_MACHINE_CODE    EM_ARC
+#define ELF_MAXPAGESIZE     0x1000
+
+#define elf_info_to_howto                   0
+#define elf_info_to_howto_rel               arc_info_to_howto_rel
+#define elf_backend_object_p                arc_elf_object_p
+#define elf_backend_final_write_processing  arc_elf_final_write_processing
 
 #include "elf32-target.h"
 
 #include "elf32-target.h"