gas: detect DCTI couples in sparc
[deliverable/binutils-gdb.git] / bfd / coff-i960.c
index 7233c43dce67b95ccc01e583f55a1d10ba2f12ad..b2c1512c272964064cc2912b9449313a6fa2b579 100644 (file)
@@ -1,6 +1,5 @@
 /* BFD back-end for Intel 960 COFF files.
 /* BFD back-end for Intel 960 COFF files.
-   Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1997, 1999, 2000, 2001,
-   2002, 2003, 2004, 2007 Free Software Foundation, Inc.
+   Copyright (C) 1990-2016 Free Software Foundation, Inc.
    Written by Cygnus Support.
 
    This file is part of BFD, the Binary File Descriptor library.
    Written by Cygnus Support.
 
    This file is part of BFD, the Binary File Descriptor library.
 #include "libbfd.h"
 #include "coff/i960.h"
 #include "coff/internal.h"
 #include "libbfd.h"
 #include "coff/i960.h"
 #include "coff/internal.h"
-#include "libcoff.h"           /* to allow easier abstraction-breaking */
-
-static bfd_boolean coff_i960_is_local_label_name
-  PARAMS ((bfd *, const char *));
-static bfd_reloc_status_type optcall_callback
-  PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
-static bfd_reloc_status_type coff_i960_relocate
-  PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
-static reloc_howto_type *coff_i960_reloc_type_lookup
-  PARAMS ((bfd *, bfd_reloc_code_real_type));
-static bfd_boolean coff_i960_start_final_link
-  PARAMS ((bfd *, struct bfd_link_info *));
-static bfd_boolean coff_i960_relocate_section
-  PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
-          struct internal_reloc *, struct internal_syment *, asection **));
-static bfd_boolean coff_i960_adjust_symndx
-  PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *,
-          struct internal_reloc *, bfd_boolean *));
+
+#ifndef bfd_pe_print_pdata
+#define bfd_pe_print_pdata     NULL
+#endif
+
+#include "libcoff.h"           /* To allow easier abstraction-breaking.  */
+
 
 #define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (3)
 #define COFF_ALIGN_IN_SECTION_HEADER 1
 
 #define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (3)
 #define COFF_ALIGN_IN_SECTION_HEADER 1
@@ -62,9 +50,7 @@ static bfd_boolean coff_i960_adjust_symndx
 /* This set of local label names is taken from gas.  */
 
 static bfd_boolean
 /* This set of local label names is taken from gas.  */
 
 static bfd_boolean
-coff_i960_is_local_label_name (abfd, name)
-     bfd *abfd ATTRIBUTE_UNUSED;
-     const char *name;
+coff_i960_is_local_label_name (bfd *abfd ATTRIBUTE_UNUSED, const char *name)
 {
   return (name[0] == 'L'
          || (name[0] == '.'
 {
   return (name[0] == 'L'
          || (name[0] == '.'
@@ -76,22 +62,22 @@ coff_i960_is_local_label_name (abfd, name)
 /* This is just like the usual CALC_ADDEND, but it includes the
    section VMA for PC relative relocs.  */
 #ifndef CALC_ADDEND
 /* This is just like the usual CALC_ADDEND, but it includes the
    section VMA for PC relative relocs.  */
 #ifndef CALC_ADDEND
-#define CALC_ADDEND(abfd, ptr, reloc, cache_ptr)                \
-  {                                                             \
-    coff_symbol_type *coffsym = (coff_symbol_type *) NULL;      \
-    if (ptr && bfd_asymbol_bfd (ptr) != abfd)                   \
-      coffsym = (obj_symbols (abfd)                             \
-                 + (cache_ptr->sym_ptr_ptr - symbols));         \
-    else if (ptr)                                               \
-      coffsym = coff_symbol_from (abfd, ptr);                   \
-    if (coffsym != (coff_symbol_type *) NULL                    \
-        && coffsym->native->u.syment.n_scnum == 0)              \
-      cache_ptr->addend = 0;                                    \
-    else if (ptr && bfd_asymbol_bfd (ptr) == abfd               \
-             && ptr->section != (asection *) NULL)              \
-      cache_ptr->addend = - (ptr->section->vma + ptr->value);   \
-    else                                                        \
-      cache_ptr->addend = 0;                                    \
+#define CALC_ADDEND(abfd, ptr, reloc, cache_ptr)               \
+  {                                                            \
+    coff_symbol_type *coffsym = (coff_symbol_type *) NULL;     \
+    if (ptr && bfd_asymbol_bfd (ptr) != abfd)                  \
+      coffsym = (obj_symbols (abfd)                            \
+                + (cache_ptr->sym_ptr_ptr - symbols));         \
+    else if (ptr)                                              \
+      coffsym = coff_symbol_from (ptr);                                \
+    if (coffsym != (coff_symbol_type *) NULL                   \
+       && coffsym->native->u.syment.n_scnum == 0)              \
+      cache_ptr->addend = 0;                                   \
+    else if (ptr && bfd_asymbol_bfd (ptr) == abfd              \
+            && ptr->section != (asection *) NULL)              \
+      cache_ptr->addend = - (ptr->section->vma + ptr->value);  \
+    else                                                       \
+      cache_ptr->addend = 0;                                   \
     if (ptr && (reloc.r_type == 25 || reloc.r_type == 27))     \
       cache_ptr->addend += asect->vma;                         \
   }
     if (ptr && (reloc.r_type == 25 || reloc.r_type == 27))     \
       cache_ptr->addend += asect->vma;                         \
   }
@@ -102,15 +88,13 @@ coff_i960_is_local_label_name (abfd, name)
 #define BAL_MASK 0x00ffffff
 
 static bfd_reloc_status_type
 #define BAL_MASK 0x00ffffff
 
 static bfd_reloc_status_type
-optcall_callback (abfd, reloc_entry, symbol_in, data,
-                 input_section, ignore_bfd, error_message)
-     bfd *abfd;
-     arelent *reloc_entry;
-     asymbol *symbol_in;
-     PTR data;
-     asection *input_section;
-     bfd *ignore_bfd ATTRIBUTE_UNUSED;
-     char **error_message;
+optcall_callback (bfd *abfd,
+                 arelent *reloc_entry,
+                 asymbol *symbol_in,
+                 void * data,
+                 asection *input_section,
+                 bfd *ignore_bfd ATTRIBUTE_UNUSED,
+                 char **error_message)
 {
   /* This item has already been relocated correctly, but we may be
    * able to patch in yet better code - done by digging out the
 {
   /* This item has already been relocated correctly, but we may be
    * able to patch in yet better code - done by digging out the
@@ -192,15 +176,13 @@ optcall_callback (abfd, reloc_entry, symbol_in, data,
    COFF specific backend linker.  */
 
 static bfd_reloc_status_type
    COFF specific backend linker.  */
 
 static bfd_reloc_status_type
-coff_i960_relocate (abfd, reloc_entry, symbol, data, input_section,
-                   output_bfd, error_message)
-     bfd *abfd;
-     arelent *reloc_entry;
-     asymbol *symbol;
-     PTR data ATTRIBUTE_UNUSED;
-     asection *input_section ATTRIBUTE_UNUSED;
-     bfd *output_bfd;
-     char **error_message ATTRIBUTE_UNUSED;
+coff_i960_relocate (bfd *abfd,
+                   arelent *reloc_entry,
+                   asymbol *symbol,
+                   void * data ATTRIBUTE_UNUSED,
+                   asection *input_section ATTRIBUTE_UNUSED,
+                   bfd *output_bfd,
+                   char **error_message ATTRIBUTE_UNUSED)
 {
   asection *osec;
 
 {
   asection *osec;
 
@@ -255,11 +237,11 @@ coff_i960_relocate (abfd, reloc_entry, symbol, data, input_section,
       if (coff_section_data (output_bfd, osec) == NULL)
        {
          bfd_size_type amt = sizeof (struct coff_section_tdata);
       if (coff_section_data (output_bfd, osec) == NULL)
        {
          bfd_size_type amt = sizeof (struct coff_section_tdata);
-         osec->used_by_bfd = (PTR) bfd_zalloc (abfd, amt);
+         osec->used_by_bfd = bfd_zalloc (abfd, amt);
          if (osec->used_by_bfd == NULL)
            return bfd_reloc_overflow;
        }
          if (osec->used_by_bfd == NULL)
            return bfd_reloc_overflow;
        }
-      coff_section_data (output_bfd, osec)->tdata = (PTR) syms;
+      coff_section_data (output_bfd, osec)->tdata = syms;
     }
 
   /* Let bfd_perform_relocation do its thing, which will include
     }
 
   /* Let bfd_perform_relocation do its thing, which will include
@@ -279,9 +261,8 @@ static reloc_howto_type howto_optcall =
         optcall_callback, "optcall", TRUE, 0x00ffffff, 0x00ffffff, 0);
 
 static reloc_howto_type *
         optcall_callback, "optcall", TRUE, 0x00ffffff, 0x00ffffff, 0);
 
 static reloc_howto_type *
-coff_i960_reloc_type_lookup (abfd, code)
-     bfd *abfd ATTRIBUTE_UNUSED;
-     bfd_reloc_code_real_type code;
+coff_i960_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
+                            bfd_reloc_code_real_type code)
 {
   switch (code)
     {
 {
   switch (code)
     {
@@ -335,15 +316,13 @@ coff_i960_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
    necessary symbols.  */
 
 static bfd_boolean
    necessary symbols.  */
 
 static bfd_boolean
-coff_i960_start_final_link (abfd, info)
-     bfd *abfd;
-     struct bfd_link_info *info;
+coff_i960_start_final_link (bfd *abfd, struct bfd_link_info *info)
 {
   bfd_size_type symesz = bfd_coff_symesz (abfd);
   asection *o;
   bfd_byte *esym;
 
 {
   bfd_size_type symesz = bfd_coff_symesz (abfd);
   asection *o;
   bfd_byte *esym;
 
-  if (! info->relocatable)
+  if (! bfd_link_relocatable (info))
     return TRUE;
 
   esym = (bfd_byte *) bfd_malloc (symesz);
     return TRUE;
 
   esym = (bfd_byte *) bfd_malloc (symesz);
@@ -364,7 +343,7 @@ coff_i960_start_final_link (abfd, info)
       isym.n_sclass = C_STAT;
       isym.n_numaux = 0;
 
       isym.n_sclass = C_STAT;
       isym.n_numaux = 0;
 
-      bfd_coff_swap_sym_out (abfd, (PTR) &isym, (PTR) esym);
+      bfd_coff_swap_sym_out (abfd, &isym, esym);
 
       if (bfd_bwrite (esym, symesz, abfd) != symesz)
        {
 
       if (bfd_bwrite (esym, symesz, abfd) != symesz)
        {
@@ -383,16 +362,14 @@ coff_i960_start_final_link (abfd, info)
 /* The reloc processing routine for the optimized COFF linker.  */
 
 static bfd_boolean
 /* The reloc processing routine for the optimized COFF linker.  */
 
 static bfd_boolean
-coff_i960_relocate_section (output_bfd, info, input_bfd, input_section,
-                           contents, relocs, syms, sections)
-     bfd *output_bfd ATTRIBUTE_UNUSED;
-     struct bfd_link_info *info;
-     bfd *input_bfd;
-     asection *input_section;
-     bfd_byte *contents;
-     struct internal_reloc *relocs;
-     struct internal_syment *syms;
-     asection **sections;
+coff_i960_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
+                           struct bfd_link_info *info,
+                           bfd *input_bfd,
+                           asection *input_section,
+                           bfd_byte *contents,
+                           struct internal_reloc *relocs,
+                           struct internal_syment *syms,
+                           asection **sections)
 {
   struct internal_reloc *rel;
   struct internal_reloc *relend;
 {
   struct internal_reloc *rel;
   struct internal_reloc *relend;
@@ -470,38 +447,34 @@ coff_i960_relocate_section (output_bfd, info, input_bfd, input_section,
                     + sec->output_section->vma
                     + sec->output_offset);
            }
                     + sec->output_section->vma
                     + sec->output_offset);
            }
-         else if (! info->relocatable)
-           {
-             if (! ((*info->callbacks->undefined_symbol)
-                    (info, h->root.root.string, input_bfd, input_section,
-                     rel->r_vaddr - input_section->vma, TRUE)))
-               return FALSE;
-           }
+         else if (! bfd_link_relocatable (info))
+           (*info->callbacks->undefined_symbol)
+             (info, h->root.root.string, input_bfd, input_section,
+              rel->r_vaddr - input_section->vma, TRUE);
        }
 
       done = FALSE;
 
        }
 
       done = FALSE;
 
-      if (howto->type == R_OPTCALL && ! info->relocatable && symndx != -1)
+      if (howto->type == R_OPTCALL && ! bfd_link_relocatable (info) && symndx != -1)
        {
        {
-         int class;
+         int class_val;
 
          if (h != NULL)
 
          if (h != NULL)
-           class = h->class;
+           class_val = h->symbol_class;
          else
          else
-           class = sym->n_sclass;
+           class_val = sym->n_sclass;
 
 
-         switch (class)
+         switch (class_val)
            {
            case C_NULL:
              /* This symbol is apparently not from a COFF input file.
                  We warn, and then assume that it is not a leaf
                  function.  */
            {
            case C_NULL:
              /* This symbol is apparently not from a COFF input file.
                  We warn, and then assume that it is not a leaf
                  function.  */
-             if (! ((*info->callbacks->reloc_dangerous)
-                    (info,
-                     _("uncertain calling convention for non-COFF symbol"),
-                     input_bfd, input_section,
-                     rel->r_vaddr - input_section->vma)))
-               return FALSE;
+             (*info->callbacks->reloc_dangerous)
+               (info,
+                _("uncertain calling convention for non-COFF symbol"),
+                input_bfd, input_section,
+                rel->r_vaddr - input_section->vma);
              break;
            case C_LEAFSTAT:
            case C_LEAFEXT:
              break;
            case C_LEAFSTAT:
            case C_LEAFEXT:
@@ -524,9 +497,9 @@ coff_i960_relocate_section (output_bfd, info, input_bfd, input_section,
                    BFD_ASSERT (sym->n_numaux == 2);
                    esyms = (bfd_byte *) obj_coff_external_syms (input_bfd);
                    esyms += (symndx + 2) * bfd_coff_symesz (input_bfd);
                    BFD_ASSERT (sym->n_numaux == 2);
                    esyms = (bfd_byte *) obj_coff_external_syms (input_bfd);
                    esyms += (symndx + 2) * bfd_coff_symesz (input_bfd);
-                   bfd_coff_swap_aux_in (input_bfd, (PTR) esyms, sym->n_type,
+                   bfd_coff_swap_aux_in (input_bfd, esyms, sym->n_type,
                                          sym->n_sclass, 1, sym->n_numaux,
                                          sym->n_sclass, 1, sym->n_numaux,
-                                         (PTR) &aux);
+                                         &aux);
                    olf = aux.x_bal.x_balntry;
                  }
 
                    olf = aux.x_bal.x_balntry;
                  }
 
@@ -578,11 +551,10 @@ coff_i960_relocate_section (output_bfd, info, input_bfd, input_section,
                  return FALSE;
              }
 
                  return FALSE;
              }
 
-           if (! ((*info->callbacks->reloc_overflow)
-                  (info, (h ? &h->root : NULL), name, howto->name,
-                   (bfd_vma) 0, input_bfd, input_section,
-                   rel->r_vaddr - input_section->vma)))
-             return FALSE;
+           (*info->callbacks->reloc_overflow)
+             (info, (h ? &h->root : NULL), name, howto->name,
+              (bfd_vma) 0, input_bfd, input_section,
+              rel->r_vaddr - input_section->vma);
          }
        }
     }
          }
        }
     }
@@ -595,13 +567,12 @@ coff_i960_relocate_section (output_bfd, info, input_bfd, input_section,
    for the section.  */
 
 static bfd_boolean
    for the section.  */
 
 static bfd_boolean
-coff_i960_adjust_symndx (obfd, info, ibfd, sec, irel, adjustedp)
-     bfd *obfd ATTRIBUTE_UNUSED;
-     struct bfd_link_info *info ATTRIBUTE_UNUSED;
-     bfd *ibfd;
-     asection *sec ATTRIBUTE_UNUSED;
-     struct internal_reloc *irel;
-     bfd_boolean *adjustedp;
+coff_i960_adjust_symndx (bfd *obfd ATTRIBUTE_UNUSED,
+                        struct bfd_link_info *info ATTRIBUTE_UNUSED,
+                        bfd *ibfd,
+                        asection *sec ATTRIBUTE_UNUSED,
+                        struct internal_reloc *irel,
+                        bfd_boolean *adjustedp)
 {
   struct coff_link_hash_entry *h;
 
 {
   struct coff_link_hash_entry *h;
 
@@ -632,11 +603,11 @@ coff_i960_adjust_symndx (obfd, info, ibfd, sec, irel, adjustedp)
 
 #include "coffcode.h"
 
 
 #include "coffcode.h"
 
-extern const bfd_target icoff_big_vec;
+extern const bfd_target icoff_be_vec;
 
 
-CREATE_LITTLE_COFF_TARGET_VEC (icoff_little_vec, "coff-Intel-little", 0, 0, '_', & icoff_big_vec, COFF_SWAP_TABLE)
+CREATE_LITTLE_COFF_TARGET_VEC (icoff_le_vec, "coff-Intel-little", 0, 0, '_', & icoff_be_vec, COFF_SWAP_TABLE)
 
 
-const bfd_target icoff_big_vec =
+const bfd_target icoff_be_vec =
 {
   "coff-Intel-big",            /* name */
   bfd_target_coff_flavour,
 {
   "coff-Intel-big",            /* name */
   bfd_target_coff_flavour,
@@ -651,6 +622,7 @@ const bfd_target icoff_big_vec =
   '_',                         /* leading underscore */
   '/',                         /* ar_pad_char */
   15,                          /* ar_max_namelen */
   '_',                         /* leading underscore */
   '/',                         /* ar_pad_char */
   15,                          /* ar_max_namelen */
+  0,                           /* match priority.  */
 
 bfd_getl64, bfd_getl_signed_64, bfd_putl64,
      bfd_getl32, bfd_getl_signed_32, bfd_putl32,
 
 bfd_getl64, bfd_getl_signed_64, bfd_putl64,
      bfd_getl32, bfd_getl_signed_32, bfd_putl32,
@@ -676,7 +648,7 @@ bfd_getb64, bfd_getb_signed_64, bfd_putb64,
      BFD_JUMP_TABLE_LINK (coff),
      BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
 
      BFD_JUMP_TABLE_LINK (coff),
      BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
 
-  & icoff_little_vec,
+  & icoff_le_vec,
 
   COFF_SWAP_TABLE
 };
 
   COFF_SWAP_TABLE
 };
This page took 0.029093 seconds and 4 git commands to generate.