gdb: add target_ops::supports_displaced_step
[deliverable/binutils-gdb.git] / bfd / elf32-dlx.c
index 6ccb9f536fda0d48c26f30874070aaab2c61423e..6995de45fccfeb2a6300629148f15c55d43902a3 100644 (file)
@@ -1,11 +1,11 @@
 /* DLX specific support for 32-bit ELF
-   Copyright 2002, 2003 Free Software Foundation, Inc.
+   Copyright (C) 2002-2020 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
-   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,
 
    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 "bfd.h"
 #include "libbfd.h"
 #include "elf-bfd.h"
 #include "elf/dlx.h"
-
-int    set_dlx_skip_hi16_flag PARAMS ((int));
-
-static bfd_boolean elf32_dlx_check_relocs
-  PARAMS ((bfd *, struct bfd_link_info *, asection *,
-          const Elf_Internal_Rela *));
-static void elf32_dlx_info_to_howto
-  PARAMS ((bfd *, arelent *, Elf_Internal_Rela *));
-static void elf32_dlx_info_to_howto_rel
-  PARAMS ((bfd *, arelent *, Elf_Internal_Rela *));
-static bfd_reloc_status_type elf32_dlx_relocate16
-  PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
-static bfd_reloc_status_type elf32_dlx_relocate26
-  PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
-static reloc_howto_type *elf32_dlx_reloc_type_lookup
-  PARAMS ((bfd *, bfd_reloc_code_real_type));
-static bfd_reloc_status_type _bfd_dlx_elf_hi16_reloc
-  PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
-static reloc_howto_type * dlx_rtype_to_howto
-  PARAMS ((unsigned int));
-
+#include "elf32-dlx.h"
 
 #define USE_REL 1
 
 #define bfd_elf32_bfd_reloc_type_lookup elf32_dlx_reloc_type_lookup
-#define elf_info_to_howto               elf32_dlx_info_to_howto
-#define elf_info_to_howto_rel           elf32_dlx_info_to_howto_rel
-#define elf_backend_check_relocs        elf32_dlx_check_relocs
-
-static reloc_howto_type dlx_elf_howto_table[]=
-  {
-    /* No relocation.  */
-    HOWTO (R_DLX_NONE,            /* type */
-          0,                     /* rightshift */
-          0,                     /* size (0 = byte, 1 = short, 2 = long) */
-          0,                     /* bitsize */
-          FALSE,                 /* pc_relative */
-          0,                     /* bitpos */
-          complain_overflow_dont,/* complain_on_overflow */
-          bfd_elf_generic_reloc, /* special_function */
-          "R_DLX_NONE",          /* name */
-          FALSE,                 /* partial_inplace */
-          0,                     /* src_mask */
-          0,                     /* dst_mask */
-          FALSE),                /* pcrel_offset */
-
-    /* 8 bit relocation.  */
-    HOWTO (R_DLX_RELOC_8,         /* type */
-          0,                     /* rightshift */
-          0,                     /* size (0 = byte, 1 = short, 2 = long) */
-          8,                     /* bitsize */
-          FALSE,                 /* pc_relative */
-          0,                     /* bitpos */
-          complain_overflow_dont,/* complain_on_overflow */
-          bfd_elf_generic_reloc, /* special_function */
-          "R_DLX_RELOC_8",       /* name */
-          TRUE,                  /* partial_inplace */
-          0xff,                  /* src_mask */
-          0xff,                  /* dst_mask */
-          FALSE),                /* pcrel_offset */
-
-    /* 16 bit relocation.  */
-    HOWTO (R_DLX_RELOC_16,        /* type */
-          0,                     /* rightshift */
-          1,                     /* size (0 = byte, 1 = short, 2 = long) */
-          16,                    /* bitsize */
-          FALSE,                 /* pc_relative */
-          0,                     /* bitpos */
-          complain_overflow_dont,/* complain_on_overflow */
-          bfd_elf_generic_reloc, /* special_function */
-          "R_DLX_RELOC_16",      /* name */
-          TRUE,                  /* partial_inplace */
-          0xffff,                /* src_mask */
-          0xffff,                /* dst_mask */
-          FALSE),                /* pcrel_offset */
-
-#if 0
-    /* 26 bit jump address.  */
-    HOWTO (R_DLX_RELOC_26,        /* type */
-          0,                     /* rightshift */
-          2,                     /* size (0 = byte, 1 = short, 2 = long) */
-          26,                    /* bitsize */
-          FALSE,                 /* pc_relative */
-          0,                     /* bitpos */
-          complain_overflow_dont,/* complain_on_overflow */
-          /* This needs complex overflow detection, because the upper four
-             bits must match the PC + 4.  */
-          bfd_elf_generic_reloc, /* special_function */
-          "R_DLX_RELOC_26",      /* name */
-          TRUE,                  /* partial_inplace */
-          0x3ffffff,             /* src_mask */
-          0x3ffffff,             /* dst_mask */
-          FALSE),                /* pcrel_offset */
-#endif
-
-    /* 32 bit relocation.  */
-    HOWTO (R_DLX_RELOC_32,        /* type */
-          0,                     /* rightshift */
-          2,                     /* size (0 = byte, 1 = short, 2 = long) */
-          32,                    /* bitsize */
-          FALSE,                 /* pc_relative */
-          0,                     /* bitpos */
-          complain_overflow_dont,/* complain_on_overflow */
-          bfd_elf_generic_reloc, /* special_function */
-          "R_DLX_RELOC_32",      /* name */
-          TRUE,                  /* partial_inplace */
-          0xffffffff,            /* src_mask */
-          0xffffffff,            /* dst_mask */
-          FALSE),                /* pcrel_offset */
-
-    /* GNU extension to record C++ vtable hierarchy */
-    HOWTO (R_DLX_GNU_VTINHERIT,   /* type */
-          0,                     /* rightshift */
-          2,                     /* size (0 = byte, 1 = short, 2 = long) */
-          0,                     /* bitsize */
-          FALSE,                 /* pc_relative */
-          0,                     /* bitpos */
-          complain_overflow_dont,/* complain_on_overflow */
-          NULL,                  /* special_function */
-          "R_DLX_GNU_VTINHERIT", /* name */
-          FALSE,                 /* partial_inplace */
-          0,                     /* src_mask */
-          0,                     /* dst_mask */
-          FALSE),                /* pcrel_offset */
-
-    /* GNU extension to record C++ vtable member usage */
-    HOWTO (R_DLX_GNU_VTENTRY,     /* type */
-          0,                     /* rightshift */
-          2,                     /* size (0 = byte, 1 = short, 2 = long) */
-          0,                     /* bitsize */
-          FALSE,                 /* pc_relative */
-          0,                     /* bitpos */
-          complain_overflow_dont,/* complain_on_overflow */
-          _bfd_elf_rel_vtable_reloc_fn,/* special_function */
-          "R_DLX_GNU_VTENTRY",   /* name */
-          FALSE,                 /* partial_inplace */
-          0,                     /* src_mask */
-          0,                     /* dst_mask */
-          FALSE)                 /* pcrel_offset */
-  };
-
-/* 16 bit offset for pc-relative branches.  */
-static reloc_howto_type elf_dlx_gnu_rel16_s2 =
-HOWTO (R_DLX_RELOC_16_PCREL,  /* type */
-       0,                     /* rightshift */
-       1,                     /* size (0 = byte, 1 = short, 2 = long) */
-       16,                    /* bitsize */
-       TRUE,                  /* pc_relative */
-       0,                     /* bitpos */
-       complain_overflow_signed, /* complain_on_overflow */
-       elf32_dlx_relocate16,  /* special_function */
-       "R_DLX_RELOC_16_PCREL",/* name */
-       TRUE,                  /* partial_inplace */
-       0xffff,                /* src_mask */
-       0xffff,                /* dst_mask */
-       TRUE);                 /* pcrel_offset */
-
-/* 26 bit offset for pc-relative branches.  */
-static reloc_howto_type elf_dlx_gnu_rel26_s2 =
-HOWTO (R_DLX_RELOC_26_PCREL,  /* type */
-       0,                     /* rightshift */
-       2,                     /* size (0 = byte, 1 = short, 2 = long) */
-       26,                    /* bitsize */
-       TRUE,                  /* pc_relative */
-       0,                     /* bitpos */
-       complain_overflow_dont,/* complain_on_overflow */
-       elf32_dlx_relocate26,  /* special_function */
-       "R_DLX_RELOC_26_PCREL",/* name */
-       TRUE,                  /* partial_inplace */
-       0xffff,                /* src_mask */
-       0xffff,                /* dst_mask */
-       TRUE);                 /* pcrel_offset */
-
-/* High 16 bits of symbol value.  */
-static reloc_howto_type elf_dlx_reloc_16_hi =
-HOWTO (R_DLX_RELOC_16_HI,     /* type */
-       16,                    /* rightshift */
-       2,                     /* size (0 = byte, 1 = short, 2 = long) */
-       32,                    /* bitsize */
-       FALSE,                 /* pc_relative */
-       0,                     /* bitpos */
-       complain_overflow_dont, /* complain_on_overflow */
-       _bfd_dlx_elf_hi16_reloc,/* special_function */
-       "R_DLX_RELOC_16_HI",   /* name */
-       TRUE,                  /* partial_inplace */
-       0xFFFF,                /* src_mask */
-       0xffff,                /* dst_mask */
-       FALSE);                /* pcrel_offset */
-
-  /* Low 16 bits of symbol value.  */
-static reloc_howto_type elf_dlx_reloc_16_lo =
-HOWTO (R_DLX_RELOC_16_LO,     /* type */
-       0,                     /* rightshift */
-       1,                     /* size (0 = byte, 1 = short, 2 = long) */
-       16,                    /* bitsize */
-       FALSE,                 /* pc_relative */
-       0,                     /* bitpos */
-       complain_overflow_dont,/* complain_on_overflow */
-       bfd_elf_generic_reloc, /* special_function */
-       "R_DLX_RELOC_16_LO",   /* name */
-       TRUE,                  /* partial_inplace */
-       0xffff,                /* src_mask */
-       0xffff,                /* dst_mask */
-       FALSE);                /* pcrel_offset */
-
+#define bfd_elf32_bfd_reloc_name_lookup elf32_dlx_reloc_name_lookup
+#define elf_info_to_howto              elf32_dlx_info_to_howto
+#define elf_info_to_howto_rel          elf32_dlx_info_to_howto_rel
+#define elf_backend_check_relocs       elf32_dlx_check_relocs
 
 /* The gas default behavior is not to preform the %hi modifier so that the
    GNU assembler can have the lower 16 bits offset placed in the insn, BUT
@@ -237,23 +42,20 @@ HOWTO (R_DLX_RELOC_16_LO,     /* type */
 static int skip_dlx_elf_hi16_reloc = 0;
 
 int
-set_dlx_skip_hi16_flag (flag)
-     int flag;
+set_dlx_skip_hi16_flag (int flag)
 {
   skip_dlx_elf_hi16_reloc = flag;
   return flag;
 }
 
 static bfd_reloc_status_type
-_bfd_dlx_elf_hi16_reloc (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;
+_bfd_dlx_elf_hi16_reloc (bfd *abfd,
+                        arelent *reloc_entry,
+                        asymbol *symbol,
+                        void * data,
+                        asection *input_section,
+                        bfd *output_bfd,
+                        char **error_message)
 {
   bfd_reloc_status_type ret;
   bfd_vma relocation;
@@ -261,12 +63,9 @@ _bfd_dlx_elf_hi16_reloc (abfd, reloc_entry, symbol, data,
   /* If the skip flag is set then we simply do the generic relocating, this
      is more of a hack for dlx gas/gld, so we do not need to do the %hi/%lo
      fixup like mips gld did.   */
-#if 0
-  printf ("DEBUG: skip_dlx_elf_hi16_reloc = 0x%08x\n", skip_dlx_elf_hi16_reloc);
-#endif
   if (skip_dlx_elf_hi16_reloc)
     return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
-                          input_section, output_bfd, error_message);
+                         input_section, output_bfd, error_message);
 
   /* If we're relocating, and this an external symbol, we don't want
      to change anything.  */
@@ -284,38 +83,17 @@ _bfd_dlx_elf_hi16_reloc (abfd, reloc_entry, symbol, data,
       && output_bfd == (bfd *) NULL)
     ret = bfd_reloc_undefined;
 
-#if 0
-  {
-    unsigned long vallo, val;
-
-    vallo = bfd_get_16 (abfd, (bfd_byte *) data + reloc_entry->address);
-    printf ("DEBUG: The relocation address = 0x%08x\n", reloc_entry->address);
-    printf ("DEBUG: The symbol        = 0x%08x\n", vallo);
-    printf ("DEBUG: The symbol name   = %s\n", bfd_asymbol_name (symbol));
-    printf ("DEBUG: The symbol->value = 0x%08x\n", symbol->value);
-    printf ("DEBUG: The vma           = 0x%08x\n", symbol->section->output_section->vma);
-    printf ("DEBUG: The output_offset = 0x%08x\n", symbol->section->output_offset);
-    printf ("DEBUG: The input_offset  = 0x%08x\n", input_section->output_offset);
-    printf ("DEBUG: The input_vma     = 0x%08x\n", input_section->vma);
-    printf ("DEBUG: The addend        = 0x%08x\n", reloc_entry->addend);
-  }
-#endif
-
   relocation = (bfd_is_com_section (symbol->section)) ? 0 : symbol->value;
   relocation += symbol->section->output_section->vma;
   relocation += symbol->section->output_offset;
   relocation += reloc_entry->addend;
   relocation += bfd_get_16 (abfd, (bfd_byte *)data + reloc_entry->address);
 
-  if (reloc_entry->address > input_section->_cooked_size)
+  if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
     return bfd_reloc_outofrange;
 
-#if 0
-  printf ("DEBUG: The finial relocation value = 0x%08x\n", relocation);
-#endif
-
   bfd_put_16 (abfd, (short)((relocation >> 16) & 0xFFFF),
-              (bfd_byte *)data + reloc_entry->address);
+             (bfd_byte *)data + reloc_entry->address);
 
   return ret;
 }
@@ -331,18 +109,16 @@ _bfd_dlx_elf_hi16_reloc (abfd, reloc_entry, symbol, data,
    relocatable output against an external symbol.  */
 
 static bfd_reloc_status_type
-elf32_dlx_relocate16  (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 ATTRIBUTE_UNUSED;
+elf32_dlx_relocate16 (bfd *abfd,
+                     arelent *reloc_entry,
+                     asymbol *symbol,
+                     void * data,
+                     asection *input_section,
+                     bfd *output_bfd,
+                     char **error_message ATTRIBUTE_UNUSED)
 {
   unsigned long insn, vallo, allignment;
-  int           val;
+  int          val;
 
   /* HACK: I think this first condition is necessary when producing
      relocatable output.  After the end of HACK, the code is identical
@@ -351,19 +127,19 @@ elf32_dlx_relocate16  (abfd, reloc_entry, symbol, data,
 
   if (skip_dlx_elf_hi16_reloc)
     return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
-                                 input_section, output_bfd, error_message);
+                                input_section, output_bfd, error_message);
 
-  /* Check undefined section and undefined symbols  */
+  /* Check undefined section and undefined symbols.  */
   if (bfd_is_und_section (symbol->section)
       && output_bfd == (bfd *) NULL)
     return bfd_reloc_undefined;
 
-  /* Can not support a long jump to sections other then .text   */
+  /* Can not support a long jump to sections other then .text.  */
   if (strcmp (input_section->name, symbol->section->output_section->name) != 0)
     {
-      fprintf (stderr,
-              "BFD Link Error: branch (PC rel16) to section (%s) not supported\n",
-              symbol->section->output_section->name);
+      _bfd_error_handler
+       (_("branch (PC rel16) to section (%s) not supported"),
+        symbol->section->output_section->name);
       return bfd_reloc_undefined;
     }
 
@@ -376,26 +152,13 @@ elf32_dlx_relocate16  (abfd, reloc_entry, symbol, data,
 
   /* vallo points to the vma of next instruction.  */
   vallo += (((unsigned long)(input_section->output_section->vma +
-                           input_section->output_offset) +
-            allignment) & ~allignment);
+                          input_section->output_offset) +
+           allignment) & ~allignment);
 
   /* val is the displacement (PC relative to next instruction).  */
   val =  (symbol->section->output_offset +
          symbol->section->output_section->vma +
          symbol->value) - vallo;
-#if 0
-  printf ("DEBUG elf32_dlx_relocate: We are here\n");
-  printf ("DEBUG: The insn            = 0x%08x\n", insn);
-  printf ("DEBUG: The vallo           = 0x%08x\n", vallo);
-  printf ("DEBUG: The val             = 0x%08x\n", val);
-  printf ("DEBUG: The symbol name     = %s\n", bfd_asymbol_name (symbol));
-  printf ("DEBUG: The symbol->value   = 0x%08x\n", symbol->value);
-  printf ("DEBUG: The vma             = 0x%08x\n", symbol->section->output_section->vma);
-  printf ("DEBUG: The lma             = 0x%08x\n", symbol->section->output_section->lma);
-  printf ("DEBUG: The alignment_power = 0x%08x\n", symbol->section->output_section->alignment_power);
-  printf ("DEBUG: The output_offset   = 0x%08x\n", symbol->section->output_offset);
-  printf ("DEBUG: The addend          = 0x%08x\n", reloc_entry->addend);
-#endif
 
   if (abs ((int) val) > 0x00007FFF)
     return bfd_reloc_outofrange;
@@ -403,24 +166,22 @@ elf32_dlx_relocate16  (abfd, reloc_entry, symbol, data,
   insn  = (insn & 0xFFFF0000) | (val & 0x0000FFFF);
 
   bfd_put_32 (abfd, insn,
-              (bfd_byte *) data + reloc_entry->address);
+             (bfd_byte *) data + reloc_entry->address);
 
   return bfd_reloc_ok;
 }
 
 static bfd_reloc_status_type
-elf32_dlx_relocate26  (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 ATTRIBUTE_UNUSED;
+elf32_dlx_relocate26 (bfd *abfd,
+                     arelent *reloc_entry,
+                     asymbol *symbol,
+                     void * data,
+                     asection *input_section,
+                     bfd *output_bfd,
+                     char **error_message ATTRIBUTE_UNUSED)
 {
   unsigned long insn, vallo, allignment;
-  int           val;
+  int          val;
 
   /* HACK: I think this first condition is necessary when producing
      relocatable output.  After the end of HACK, the code is identical
@@ -429,7 +190,7 @@ elf32_dlx_relocate26  (abfd, reloc_entry, symbol, data,
 
   if (skip_dlx_elf_hi16_reloc)
     return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
-                                 input_section, output_bfd, error_message);
+                                input_section, output_bfd, error_message);
 
   /* Check undefined section and undefined symbols.  */
   if (bfd_is_und_section (symbol->section)
@@ -439,9 +200,9 @@ elf32_dlx_relocate26  (abfd, reloc_entry, symbol, data,
   /* Can not support a long jump to sections other then .text   */
   if (strcmp (input_section->name, symbol->section->output_section->name) != 0)
     {
-      fprintf (stderr,
-              "BFD Link Error: jump (PC rel26) to section (%s) not supported\n",
-              symbol->section->output_section->name);
+      _bfd_error_handler
+       (_("jump (PC rel26) to section (%s) not supported"),
+        symbol->section->output_section->name);
       return bfd_reloc_undefined;
     }
 
@@ -461,32 +222,174 @@ elf32_dlx_relocate26  (abfd, reloc_entry, symbol, data,
   val = (symbol->section->output_offset +
         symbol->section->output_section->vma + symbol->value)
     - vallo;
-#if 0
-  printf ("DEBUG elf32_dlx_relocate26: We are here\n");
-  printf ("DEBUG: The insn          = 0x%08x\n", insn);
-  printf ("DEBUG: The vallo         = 0x%08x\n", vallo);
-  printf ("DEBUG: The val           = 0x%08x\n", val);
-  printf ("DEBUG: The abs(val)      = 0x%08x\n", abs (val));
-  printf ("DEBUG: The symbol name   = %s\n", bfd_asymbol_name (symbol));
-  printf ("DEBUG: The symbol->value = 0x%08x\n", symbol->value);
-  printf ("DEBUG: The vma           = 0x%08x\n", symbol->section->output_section->vma);
-  printf ("DEBUG: The output_offset = 0x%08x\n", symbol->section->output_offset);
-  printf ("DEBUG: The input_vma     = 0x%08x\n", input_section->output_section->vma);
-  printf ("DEBUG: The input_offset  = 0x%08x\n", input_section->output_offset);
-  printf ("DEBUG: The input_name    = %s\n", input_section->name);
-  printf ("DEBUG: The addend        = 0x%08x\n", reloc_entry->addend);
-#endif
 
   if (abs ((int) val) > 0x01FFFFFF)
     return bfd_reloc_outofrange;
 
   insn  = (insn & 0xFC000000) | (val & 0x03FFFFFF);
   bfd_put_32 (abfd, insn,
-              (bfd_byte *) data + reloc_entry->address);
+             (bfd_byte *) data + reloc_entry->address);
 
   return bfd_reloc_ok;
 }
 
+static reloc_howto_type dlx_elf_howto_table[]=
+{
+  /* No relocation.  */
+  HOWTO (R_DLX_NONE,           /* Type. */
+        0,                     /* Rightshift.  */
+        3,                     /* size (0 = byte, 1 = short, 2 = long).  */
+        0,                     /* Bitsize.  */
+        FALSE,                 /* PC_relative.  */
+        0,                     /* Bitpos.  */
+        complain_overflow_dont,/* Complain_on_overflow.  */
+        bfd_elf_generic_reloc, /* Special_function.  */
+        "R_DLX_NONE",          /* Name.  */
+        FALSE,                 /* Partial_inplace.  */
+        0,                     /* Src_mask.  */
+        0,                     /* Dst_mask.  */
+        FALSE),                /* PCrel_offset.  */
+
+  /* 8 bit relocation.  */
+  HOWTO (R_DLX_RELOC_8,                /* Type. */
+        0,                     /* Rightshift.  */
+        0,                     /* Size (0 = byte, 1 = short, 2 = long).  */
+        8,                     /* Bitsize.  */
+        FALSE,                 /* PC_relative.  */
+        0,                     /* Bitpos.  */
+        complain_overflow_dont,/* Complain_on_overflow.  */
+        bfd_elf_generic_reloc, /* Special_function.  */
+        "R_DLX_RELOC_8",       /* Name.  */
+        TRUE,                  /* Partial_inplace.  */
+        0xff,                  /* Src_mask.  */
+        0xff,                  /* Dst_mask.  */
+        FALSE),                /* PCrel_offset.  */
+
+  /* 16 bit relocation.  */
+  HOWTO (R_DLX_RELOC_16,       /* Type. */
+        0,                     /* Rightshift.  */
+        1,                     /* Size (0 = byte, 1 = short, 2 = long).  */
+        16,                    /* Bitsize.  */
+        FALSE,                 /* PC_relative.  */
+        0,                     /* Bitpos.  */
+        complain_overflow_dont,/* Complain_on_overflow.  */
+        bfd_elf_generic_reloc, /* Special_function.  */
+        "R_DLX_RELOC_16",      /* Name.  */
+        TRUE,                  /* Partial_inplace.  */
+        0xffff,                /* Src_mask.  */
+        0xffff,                /* Dst_mask.  */
+        FALSE),                /* PCrel_offset.  */
+
+  /* 32 bit relocation.  */
+  HOWTO (R_DLX_RELOC_32,       /* Type. */
+        0,                     /* Rightshift.  */
+        2,                     /* Size (0 = byte, 1 = short, 2 = long).  */
+        32,                    /* Bitsize.  */
+        FALSE,                 /* PC_relative.  */
+        0,                     /* Bitpos.  */
+        complain_overflow_dont,/* Complain_on_overflow.  */
+        bfd_elf_generic_reloc, /* Special_function.  */
+        "R_DLX_RELOC_32",      /* Name.  */
+        TRUE,                  /* Partial_inplace.  */
+        0xffffffff,            /* Src_mask.  */
+        0xffffffff,            /* Dst_mask.  */
+        FALSE),                /* PCrel_offset.  */
+
+  /* GNU extension to record C++ vtable hierarchy.  */
+  HOWTO (R_DLX_GNU_VTINHERIT,  /* Type. */
+        0,                     /* Rightshift.  */
+        2,                     /* Size (0 = byte, 1 = short, 2 = long).  */
+        0,                     /* Bitsize.  */
+        FALSE,                 /* PC_relative.  */
+        0,                     /* Bitpos.  */
+        complain_overflow_dont,/* Complain_on_overflow.  */
+        NULL,                  /* Special_function.  */
+        "R_DLX_GNU_VTINHERIT", /* Name.  */
+        FALSE,                 /* Partial_inplace.  */
+        0,                     /* Src_mask.  */
+        0,                     /* Dst_mask.  */
+        FALSE),                /* PCrel_offset.  */
+
+  /* GNU extension to record C++ vtable member usage.  */
+  HOWTO (R_DLX_GNU_VTENTRY,    /* Type. */
+        0,                     /* Rightshift.  */
+        2,                     /* Size (0 = byte, 1 = short, 2 = long).  */
+        0,                     /* Bitsize.  */
+        FALSE,                 /* PC_relative.  */
+        0,                     /* Bitpos.  */
+        complain_overflow_dont,/* Complain_on_overflow.  */
+        _bfd_elf_rel_vtable_reloc_fn,/* Special_function.  */
+        "R_DLX_GNU_VTENTRY",   /* Name.  */
+        FALSE,                 /* Partial_inplace.  */
+        0,                     /* Src_mask.  */
+        0,                     /* Dst_mask.  */
+        FALSE)                 /* PCrel_offset.  */
+};
+
+/* 16 bit offset for pc-relative branches.  */
+static reloc_howto_type elf_dlx_gnu_rel16_s2 =
+  HOWTO (R_DLX_RELOC_16_PCREL, /* Type. */
+        0,                     /* Rightshift.  */
+        1,                     /* Size (0 = byte, 1 = short, 2 = long).  */
+        16,                    /* Bitsize.  */
+        TRUE,                  /* PC_relative.  */
+        0,                     /* Bitpos.  */
+        complain_overflow_signed, /* Complain_on_overflow.  */
+        elf32_dlx_relocate16,  /* Special_function.  */
+        "R_DLX_RELOC_16_PCREL",/* Name.  */
+        TRUE,                  /* Partial_inplace.  */
+        0xffff,                /* Src_mask.  */
+        0xffff,                /* Dst_mask.  */
+        TRUE);                 /* PCrel_offset.  */
+
+/* 26 bit offset for pc-relative branches.  */
+static reloc_howto_type elf_dlx_gnu_rel26_s2 =
+  HOWTO (R_DLX_RELOC_26_PCREL, /* Type. */
+        0,                     /* Rightshift.  */
+        2,                     /* Size (0 = byte, 1 = short, 2 = long).  */
+        26,                    /* Bitsize.  */
+        TRUE,                  /* PC_relative.  */
+        0,                     /* Bitpos.  */
+        complain_overflow_dont,/* Complain_on_overflow.  */
+        elf32_dlx_relocate26,  /* Special_function.  */
+        "R_DLX_RELOC_26_PCREL",/* Name.  */
+        TRUE,                  /* Partial_inplace.  */
+        0xffff,                /* Src_mask.  */
+        0xffff,                /* Dst_mask.  */
+        TRUE);                 /* PCrel_offset.  */
+
+/* High 16 bits of symbol value.  */
+static reloc_howto_type elf_dlx_reloc_16_hi =
+  HOWTO (R_DLX_RELOC_16_HI,    /* Type. */
+        16,                    /* Rightshift.  */
+        2,                     /* Size (0 = byte, 1 = short, 2 = long).  */
+        32,                    /* Bitsize.  */
+        FALSE,                 /* PC_relative.  */
+        0,                     /* Bitpos.  */
+        complain_overflow_dont,/* Complain_on_overflow.  */
+        _bfd_dlx_elf_hi16_reloc,/* Special_function.  */
+        "R_DLX_RELOC_16_HI",   /* Name.  */
+        TRUE,                  /* Partial_inplace.  */
+        0xFFFF,                /* Src_mask.  */
+        0xffff,                /* Dst_mask.  */
+        FALSE);                /* PCrel_offset.  */
+
+  /* Low 16 bits of symbol value.  */
+static reloc_howto_type elf_dlx_reloc_16_lo =
+  HOWTO (R_DLX_RELOC_16_LO,    /* Type. */
+        0,                     /* Rightshift.  */
+        1,                     /* Size (0 = byte, 1 = short, 2 = long).  */
+        16,                    /* Bitsize.  */
+        FALSE,                 /* PC_relative.  */
+        0,                     /* Bitpos.  */
+        complain_overflow_dont,/* Complain_on_overflow.  */
+        bfd_elf_generic_reloc, /* Special_function.  */
+        "R_DLX_RELOC_16_LO",   /* Name.  */
+        TRUE,                  /* Partial_inplace.  */
+        0xffff,                /* Src_mask.  */
+        0xffff,                /* Dst_mask.  */
+        FALSE);                /* PCrel_offset.  */
+
 /* A mapping from BFD reloc types to DLX ELF reloc types.
    Stolen from elf32-mips.c.
 
@@ -502,44 +405,36 @@ struct elf_reloc_map
 };
 
 static const struct elf_reloc_map dlx_reloc_map[] =
-  {
-    { BFD_RELOC_NONE,           R_DLX_NONE },
-    { BFD_RELOC_16,             R_DLX_RELOC_16 },
-#if 0
-    { BFD_RELOC_DLX_JMP26,      R_DLX_RELOC_26_PCREL },
-#endif
-    { BFD_RELOC_32,             R_DLX_RELOC_32 },
-    { BFD_RELOC_DLX_HI16_S,     R_DLX_RELOC_16_HI },
-    { BFD_RELOC_DLX_LO16,       R_DLX_RELOC_16_LO },
-    { BFD_RELOC_VTABLE_INHERIT,        R_DLX_GNU_VTINHERIT },
-    { BFD_RELOC_VTABLE_ENTRY,  R_DLX_GNU_VTENTRY }
-  };
-
+{
+  { BFD_RELOC_NONE,          R_DLX_NONE },
+  { BFD_RELOC_16,            R_DLX_RELOC_16 },
+  { BFD_RELOC_32,            R_DLX_RELOC_32 },
+  { BFD_RELOC_DLX_HI16_S,     R_DLX_RELOC_16_HI },
+  { BFD_RELOC_DLX_LO16,              R_DLX_RELOC_16_LO },
+  { BFD_RELOC_VTABLE_INHERIT,  R_DLX_GNU_VTINHERIT },
+  { BFD_RELOC_VTABLE_ENTRY,    R_DLX_GNU_VTENTRY }
+};
 
 /* Look through the relocs for a section during the first phase.
    Since we don't do .gots or .plts, we just need to consider the
    virtual table relocs for gc.  */
 
 static bfd_boolean
-elf32_dlx_check_relocs (abfd, info, sec, relocs)
-     bfd *abfd;
-     struct bfd_link_info *info;
-     asection *sec;
-     const Elf_Internal_Rela *relocs;
+elf32_dlx_check_relocs (bfd *abfd,
+                       struct bfd_link_info *info,
+                       asection *sec,
+                       const Elf_Internal_Rela *relocs)
 {
   Elf_Internal_Shdr *symtab_hdr;
-  struct elf_link_hash_entry **sym_hashes, **sym_hashes_end;
+  struct elf_link_hash_entry **sym_hashes;
   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);
-  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;
   for (rel = relocs; rel < rel_end; rel++)
@@ -549,26 +444,31 @@ elf32_dlx_check_relocs (abfd, info, sec, relocs)
 
       r_symndx = ELF32_R_SYM (rel->r_info);
       if (r_symndx < symtab_hdr->sh_info)
-        h = NULL;
+       h = NULL;
       else
-        h = sym_hashes[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;
+       }
 
       switch (ELF32_R_TYPE (rel->r_info))
-        {
-        /* This relocation describes the C++ object vtable hierarchy.
-           Reconstruct it for later use during GC.  */
-        case R_DLX_GNU_VTINHERIT:
-          if (!_bfd_elf32_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
-            return FALSE;
-          break;
-
-        /* This relocation describes which C++ vtable entries are actually
-           used.  Record for later use during GC.  */
-        case R_DLX_GNU_VTENTRY:
-          if (!_bfd_elf32_gc_record_vtentry (abfd, sec, h, rel->r_addend))
-            return FALSE;
-          break;
-        }
+       {
+       /* This relocation describes the C++ object vtable hierarchy.
+          Reconstruct it for later use during GC.  */
+       case R_DLX_GNU_VTINHERIT:
+         if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
+           return FALSE;
+         break;
+
+       /* This relocation describes which C++ vtable entries are actually
+          used.  Record for later use during GC.  */
+       case R_DLX_GNU_VTENTRY:
+         if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
+           return FALSE;
+         break;
+       }
     }
 
   return TRUE;
@@ -577,9 +477,8 @@ elf32_dlx_check_relocs (abfd, info, sec, relocs)
 /* Given a BFD reloc type, return a howto structure.  */
 
 static reloc_howto_type *
-elf32_dlx_reloc_type_lookup (abfd, code)
-     bfd *abfd ATTRIBUTE_UNUSED;
-     bfd_reloc_code_real_type code;
+elf32_dlx_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
+                            bfd_reloc_code_real_type code)
 {
   unsigned int i;
 
@@ -604,57 +503,79 @@ elf32_dlx_reloc_type_lookup (abfd, code)
 }
 
 static reloc_howto_type *
-dlx_rtype_to_howto (r_type)
-     unsigned int r_type;
+elf32_dlx_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
+                            const char *r_name)
+{
+  unsigned int i;
+
+  for (i = 0;
+       i < sizeof (dlx_elf_howto_table) / sizeof (dlx_elf_howto_table[0]);
+       i++)
+    if (dlx_elf_howto_table[i].name != NULL
+       && strcasecmp (dlx_elf_howto_table[i].name, r_name) == 0)
+      return &dlx_elf_howto_table[i];
+
+  if (strcasecmp (elf_dlx_gnu_rel16_s2.name, r_name) == 0)
+    return &elf_dlx_gnu_rel16_s2;
+  if (strcasecmp (elf_dlx_gnu_rel26_s2.name, r_name) == 0)
+    return &elf_dlx_gnu_rel26_s2;
+  if (strcasecmp (elf_dlx_reloc_16_hi.name, r_name) == 0)
+    return &elf_dlx_reloc_16_hi;
+  if (strcasecmp (elf_dlx_reloc_16_lo.name, r_name) == 0)
+    return &elf_dlx_reloc_16_lo;
+
+  return NULL;
+}
+
+static reloc_howto_type *
+dlx_rtype_to_howto (bfd *abfd, unsigned int r_type)
 {
   switch (r_type)
     {
     case R_DLX_RELOC_16_PCREL:
       return & elf_dlx_gnu_rel16_s2;
-      break;
     case R_DLX_RELOC_26_PCREL:
       return & elf_dlx_gnu_rel26_s2;
-      break;
     case R_DLX_RELOC_16_HI:
       return & elf_dlx_reloc_16_hi;
-      break;
     case R_DLX_RELOC_16_LO:
       return & elf_dlx_reloc_16_lo;
-      break;
-
     default:
-      BFD_ASSERT (r_type < (unsigned int) R_DLX_max);
+      if (r_type >= (unsigned int) R_DLX_max)
+       {
+         _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
+                             abfd, r_type);
+         bfd_set_error (bfd_error_bad_value);
+         return NULL;
+       }
       return & dlx_elf_howto_table[r_type];
-      break;
     }
 }
 
-static void
-elf32_dlx_info_to_howto (abfd, cache_ptr, dst)
-     bfd * abfd ATTRIBUTE_UNUSED;
-     arelent * cache_ptr ATTRIBUTE_UNUSED;
-     Elf_Internal_Rela * dst ATTRIBUTE_UNUSED;
+static bfd_boolean
+elf32_dlx_info_to_howto (bfd * abfd ATTRIBUTE_UNUSED,
+                        arelent * cache_ptr ATTRIBUTE_UNUSED,
+                        Elf_Internal_Rela * dst ATTRIBUTE_UNUSED)
 {
-  abort ();
+  return FALSE;
 }
 
-static void
-elf32_dlx_info_to_howto_rel (abfd, cache_ptr, dst)
-     bfd *abfd ATTRIBUTE_UNUSED;
-     arelent *cache_ptr;
-     Elf_Internal_Rela *dst;
+static bfd_boolean
+elf32_dlx_info_to_howto_rel (bfd *abfd,
+                            arelent *cache_ptr,
+                            Elf_Internal_Rela *dst)
 {
   unsigned int r_type;
 
   r_type = ELF32_R_TYPE (dst->r_info);
-  cache_ptr->howto = dlx_rtype_to_howto (r_type);
-  return;
+  cache_ptr->howto = dlx_rtype_to_howto (abfd, r_type);
+  return cache_ptr->howto != NULL;
 }
 
-#define TARGET_BIG_SYM          bfd_elf32_dlx_big_vec
-#define TARGET_BIG_NAME         "elf32-dlx"
-#define ELF_ARCH                bfd_arch_dlx
-#define ELF_MACHINE_CODE        EM_DLX
-#define ELF_MAXPAGESIZE         1 /* FIXME: This number is wrong,  It should be the page size in bytes.  */
+#define TARGET_BIG_SYM         dlx_elf32_be_vec
+#define TARGET_BIG_NAME                "elf32-dlx"
+#define ELF_ARCH               bfd_arch_dlx
+#define ELF_MACHINE_CODE       EM_DLX
+#define ELF_MAXPAGESIZE                1 /* FIXME: This number is wrong,  It should be the page size in bytes.  */
 
 #include "elf32-target.h"
This page took 0.040754 seconds and 4 git commands to generate.