Automatic date update in version.in
[deliverable/binutils-gdb.git] / bfd / coff-h8300.c
index ef29664e782150d43ff81acee1ffbfc37377f2bf..fa688b683a82159dfa377d4dc592158e597c31ca 100644 (file)
@@ -1,14 +1,12 @@
 /* BFD back-end for Renesas H8/300 COFF binaries.
-   Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-   2000, 2001, 2002, 2003, 2004, 2005
-   Free Software Foundation, Inc.
+   Copyright (C) 1990-2017 Free Software Foundation, Inc.
    Written by Steve Chamberlain, <sac@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,
 
    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.  */
 
-#include "bfd.h"
 #include "sysdep.h"
+#include "bfd.h"
 #include "libbfd.h"
 #include "bfdlink.h"
 #include "genlink.h"
@@ -59,35 +58,6 @@ struct funcvec_hash_table
     unsigned int offset;
   };
 
-static struct bfd_hash_entry *
-funcvec_hash_newfunc
-  (struct bfd_hash_entry *, struct bfd_hash_table *, const char *);
-
-static bfd_boolean
-funcvec_hash_table_init
-  (struct funcvec_hash_table *, bfd *,
-   struct bfd_hash_entry *(*) (struct bfd_hash_entry *,
-                              struct bfd_hash_table *,
-                              const char *));
-
-static bfd_reloc_status_type special
-  (bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **);
-static int select_reloc
-  (reloc_howto_type *);
-static void rtype2howto
-  (arelent *, struct internal_reloc *);
-static void reloc_processing
-  (arelent *, struct internal_reloc *, asymbol **, bfd *, asection *);
-static bfd_boolean h8300_symbol_address_p
-  (bfd *, asection *, bfd_vma);
-static int h8300_reloc16_estimate
-  (bfd *, asection *, arelent *, unsigned int,
-   struct bfd_link_info *);
-static void h8300_reloc16_extra_cases
-  (bfd *, struct bfd_link_info *, struct bfd_link_order *, arelent *,
-   bfd_byte *, unsigned int *, unsigned int *);
-static bfd_boolean h8300_bfd_link_add_symbols
-  (bfd *, struct bfd_link_info *);
 
 /* To lookup a value in the function vector hash table.  */
 #define funcvec_hash_lookup(table, string, create, copy) \
@@ -181,13 +151,14 @@ funcvec_hash_table_init (struct funcvec_hash_table *table,
                         struct bfd_hash_entry *(*newfunc)
                           (struct bfd_hash_entry *,
                            struct bfd_hash_table *,
-                           const char *))
+                           const char *),
+                        unsigned int entsize)
 {
   /* Initialize our local fields, then call the generic initialization
      routine.  */
   table->offset = 0;
   table->abfd = abfd;
-  return (bfd_hash_table_init (&table->root, newfunc));
+  return (bfd_hash_table_init (&table->root, newfunc, entsize));
 }
 
 /* Create the derived linker hash table.  We use a derived hash table
@@ -200,21 +171,17 @@ h8300_coff_link_hash_table_create (bfd *abfd)
   struct h8300_coff_link_hash_table *ret;
   bfd_size_type amt = sizeof (struct h8300_coff_link_hash_table);
 
-  ret = (struct h8300_coff_link_hash_table *) bfd_malloc (amt);
+  ret = (struct h8300_coff_link_hash_table *) bfd_zmalloc (amt);
   if (ret == NULL)
     return NULL;
   if (!_bfd_link_hash_table_init (&ret->root.root, abfd,
-                                 _bfd_generic_link_hash_newfunc))
+                                 _bfd_generic_link_hash_newfunc,
+                                 sizeof (struct generic_link_hash_entry)))
     {
       free (ret);
       return NULL;
     }
 
-  /* Initialize our data.  */
-  ret->vectors_sec = NULL;
-  ret->funcvec_hash_table = NULL;
-
-  /* OK.  Everything's initialized, return the base pointer.  */
   return &ret->root.root;
 }
 
@@ -228,13 +195,13 @@ h8300_coff_link_hash_table_create (bfd *abfd)
    the addend until the final link.  */
 
 static bfd_reloc_status_type
-special (bfd *abfd ATTRIBUTE_UNUSED,
-        arelent *reloc_entry ATTRIBUTE_UNUSED,
-        asymbol *symbol ATTRIBUTE_UNUSED,
-        PTR data ATTRIBUTE_UNUSED,
-        asection *input_section ATTRIBUTE_UNUSED,
-        bfd *output_bfd,
-        char **error_message ATTRIBUTE_UNUSED)
+special (bfd *      abfd ATTRIBUTE_UNUSED,
+        arelent *  reloc_entry ATTRIBUTE_UNUSED,
+        asymbol *  symbol ATTRIBUTE_UNUSED,
+        void *     data ATTRIBUTE_UNUSED,
+        asection * input_section ATTRIBUTE_UNUSED,
+        bfd *      output_bfd,
+        char **    error_message ATTRIBUTE_UNUSED)
 {
   if (output_bfd == (bfd *) NULL)
     return bfd_reloc_continue;
@@ -244,7 +211,8 @@ special (bfd *abfd ATTRIBUTE_UNUSED,
   return bfd_reloc_ok;
 }
 
-static reloc_howto_type howto_table[] = {
+static reloc_howto_type howto_table[] =
+{
   HOWTO (R_RELBYTE, 0, 0, 8, FALSE, 0, complain_overflow_bitfield, special, "8", FALSE, 0x000000ff, 0x000000ff, FALSE),
   HOWTO (R_RELWORD, 0, 1, 16, FALSE, 0, complain_overflow_bitfield, special, "16", FALSE, 0x0000ffff, 0x0000ffff, FALSE),
   HOWTO (R_RELLONG, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, special, "32", FALSE, 0xffffffff, 0xffffffff, FALSE),
@@ -369,7 +337,7 @@ rtype2howto (arelent *internal, struct internal_reloc *dst)
       internal->howto = howto_table + 19;
       break;
     default:
-      abort ();
+      internal->howto = NULL;
       break;
     }
 }
@@ -611,9 +579,7 @@ h8300_reloc16_estimate (bfd *abfd, asection *input_section, arelent *reloc,
          /* Done with this reloc.  */
          break;
        }
-
-      /* FALLTHROUGH and try to turn the 24-/32-bit reloc into a 16-bit
-        reloc.  */
+      /* Fall through.  */
 
     /* This is a 24-/32-bit absolute address in a mov insn, which can
        become an 16-bit absolute address if it's in the right range.  */
@@ -679,14 +645,10 @@ h8300_reloc16_extra_cases (bfd *abfd, struct bfd_link_info *link_info,
 
       /* Sanity check.  */
       if (gap < -128 || gap > 126)
-       {
-         if (! ((*link_info->callbacks->reloc_overflow)
-                (link_info, NULL,
-                 bfd_asymbol_name (*reloc->sym_ptr_ptr),
-                 reloc->howto->name, reloc->addend, input_section->owner,
-                 input_section, reloc->address)))
-           abort ();
-       }
+       (*link_info->callbacks->reloc_overflow)
+         (link_info, NULL, bfd_asymbol_name (*reloc->sym_ptr_ptr),
+          reloc->howto->name, reloc->addend, input_section->owner,
+          input_section, reloc->address);
 
       /* Everything looks OK.  Apply the relocation and update the
         src/dst address appropriately.  */
@@ -711,14 +673,10 @@ h8300_reloc16_extra_cases (bfd *abfd, struct bfd_link_info *link_info,
 
       /* Sanity check.  */
       if (gap > 32766 || gap < -32768)
-       {
-         if (! ((*link_info->callbacks->reloc_overflow)
-                (link_info, NULL,
-                 bfd_asymbol_name (*reloc->sym_ptr_ptr),
-                 reloc->howto->name, reloc->addend, input_section->owner,
-                 input_section, reloc->address)))
-           abort ();
-       }
+       (*link_info->callbacks->reloc_overflow)
+         (link_info, NULL, bfd_asymbol_name (*reloc->sym_ptr_ptr),
+          reloc->howto->name, reloc->addend, input_section->owner,
+          input_section, reloc->address);
 
       /* Everything looks OK.  Apply the relocation and update the
         src/dst address appropriately.  */
@@ -801,14 +759,10 @@ h8300_reloc16_extra_cases (bfd *abfd, struct bfd_link_info *link_info,
          src_address += 4;
        }
       else
-       {
-         if (! ((*link_info->callbacks->reloc_overflow)
-                (link_info, NULL,
-                 bfd_asymbol_name (*reloc->sym_ptr_ptr),
-                 reloc->howto->name, reloc->addend, input_section->owner,
-                 input_section, reloc->address)))
-           abort ();
-       }
+       (*link_info->callbacks->reloc_overflow)
+         (link_info, NULL, bfd_asymbol_name (*reloc->sym_ptr_ptr),
+          reloc->howto->name, reloc->addend, input_section->owner,
+          input_section, reloc->address);
       break;
 
     /* A 16-bit absolute branch that is now an 8-bit pc-relative branch.  */
@@ -825,14 +779,10 @@ h8300_reloc16_extra_cases (bfd *abfd, struct bfd_link_info *link_info,
 
       /* Sanity check.  */
       if (gap < -128 || gap > 126)
-       {
-         if (! ((*link_info->callbacks->reloc_overflow)
-                (link_info, NULL,
-                 bfd_asymbol_name (*reloc->sym_ptr_ptr),
-                 reloc->howto->name, reloc->addend, input_section->owner,
-                 input_section, reloc->address)))
-           abort ();
-       }
+       (*link_info->callbacks->reloc_overflow)
+         (link_info, NULL, bfd_asymbol_name (*reloc->sym_ptr_ptr),
+          reloc->howto->name, reloc->addend, input_section->owner,
+          input_section, reloc->address);
 
       /* Now fix the instruction itself.  */
       switch (data[dst_address - 1])
@@ -872,14 +822,10 @@ h8300_reloc16_extra_cases (bfd *abfd, struct bfd_link_info *link_info,
 
       /* Sanity check.  */
       if (gap < -128 || gap > 126)
-       {
-         if (! ((*link_info->callbacks->reloc_overflow)
-                (link_info, NULL,
-                 bfd_asymbol_name (*reloc->sym_ptr_ptr),
-                 reloc->howto->name, reloc->addend, input_section->owner,
-                 input_section, reloc->address)))
-           abort ();
-       }
+       (*link_info->callbacks->reloc_overflow)
+         (link_info, NULL, bfd_asymbol_name (*reloc->sym_ptr_ptr),
+          reloc->howto->name, reloc->addend, input_section->owner,
+          input_section, reloc->address);
 
       /* Now fix the instruction.  */
       switch (data[dst_address - 2])
@@ -1072,14 +1018,10 @@ h8300_reloc16_extra_cases (bfd *abfd, struct bfd_link_info *link_info,
 
       /* Sanity check.  */
       if (gap < -128 || gap > 126)
-       {
-         if (! ((*link_info->callbacks->reloc_overflow)
-                (link_info, NULL,
-                 bfd_asymbol_name (*reloc->sym_ptr_ptr),
-                 reloc->howto->name, reloc->addend, input_section->owner,
-                 input_section, reloc->address)))
-           abort ();
-       }
+       (*link_info->callbacks->reloc_overflow)
+         (link_info, NULL, bfd_asymbol_name (*reloc->sym_ptr_ptr),
+          reloc->howto->name, reloc->addend, input_section->owner,
+          input_section, reloc->address);
 
       /* Everything looks OK.  Fix the condition in the instruction, apply
         the relocation, and update the src/dst address appropriately.  */
@@ -1120,11 +1062,11 @@ h8300_reloc16_extra_cases (bfd *abfd, struct bfd_link_info *link_info,
        struct h8300_coff_link_hash_table *htab;
        asection *vectors_sec;
 
-       if (link_info->hash->creator != abfd->xvec)
+       if (link_info->output_bfd->xvec != abfd->xvec)
          {
-           (*_bfd_error_handler)
+           _bfd_error_handler
              (_("cannot handle R_MEM_INDIRECT reloc when using %s output"),
-              link_info->hash->creator->name);
+              link_info->output_bfd->xvec->name);
 
            /* What else can we do?  This function doesn't allow return
               of an error, and we don't want to call abort as that
@@ -1155,14 +1097,10 @@ h8300_reloc16_extra_cases (bfd *abfd, struct bfd_link_info *link_info,
                src_address += 1;
              }
            else
-             {
-               if (! ((*link_info->callbacks->reloc_overflow)
-                      (link_info, NULL,
-                       bfd_asymbol_name (*reloc->sym_ptr_ptr),
-                       reloc->howto->name, reloc->addend, input_section->owner,
-                       input_section, reloc->address)))
-                 abort ();
-             }
+             (*link_info->callbacks->reloc_overflow)
+               (link_info, NULL, bfd_asymbol_name (*reloc->sym_ptr_ptr),
+                reloc->howto->name, reloc->addend, input_section->owner,
+                input_section, reloc->address);
            break;
          }
 
@@ -1268,7 +1206,7 @@ h8300_bfd_link_add_symbols (bfd *abfd, struct bfd_link_info *info)
   /* Add the symbols using the generic code.  */
   _bfd_generic_link_add_symbols (abfd, info);
 
-  if (info->hash->creator != abfd->xvec)
+  if (info->output_bfd->xvec != abfd->xvec)
     return TRUE;
 
   htab = h8300_coff_hash_table (info);
@@ -1281,12 +1219,12 @@ h8300_bfd_link_add_symbols (bfd *abfd, struct bfd_link_info *info)
       /* Make sure the appropriate flags are set, including SEC_IN_MEMORY.  */
       flags = (SEC_ALLOC | SEC_LOAD
               | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_READONLY);
-      htab->vectors_sec = bfd_make_section (abfd, ".vectors");
+      htab->vectors_sec = bfd_make_section_with_flags (abfd, ".vectors",
+                                                      flags);
 
       /* If the section wasn't created, or we couldn't set the flags,
         quit quickly now, rather than dying a painful death later.  */
-      if (!htab->vectors_sec
-         || !bfd_set_section_flags (abfd, htab->vectors_sec, flags))
+      if (!htab->vectors_sec)
        return FALSE;
 
       /* Also create the vector hash table.  */
@@ -1298,7 +1236,8 @@ h8300_bfd_link_add_symbols (bfd *abfd, struct bfd_link_info *info)
 
       /* And initialize the funcvec hash table.  */
       if (!funcvec_hash_table_init (funcvec_hash_table, abfd,
-                                   funcvec_hash_newfunc))
+                                   funcvec_hash_newfunc,
+                                   sizeof (struct funcvec_hash_entry)))
        {
          bfd_release (abfd, funcvec_hash_table);
          return FALSE;
@@ -1432,6 +1371,11 @@ h8300_bfd_link_add_symbols (bfd *abfd, struct bfd_link_info *info)
 #define coff_bfd_link_hash_table_create h8300_coff_link_hash_table_create
 
 #define COFF_LONG_FILENAMES
+
+#ifndef bfd_pe_print_pdata
+#define bfd_pe_print_pdata     NULL
+#endif
+
 #include "coffcode.h"
 
 #undef coff_bfd_get_relocated_section_contents
@@ -1440,4 +1384,4 @@ h8300_bfd_link_add_symbols (bfd *abfd, struct bfd_link_info *info)
   bfd_coff_reloc16_get_relocated_section_contents
 #define coff_bfd_relax_section bfd_coff_reloc16_relax_section
 
-CREATE_BIG_COFF_TARGET_VEC (h8300coff_vec, "coff-h8300", BFD_IS_RELAXABLE, 0, '_', NULL, COFF_SWAP_TABLE)
+CREATE_BIG_COFF_TARGET_VEC (h8300_coff_vec, "coff-h8300", BFD_IS_RELAXABLE, 0, '_', NULL, COFF_SWAP_TABLE)
This page took 0.032879 seconds and 4 git commands to generate.