* Makefile.in (alphanbsd-tdep.o): Add $(frame_h) to dependency
[deliverable/binutils-gdb.git] / bfd / coff-sh.c
index 2fdde67301f656b9f43cdbd41db59d5f04bb2822..d1dc4fdbcf720057335a5ba0b9afad503cda71e2 100644 (file)
@@ -1,5 +1,6 @@
 /* BFD back-end for Hitachi Super-H COFF binaries.
-   Copyright 1993, 94, 95, 96, 97, 98, 1999, 2000 Free Software Foundation, Inc.
+   Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+   Free Software Foundation, Inc.
    Contributed by Cygnus Support.
    Written by Steve Chamberlain, <sac@cygnus.com>.
    Relaxing code written by Ian Lance Taylor, <ian@cygnus.com>.
@@ -22,6 +23,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 #include "bfd.h"
 #include "sysdep.h"
+#include "libiberty.h"
 #include "libbfd.h"
 #include "bfdlink.h"
 #include "coff/sh.h"
@@ -29,6 +31,15 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 #ifdef COFF_WITH_PE
 #include "coff/pe.h"
+
+#ifndef COFF_IMAGE_WITH_PE
+static boolean sh_align_load_span
+  PARAMS ((bfd *, asection *, bfd_byte *,
+          boolean (*) (bfd *, asection *, PTR, bfd_byte *, bfd_vma),
+          PTR, bfd_vma **, bfd_vma *, bfd_vma, bfd_vma, boolean *));
+
+#define _bfd_sh_align_load_span sh_align_load_span
+#endif
 #endif
 
 #include "libcoff.h"
@@ -41,7 +52,9 @@ static boolean sh_relax_section
   PARAMS ((bfd *, asection *, struct bfd_link_info *, boolean *));
 static boolean sh_relax_delete_bytes
   PARAMS ((bfd *, asection *, bfd_vma, int));
+#ifndef COFF_IMAGE_WITH_PE
 static const struct sh_opcode *sh_insn_info PARAMS ((unsigned int));
+#endif
 static boolean sh_align_loads
   PARAMS ((bfd *, asection *, struct internal_reloc *, bfd_byte *, boolean *));
 static boolean sh_swap_insns
@@ -52,6 +65,7 @@ static boolean sh_relocate_section
 static bfd_byte *sh_coff_get_relocated_section_contents
   PARAMS ((bfd *, struct bfd_link_info *, struct bfd_link_order *,
           bfd_byte *, boolean, asymbol **));
+static reloc_howto_type * sh_coff_reloc_type_lookup PARAMS ((bfd *, bfd_reloc_code_real_type));
 
 #ifdef COFF_WITH_PE
 /* Can't build import tables with 2**4 alignment.  */
@@ -70,6 +84,7 @@ static bfd_byte *sh_coff_get_relocated_section_contents
 #define COFF_LONG_FILENAMES
 
 #ifdef COFF_WITH_PE
+static boolean in_reloc_p PARAMS ((bfd *, reloc_howto_type *));
 /* Return true if this relocation should
    appear in the output .reloc section.  */
 static boolean in_reloc_p (abfd, howto)
@@ -77,7 +92,7 @@ static boolean in_reloc_p (abfd, howto)
      reloc_howto_type * howto;
 {
   return ! howto->pc_relative && howto->type != R_SH_IMAGEBASE;
-}     
+}
 #endif
 
 /* The supported relocations.  There are a lot of relocations defined
@@ -160,18 +175,18 @@ static reloc_howto_type sh_coff_howtos[] =
 
   EMPTY_HOWTO (15),
 #ifdef COFF_WITH_PE
-  HOWTO (R_SH_IMAGEBASE,        /* type */                                 
-        0,                     /* rightshift */                           
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */ 
-        32,                    /* bitsize */                   
-        false,                 /* pc_relative */                          
-        0,                     /* bitpos */                               
+  HOWTO (R_SH_IMAGEBASE,        /* type */
+        0,                     /* rightshift */
+        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        32,                    /* bitsize */
+        false,                 /* pc_relative */
+        0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
-        sh_reloc,              /* special_function */                     
-        "rva32",               /* name */                                 
-        true,                  /* partial_inplace */                      
-        0xffffffff,            /* src_mask */                             
-        0xffffffff,            /* dst_mask */                             
+        sh_reloc,              /* special_function */
+        "rva32",               /* name */
+        true,                  /* partial_inplace */
+        0xffffffff,            /* src_mask */
+        0xffffffff,            /* dst_mask */
         false),                /* pcrel_offset */
 #else
   EMPTY_HOWTO (16), /* R_SH_IMM8 */
@@ -364,8 +379,8 @@ static reloc_howto_type sh_coff_howtos[] =
 
 #ifndef COFF_WITH_PE
 /* Swap the r_offset field in and out.  */
-#define SWAP_IN_RELOC_OFFSET  bfd_h_get_32
-#define SWAP_OUT_RELOC_OFFSET bfd_h_put_32
+#define SWAP_IN_RELOC_OFFSET  H_GET_32
+#define SWAP_OUT_RELOC_OFFSET H_PUT_32
 
 /* Swap out extra information in the reloc structure.  */
 #define SWAP_OUT_RELOC_EXTRA(abfd, src, dst)   \
@@ -380,14 +395,14 @@ static reloc_howto_type sh_coff_howtos[] =
 /* Get the value of a symbol, when performing a relocation.  */
 
 static long
-get_symbol_value (symbol)       
+get_symbol_value (symbol)
      asymbol *symbol;
-{                                             
+{
   bfd_vma relocation;
 
   if (bfd_is_com_section (symbol->section))
-    relocation = 0;                           
-  else 
+    relocation = 0;
+  else
     relocation = (symbol->value +
                  symbol->section->output_section->vma +
                  symbol->section->output_offset);
@@ -399,10 +414,11 @@ get_symbol_value (symbol)
 /* Convert an rtype to howto for the COFF backend linker.
    Copied from coff-i386.  */
 #define coff_rtype_to_howto coff_sh_rtype_to_howto
+static reloc_howto_type * coff_sh_rtype_to_howto PARAMS ((bfd *, asection *, struct internal_reloc *, struct coff_link_hash_entry *, struct internal_syment *, bfd_vma *));
 
 static reloc_howto_type *
 coff_sh_rtype_to_howto (abfd, sec, rel, h, sym, addendp)
-     bfd * abfd;
+     bfd * abfd ATTRIBUTE_UNUSED;
      asection * sec;
      struct internal_reloc * rel;
      struct coff_link_hash_entry * h;
@@ -448,13 +464,16 @@ coff_sh_rtype_to_howto (abfd, sec, rel, h, sym, addendp)
   return howto;
 }
 
+#endif /* COFF_WITH_PE */
+
 /* This structure is used to map BFD reloc codes to SH PE relocs.  */
 struct shcoff_reloc_map
 {
-  unsigned char bfd_reloc_val;
+  bfd_reloc_code_real_type bfd_reloc_val;
   unsigned char shcoff_reloc_val;
 };
 
+#ifdef COFF_WITH_PE
 /* An array mapping BFD reloc codes to SH PE relocs.  */
 static const struct shcoff_reloc_map sh_reloc_map[] =
 {
@@ -462,6 +481,14 @@ static const struct shcoff_reloc_map sh_reloc_map[] =
   { BFD_RELOC_RVA, R_SH_IMAGEBASE },
   { BFD_RELOC_CTOR, R_SH_IMM32CE },
 };
+#else
+/* An array mapping BFD reloc codes to SH PE relocs.  */
+static const struct shcoff_reloc_map sh_reloc_map[] =
+{
+  { BFD_RELOC_32, R_SH_IMM32 },
+  { BFD_RELOC_CTOR, R_SH_IMM32 },
+};
+#endif
 
 /* Given a BFD reloc code, return the howto structure for the
    corresponding SH PE reloc.  */
@@ -474,16 +501,13 @@ sh_coff_reloc_type_lookup (abfd, code)
 {
   unsigned int i;
 
-  for (i = 0; i < sizeof (sh_reloc_map) / sizeof (struct shcoff_reloc_map); i++)
-    {
-      if (sh_reloc_map[i].bfd_reloc_val == code)
-       return &sh_coff_howtos[(int) sh_reloc_map[i].shcoff_reloc_val];
-    }
+  for (i = ARRAY_SIZE (sh_reloc_map); i--;)
+    if (sh_reloc_map[i].bfd_reloc_val == code)
+      return &sh_coff_howtos[(int) sh_reloc_map[i].shcoff_reloc_val];
 
   fprintf (stderr, "SH Error: unknown reloc type %d\n", code);
   return NULL;
 }
-#endif /* COFF_WITH_PE */
 
 /* This macro is used in coffcode.h to get the howto corresponding to
    an internal reloc.  */
@@ -574,14 +598,14 @@ sh_reloc (abfd, reloc_entry, symbol_in, data, input_section, output_bfd,
 #endif
       insn = bfd_get_32 (abfd, hit_data);
       insn += sym_value + reloc_entry->addend;
-      bfd_put_32 (abfd, insn, hit_data);
+      bfd_put_32 (abfd, (bfd_vma) insn, hit_data);
       break;
 #ifdef COFF_WITH_PE
     case R_SH_IMAGEBASE:
       insn = bfd_get_32 (abfd, hit_data);
-      insn += (sym_value + reloc_entry->addend
-              - pe_data (input_section->output_section->owner)->pe_opthdr.ImageBase);
-      bfd_put_32 (abfd, insn, hit_data);
+      insn += sym_value + reloc_entry->addend;
+      insn -= pe_data (input_section->output_section->owner)->pe_opthdr.ImageBase;
+      bfd_put_32 (abfd, (bfd_vma) insn, hit_data);
       break;
 #endif
     case R_SH_PCDISP:
@@ -595,7 +619,7 @@ sh_reloc (abfd, reloc_entry, symbol_in, data, input_section, output_bfd,
       if (insn & 0x800)
        sym_value -= 0x1000;
       insn = (insn & 0xf000) | (sym_value & 0xfff);
-      bfd_put_16 (abfd, insn, hit_data);
+      bfd_put_16 (abfd, (bfd_vma) insn, hit_data);
       if (sym_value < (bfd_vma) -0x1000 || sym_value >= 0x1000)
        return bfd_reloc_overflow;
       break;
@@ -665,7 +689,7 @@ sh_reloc (abfd, reloc_entry, symbol_in, data, input_section, output_bfd,
    align load and store instructions on four byte boundaries if we
    can, by swapping them with one of the adjacent instructions.  */
 
-static boolean 
+static boolean
 sh_relax_section (abfd, sec, link_info, again)
      bfd *abfd;
      asection *sec;
@@ -746,7 +770,7 @@ sh_relax_section (abfd, sec, link_info, again)
       if (laddr >= sec->_raw_size)
        {
          (*_bfd_error_handler) ("%s: 0x%lx: warning: bad R_SH_USES offset",
-                                bfd_get_filename (abfd),
+                                bfd_archive_filename (abfd),
                                 (unsigned long) irel->r_vaddr);
          continue;
        }
@@ -757,7 +781,7 @@ sh_relax_section (abfd, sec, link_info, again)
        {
          ((*_bfd_error_handler)
           ("%s: 0x%lx: warning: R_SH_USES points to unrecognized insn 0x%x",
-           bfd_get_filename (abfd), (unsigned long) irel->r_vaddr, insn));
+           bfd_archive_filename (abfd), (unsigned long) irel->r_vaddr, insn));
          continue;
        }
 
@@ -769,12 +793,12 @@ sh_relax_section (abfd, sec, link_info, again)
         on a four byte boundary.  */
       paddr = insn & 0xff;
       paddr *= 4;
-      paddr += (laddr + 4) &~ 3;
+      paddr += (laddr + 4) &~ (bfd_vma) 3;
       if (paddr >= sec->_raw_size)
        {
          ((*_bfd_error_handler)
           ("%s: 0x%lx: warning: bad R_SH_USES load offset",
-           bfd_get_filename (abfd), (unsigned long) irel->r_vaddr));
+           bfd_archive_filename (abfd), (unsigned long) irel->r_vaddr));
          continue;
        }
 
@@ -797,7 +821,7 @@ sh_relax_section (abfd, sec, link_info, again)
        {
          ((*_bfd_error_handler)
           ("%s: 0x%lx: warning: could not find expected reloc",
-           bfd_get_filename (abfd), (unsigned long) paddr));
+           bfd_archive_filename (abfd), (unsigned long) paddr));
          continue;
        }
 
@@ -813,7 +837,7 @@ sh_relax_section (abfd, sec, link_info, again)
        {
          ((*_bfd_error_handler)
           ("%s: 0x%lx: warning: symbol in unexpected section",
-           bfd_get_filename (abfd), (unsigned long) paddr));
+           bfd_archive_filename (abfd), (unsigned long) paddr));
          continue;
        }
 
@@ -871,8 +895,8 @@ sh_relax_section (abfd, sec, link_info, again)
 
       if (coff_section_data (abfd, sec) == NULL)
        {
-         sec->used_by_bfd =
-           ((PTR) bfd_zalloc (abfd, sizeof (struct coff_section_tdata)));
+         bfd_size_type amt = sizeof (struct coff_section_tdata);
+         sec->used_by_bfd = (PTR) bfd_zalloc (abfd, amt);
          if (sec->used_by_bfd == NULL)
            goto error_return;
        }
@@ -899,7 +923,7 @@ sh_relax_section (abfd, sec, link_info, again)
              it will be handled here like other internal PCDISP
              relocs.  */
          bfd_put_16 (abfd,
-                     0xb000 | ((foff >> 1) & 0xfff),
+                     (bfd_vma) 0xb000 | ((foff >> 1) & 0xfff),
                      contents + irel->r_vaddr - sec->vma);
        }
       else
@@ -907,7 +931,8 @@ sh_relax_section (abfd, sec, link_info, again)
          /* We can't fully resolve this yet, because the external
              symbol value may be changed by future relaxing.  We let
              the final link phase handle it.  */
-         bfd_put_16 (abfd, 0xb000, contents + irel->r_vaddr - sec->vma);
+         bfd_put_16 (abfd, (bfd_vma) 0xb000,
+                     contents + irel->r_vaddr - sec->vma);
        }
 
       /* See if there is another R_SH_USES reloc referring to the same
@@ -947,7 +972,7 @@ sh_relax_section (abfd, sec, link_info, again)
        {
          ((*_bfd_error_handler)
           ("%s: 0x%lx: warning: could not find expected COUNT reloc",
-           bfd_get_filename (abfd), (unsigned long) paddr));
+           bfd_archive_filename (abfd), (unsigned long) paddr));
          continue;
        }
 
@@ -956,7 +981,7 @@ sh_relax_section (abfd, sec, link_info, again)
       if (irelcount->r_offset == 0)
        {
          ((*_bfd_error_handler) ("%s: 0x%lx: warning: bad count",
-                                 bfd_get_filename (abfd),
+                                 bfd_archive_filename (abfd),
                                  (unsigned long) paddr));
          continue;
        }
@@ -1008,8 +1033,8 @@ sh_relax_section (abfd, sec, link_info, again)
        {
          if (coff_section_data (abfd, sec) == NULL)
            {
-             sec->used_by_bfd =
-               ((PTR) bfd_zalloc (abfd, sizeof (struct coff_section_tdata)));
+             bfd_size_type amt = sizeof (struct coff_section_tdata);
+             sec->used_by_bfd = (PTR) bfd_zalloc (abfd, amt);
              if (sec->used_by_bfd == NULL)
                goto error_return;
            }
@@ -1041,8 +1066,8 @@ sh_relax_section (abfd, sec, link_info, again)
          /* Cache the section contents for coff_link_input_bfd.  */
          if (coff_section_data (abfd, sec) == NULL)
            {
-             sec->used_by_bfd =
-               ((PTR) bfd_zalloc (abfd, sizeof (struct coff_section_tdata)));
+             bfd_size_type amt = sizeof (struct coff_section_tdata);
+             sec->used_by_bfd = (PTR) bfd_zalloc (abfd, amt);
              if (sec->used_by_bfd == NULL)
                goto error_return;
              coff_section_data (abfd, sec)->relocs = NULL;
@@ -1102,7 +1127,8 @@ sh_relax_delete_bytes (abfd, sec, addr, count)
     }
 
   /* Actually delete the bytes.  */
-  memmove (contents + addr, contents + addr + count, toaddr - addr - count);
+  memmove (contents + addr, contents + addr + count,
+          (size_t) (toaddr - addr - count));
   if (irelalign == NULL)
     sec->_cooked_size -= count;
   else
@@ -1113,7 +1139,7 @@ sh_relax_delete_bytes (abfd, sec, addr, count)
 
       BFD_ASSERT ((count & 1) == 0);
       for (i = 0; i < count; i += 2)
-       bfd_put_16 (abfd, NOP_OPCODE, contents + toaddr - count + i);
+       bfd_put_16 (abfd, (bfd_vma) NOP_OPCODE, contents + toaddr - count + i);
     }
 
   /* Adjust all the relocs.  */
@@ -1299,14 +1325,14 @@ sh_relax_delete_bytes (abfd, sec, addr, count)
              insn += adjust / 2;
              if ((oinsn & 0xff00) != (insn & 0xff00))
                overflow = true;
-             bfd_put_16 (abfd, insn, contents + nraddr);
+             bfd_put_16 (abfd, (bfd_vma) insn, contents + nraddr);
              break;
 
            case R_SH_PCDISP:
              insn += adjust / 2;
              if ((oinsn & 0xf000) != (insn & 0xf000))
                overflow = true;
-             bfd_put_16 (abfd, insn, contents + nraddr);
+             bfd_put_16 (abfd, (bfd_vma) insn, contents + nraddr);
              break;
 
            case R_SH_PCRELIMM8BY4:
@@ -1320,26 +1346,26 @@ sh_relax_delete_bytes (abfd, sec, addr, count)
                }
              if ((oinsn & 0xff00) != (insn & 0xff00))
                overflow = true;
-             bfd_put_16 (abfd, insn, contents + nraddr);
+             bfd_put_16 (abfd, (bfd_vma) insn, contents + nraddr);
              break;
 
            case R_SH_SWITCH8:
              voff += adjust;
              if (voff < 0 || voff >= 0xff)
                overflow = true;
-             bfd_put_8 (abfd, voff, contents + nraddr);
+             bfd_put_8 (abfd, (bfd_vma) voff, contents + nraddr);
              break;
 
            case R_SH_SWITCH16:
              voff += adjust;
              if (voff < - 0x8000 || voff >= 0x8000)
                overflow = true;
-             bfd_put_signed_16 (abfd, voff, contents + nraddr);
+             bfd_put_signed_16 (abfd, (bfd_vma) voff, contents + nraddr);
              break;
 
            case R_SH_SWITCH32:
              voff += adjust;
-             bfd_put_signed_32 (abfd, voff, contents + nraddr);
+             bfd_put_signed_32 (abfd, (bfd_vma) voff, contents + nraddr);
              break;
 
            case R_SH_USES:
@@ -1351,7 +1377,7 @@ sh_relax_delete_bytes (abfd, sec, addr, count)
            {
              ((*_bfd_error_handler)
               ("%s: 0x%lx: fatal: reloc overflow while relaxing",
-               bfd_get_filename (abfd), (unsigned long) irel->r_vaddr));
+               bfd_archive_filename (abfd), (unsigned long) irel->r_vaddr));
              bfd_set_error (bfd_error_bad_value);
              return false;
            }
@@ -1451,7 +1477,7 @@ sh_relax_delete_bytes (abfd, sec, addr, count)
     {
       ((*_bfd_error_handler)
        ("%s: fatal: generic symbols retrieved before relaxing",
-       bfd_get_filename (abfd)));
+       bfd_archive_filename (abfd)));
       bfd_set_error (bfd_error_invalid_operation);
       return false;
     }
@@ -1502,7 +1528,7 @@ sh_relax_delete_bytes (abfd, sec, addr, count)
        {
          /* Tail recursion.  */
          return sh_relax_delete_bytes (abfd, sec, alignaddr,
-                                       alignto - alignaddr);
+                                       (int) (alignto - alignaddr));
        }
     }
 
@@ -1547,7 +1573,7 @@ struct sh_opcode
      mask value in the sh_major_opcode structure.  */
   unsigned short opcode;
   /* Flags for this instruction.  */
-  unsigned short flags;
+  unsigned long flags;
 };
 
 /* Flag which appear in the sh_opcode structure.  */
@@ -1620,6 +1646,7 @@ struct sh_opcode
 #define SETSAS (0x40000)
 #define SETSAS_REG(x) USESAS_REG (x)
 
+#ifndef COFF_IMAGE_WITH_PE
 static boolean sh_insn_uses_reg
   PARAMS ((unsigned int, const struct sh_opcode *, unsigned int));
 static boolean sh_insn_sets_reg
@@ -1638,7 +1665,7 @@ static boolean sh_insns_conflict
 static boolean sh_load_use
   PARAMS ((unsigned int, const struct sh_opcode *, unsigned int,
           const struct sh_opcode *));
-
+#endif
 /* The opcode maps.  */
 
 #define MAP(a) a, sizeof a / sizeof a[0]
@@ -2061,6 +2088,7 @@ static const struct sh_minor_opcode sh_opcodef[] =
   { MAP (sh_opcodef1), 0xf0ff }
 };
 
+#ifndef COFF_IMAGE_WITH_PE
 static struct sh_major_opcode sh_opcodes[] =
 {
   { MAP (sh_opcode0) },
@@ -2080,6 +2108,7 @@ static struct sh_major_opcode sh_opcodes[] =
   { MAP (sh_opcodee) },
   { MAP (sh_opcodef) }
 };
+#endif
 
 /* The double data transfer / parallel processing insns are not
    described here.  This will cause sh_align_load_span to leave them alone.  */
@@ -2101,6 +2130,7 @@ static const struct sh_minor_opcode sh_dsp_opcodef[] =
   { MAP (sh_dsp_opcodef0), 0xfc0d }
 };
 
+#ifndef COFF_IMAGE_WITH_PE
 /* Given an instruction, return a pointer to the corresponding
    sh_opcode structure.  Return NULL if the instruction is not
    recognized.  */
@@ -2131,7 +2161,7 @@ sh_insn_info (insn)
          return op;
     }
 
-  return NULL;  
+  return NULL;
 }
 
 /* See whether an instruction uses or sets a general purpose register */
@@ -2238,7 +2268,7 @@ sh_insn_uses_freg (insn, op, freg)
      of a double precision value.
      So what this all boils down to is that we have to ignore the lowest
      bit of the register number.  */
-     
+
   if ((f & USESF1) != 0
       && (USESF1_REG (insn) & 0xe) == (freg & 0xe))
     return true;
@@ -2272,7 +2302,7 @@ sh_insn_sets_freg (insn, op, freg)
      of a double precision value.
      So what this all boils down to is that we have to ignore the lowest
      bit of the register number.  */
-     
+
   if ((f & SETSF1) != 0
       && (SETSF1_REG (insn) & 0xe) == (freg & 0xe))
     return true;
@@ -2384,7 +2414,6 @@ sh_load_use (i1, op1, i2, op2)
   return false;
 }
 
-#ifndef COFF_IMAGE_WITH_PE
 /* Try to align loads and stores within a span of memory.  This is
    called by both the ELF and the COFF sh targets.  ABFD and SEC are
    the BFD and section we are examining.  CONTENTS is the contents of
@@ -2395,6 +2424,9 @@ sh_load_use (i1, op1, i2, op2)
    STOP are the range of memory to examine.  If a swap is made,
    *PSWAPPED is set to true.  */
 
+#ifdef COFF_WITH_PE
+static
+#endif
 boolean
 _bfd_sh_align_load_span (abfd, sec, contents, swap, relocs,
                         plabel, label_end, start, stop, pswapped)
@@ -2470,7 +2502,7 @@ _bfd_sh_align_load_span (abfd, sec, contents, swap, relocs,
          if (dsp && i - 2 > start)
            {
              unsigned pprev_insn = bfd_get_16 (abfd, contents + i - 4);
-       
+
              if ((pprev_insn & 0xfc00) == 0xf800)
                prev_op = NULL;
              else
@@ -2604,7 +2636,7 @@ _bfd_sh_align_load_span (abfd, sec, contents, swap, relocs,
 
   return true;
 }
-#endif
+#endif /* not COFF_IMAGE_WITH_PE */
 
 /* Look for loads and stores which we can align to four byte
    boundaries.  See the longer comment above sh_relax_section for why
@@ -2622,13 +2654,15 @@ sh_align_loads (abfd, sec, internal_relocs, contents, pswapped)
   struct internal_reloc *irel, *irelend;
   bfd_vma *labels = NULL;
   bfd_vma *label, *label_end;
+  bfd_size_type amt;
 
   *pswapped = false;
 
   irelend = internal_relocs + sec->reloc_count;
 
   /* Get all the addresses with labels on them.  */
-  labels = (bfd_vma *) bfd_malloc (sec->reloc_count * sizeof (bfd_vma));
+  amt = (bfd_size_type) sec->reloc_count * sizeof (bfd_vma);
+  labels = (bfd_vma *) bfd_malloc (amt);
   if (labels == NULL)
     goto error_return;
   label_end = labels;
@@ -2697,8 +2731,8 @@ sh_swap_insns (abfd, sec, relocs, contents, addr)
   /* Swap the instructions themselves.  */
   i1 = bfd_get_16 (abfd, contents + addr);
   i2 = bfd_get_16 (abfd, contents + addr + 2);
-  bfd_put_16 (abfd, i2, contents + addr);
-  bfd_put_16 (abfd, i1, contents + addr + 2);
+  bfd_put_16 (abfd, (bfd_vma) i2, contents + addr);
+  bfd_put_16 (abfd, (bfd_vma) i1, contents + addr + 2);
 
   /* Adjust all reloc addresses.  */
   irelend = internal_relocs + sec->reloc_count;
@@ -2766,7 +2800,7 @@ sh_swap_insns (abfd, sec, relocs, contents, addr)
              insn += add / 2;
              if ((oinsn & 0xff00) != (insn & 0xff00))
                overflow = true;
-             bfd_put_16 (abfd, insn, loc);
+             bfd_put_16 (abfd, (bfd_vma) insn, loc);
              break;
 
            case R_SH_PCDISP:
@@ -2775,7 +2809,7 @@ sh_swap_insns (abfd, sec, relocs, contents, addr)
              insn += add / 2;
              if ((oinsn & 0xf000) != (insn & 0xf000))
                overflow = true;
-             bfd_put_16 (abfd, insn, loc);
+             bfd_put_16 (abfd, (bfd_vma) insn, loc);
              break;
 
            case R_SH_PCRELIMM8BY4:
@@ -2792,7 +2826,7 @@ sh_swap_insns (abfd, sec, relocs, contents, addr)
                  insn += add / 2;
                  if ((oinsn & 0xff00) != (insn & 0xff00))
                    overflow = true;
-                 bfd_put_16 (abfd, insn, loc);
+                 bfd_put_16 (abfd, (bfd_vma) insn, loc);
                }
 
              break;
@@ -2802,7 +2836,7 @@ sh_swap_insns (abfd, sec, relocs, contents, addr)
            {
              ((*_bfd_error_handler)
               ("%s: 0x%lx: fatal: reloc overflow while relaxing",
-               bfd_get_filename (abfd), (unsigned long) irel->r_vaddr));
+               bfd_archive_filename (abfd), (unsigned long) irel->r_vaddr));
              bfd_set_error (bfd_error_bad_value);
              return false;
            }
@@ -2860,13 +2894,13 @@ sh_relocate_section (output_bfd, info, input_bfd, input_section, contents,
          sym = NULL;
        }
       else
-       {    
+       {
          if (symndx < 0
              || (unsigned long) symndx >= obj_raw_syment_count (input_bfd))
            {
              (*_bfd_error_handler)
                ("%s: illegal symbol index %ld in relocs",
-                bfd_get_filename (input_bfd), symndx);
+                bfd_archive_filename (input_bfd), symndx);
              bfd_set_error (bfd_error_bad_value);
              return false;
            }
@@ -2897,7 +2931,7 @@ sh_relocate_section (output_bfd, info, input_bfd, input_section, contents,
       if (rel->r_type == R_SH_IMAGEBASE)
        addend -= pe_data (input_section->output_section->owner)->pe_opthdr.ImageBase;
 #endif
-      
+
       val = 0;
 
       if (h == NULL)
@@ -2938,7 +2972,7 @@ sh_relocate_section (output_bfd, info, input_bfd, input_section, contents,
            {
              if (! ((*info->callbacks->undefined_symbol)
                     (info, h->root.root.string, input_bfd, input_section,
-                     rel->r_vaddr - input_section->vma)))
+                     rel->r_vaddr - input_section->vma, true)))
                return false;
            }
        }
@@ -3014,7 +3048,7 @@ sh_coff_get_relocated_section_contents (output_bfd, link_info, link_order,
                                                       symbols);
 
   memcpy (data, coff_section_data (input_bfd, input_section)->contents,
-         input_section->_raw_size);
+         (size_t) input_section->_raw_size);
 
   if ((input_section->flags & SEC_RELOC) != 0
       && input_section->reloc_count > 0)
@@ -3023,6 +3057,7 @@ sh_coff_get_relocated_section_contents (output_bfd, link_info, link_order,
       bfd_byte *esym, *esymend;
       struct internal_syment *isymp;
       asection **secpp;
+      bfd_size_type amt;
 
       if (! _bfd_coff_get_external_symbols (input_bfd))
        goto error_return;
@@ -3033,14 +3068,15 @@ sh_coff_get_relocated_section_contents (output_bfd, link_info, link_order,
       if (internal_relocs == NULL)
        goto error_return;
 
-      internal_syms = ((struct internal_syment *)
-                      bfd_malloc (obj_raw_syment_count (input_bfd)
-                                  * sizeof (struct internal_syment)));
+      amt = obj_raw_syment_count (input_bfd);
+      amt *= sizeof (struct internal_syment);
+      internal_syms = (struct internal_syment *) bfd_malloc (amt);
       if (internal_syms == NULL)
        goto error_return;
 
-      sections = (asection **) bfd_malloc (obj_raw_syment_count (input_bfd)
-                                          * sizeof (asection *));
+      amt = obj_raw_syment_count (input_bfd);
+      amt *= sizeof (asection *);
+      sections = (asection **) bfd_malloc (amt);
       if (sections == NULL)
        goto error_return;
 
@@ -3103,7 +3139,7 @@ CREATE_BIG_COFF_TARGET_VEC (shcoff_vec, "coff-sh", BFD_IS_RELAXABLE, 0, '_', NUL
 #else
 #define TARGET_SYM shlcoff_vec
 #endif
-     
+
 #ifndef TARGET_SHL_NAME
 #define TARGET_SHL_NAME "coff-shl"
 #endif
@@ -3112,10 +3148,13 @@ CREATE_BIG_COFF_TARGET_VEC (shcoff_vec, "coff-sh", BFD_IS_RELAXABLE, 0, '_', NUL
 CREATE_LITTLE_COFF_TARGET_VEC (TARGET_SYM, TARGET_SHL_NAME, BFD_IS_RELAXABLE,
                               SEC_CODE | SEC_DATA, '_', NULL);
 #else
-CREATE_LITTLE_COFF_TARGET_VEC (TARGET_SYM, TARGET_SHL_NAME, BFD_IS_RELAXABLE, 0, '_', NULL)
+CREATE_LITTLE_COFF_TARGET_VEC (TARGET_SYM, TARGET_SHL_NAME, BFD_IS_RELAXABLE,
+                              0, '_', NULL)
 #endif
-     
+
 #ifndef TARGET_SHL_SYM
+static const bfd_target * coff_small_object_p PARAMS ((bfd *));
+static boolean coff_small_new_section_hook PARAMS ((bfd *, asection *));
 /* Some people want versions of the SH COFF target which do not align
    to 16 byte boundaries.  We implement that by adding a couple of new
    target vectors.  These are just like the ones above, but they
@@ -3182,6 +3221,16 @@ static const bfd_coff_backend_data bfd_coff_small_swap_table =
   false,
 #endif
   2,
+#ifdef COFF_FORCE_SYMBOLS_IN_STRINGS
+  true,
+#else
+  false,
+#endif
+#ifdef COFF_DEBUG_STRING_WIDE_PREFIX
+  4,
+#else
+  2,
+#endif
   coff_swap_filehdr_in, coff_swap_aouthdr_in, coff_swap_scnhdr_in,
   coff_swap_reloc_in, coff_bad_format_hook, coff_set_arch_mach_hook,
   coff_mkobject_hook, styp_to_sec_flags, coff_set_alignment_hook,
@@ -3244,7 +3293,7 @@ const bfd_target shcoff_small_vec =
   BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
 
   & shlcoff_small_vec,
-  
+
   (PTR) &bfd_coff_small_swap_table
 };
 
@@ -3271,7 +3320,7 @@ const bfd_target shlcoff_small_vec =
   bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* hdrs */
 
   {_bfd_dummy_target, coff_small_object_p, /* bfd_check_format */
-     bfd_generic_archive_p, _bfd_dummy_target},   
+     bfd_generic_archive_p, _bfd_dummy_target},
   {bfd_false, coff_mkobject, _bfd_generic_mkarchive, /* bfd_set_format */
      bfd_false},
   {bfd_false, coff_write_object_contents, /* bfd_write_contents */
@@ -3288,7 +3337,7 @@ const bfd_target shlcoff_small_vec =
   BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
 
   & shcoff_small_vec,
-  
+
   (PTR) &bfd_coff_small_swap_table
 };
 #endif
This page took 0.034525 seconds and 4 git commands to generate.