gdb: add target_ops::supports_displaced_step
[deliverable/binutils-gdb.git] / bfd / coff-alpha.c
index ce217f549b504aa809fb324bc3116ca5ba453547..cb52668734460399ae9436e36a89cb8dbbfb3112 100644 (file)
@@ -1,6 +1,5 @@
 /* BFD back-end for ALPHA Extended-Coff files.
-   Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-   2003, 2004, 2005, 2007, 2008, 2009 Free Software Foundation, Inc.
+   Copyright (C) 1993-2020 Free Software Foundation, Inc.
    Modified from coff-mips.c by Steve Chamberlain <sac@cygnus.com> and
    Ian Lance Taylor <ian@cygnus.com>.
 
 \f
 /* Prototypes for static functions.  */
 
-static const bfd_target *alpha_ecoff_object_p
-  PARAMS ((bfd *));
-static bfd_boolean alpha_ecoff_bad_format_hook
-  PARAMS ((bfd *abfd, PTR filehdr));
-static PTR alpha_ecoff_mkobject_hook
-  PARAMS ((bfd *, PTR filehdr, PTR aouthdr));
-static void alpha_ecoff_swap_reloc_in
-  PARAMS ((bfd *, PTR, struct internal_reloc *));
-static void alpha_ecoff_swap_reloc_out
-  PARAMS ((bfd *, const struct internal_reloc *, PTR));
-static void alpha_adjust_reloc_in
-  PARAMS ((bfd *, const struct internal_reloc *, arelent *));
-static void alpha_adjust_reloc_out
-  PARAMS ((bfd *, const arelent *, struct internal_reloc *));
-static reloc_howto_type *alpha_bfd_reloc_type_lookup
-  PARAMS ((bfd *, bfd_reloc_code_real_type));
-static bfd_byte *alpha_ecoff_get_relocated_section_contents
-  PARAMS ((bfd *abfd, struct bfd_link_info *, struct bfd_link_order *,
-          bfd_byte *data, bfd_boolean relocatable, asymbol **symbols));
-static bfd_vma alpha_convert_external_reloc
-  PARAMS ((bfd *, struct bfd_link_info *, bfd *, struct external_reloc *,
-          struct ecoff_link_hash_entry *));
-static bfd_boolean alpha_relocate_section
-  PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *, PTR));
-static bfd_boolean alpha_adjust_headers
-  PARAMS ((bfd *, struct internal_filehdr *, struct internal_aouthdr *));
-static PTR alpha_ecoff_read_ar_hdr
-  PARAMS ((bfd *));
-static bfd *alpha_ecoff_get_elt_at_filepos
-  PARAMS ((bfd *, file_ptr));
-static bfd *alpha_ecoff_openr_next_archived_file
-  PARAMS ((bfd *, bfd *));
-static bfd *alpha_ecoff_get_elt_at_index
-  PARAMS ((bfd *, symindex));
+
 \f
 /* ECOFF has COFF sections, but the debugging information is stored in
    a completely different format.  ECOFF targets use some of the
@@ -127,18 +93,14 @@ static bfd *alpha_ecoff_get_elt_at_index
 \f
 /* How to process the various reloc types.  */
 
-static bfd_reloc_status_type reloc_nil
-  PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
-
 static bfd_reloc_status_type
-reloc_nil (abfd, reloc, sym, data, sec, output_bfd, error_message)
-     bfd *abfd ATTRIBUTE_UNUSED;
-     arelent *reloc ATTRIBUTE_UNUSED;
-     asymbol *sym ATTRIBUTE_UNUSED;
-     PTR data ATTRIBUTE_UNUSED;
-     asection *sec ATTRIBUTE_UNUSED;
-     bfd *output_bfd ATTRIBUTE_UNUSED;
-     char **error_message ATTRIBUTE_UNUSED;
+reloc_nil (bfd *abfd ATTRIBUTE_UNUSED,
+          arelent *reloc ATTRIBUTE_UNUSED,
+          asymbol *sym ATTRIBUTE_UNUSED,
+          void * data ATTRIBUTE_UNUSED,
+          asection *sec ATTRIBUTE_UNUSED,
+          bfd *output_bfd ATTRIBUTE_UNUSED,
+          char **error_message ATTRIBUTE_UNUSED)
 {
   return bfd_reloc_ok;
 }
@@ -436,11 +398,10 @@ static reloc_howto_type alpha_howto_table[] =
 \f
 /* Recognize an Alpha ECOFF file.  */
 
-static const bfd_target *
-alpha_ecoff_object_p (abfd)
-     bfd *abfd;
+static bfd_cleanup
+alpha_ecoff_object_p (bfd *abfd)
 {
-  static const bfd_target *ret;
+  bfd_cleanup ret;
 
   ret = coff_object_p (abfd);
 
@@ -462,10 +423,10 @@ alpha_ecoff_object_p (abfd)
        {
          bfd_size_type size;
 
-         size = sec->line_filepos * 8;
+         size = (bfd_size_type) sec->line_filepos * 8;
          BFD_ASSERT (size == sec->size
                      || size + 8 == sec->size);
-         if (! bfd_set_section_size (abfd, sec, size))
+         if (!bfd_set_section_size (sec, size))
            return NULL;
        }
     }
@@ -476,9 +437,8 @@ alpha_ecoff_object_p (abfd)
 /* See whether the magic number matches.  */
 
 static bfd_boolean
-alpha_ecoff_bad_format_hook (abfd, filehdr)
-     bfd *abfd ATTRIBUTE_UNUSED;
-     PTR filehdr;
+alpha_ecoff_bad_format_hook (bfd *abfd ATTRIBUTE_UNUSED,
+                            void * filehdr)
 {
   struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
 
@@ -486,9 +446,9 @@ alpha_ecoff_bad_format_hook (abfd, filehdr)
     return TRUE;
 
   if (ALPHA_ECOFF_COMPRESSEDMAG (*internal_f))
-    (*_bfd_error_handler)
-      (_("%B: Cannot handle compressed Alpha binaries.\n"
-        "   Use compiler flags, or objZ, to generate uncompressed binaries."),
+    _bfd_error_handler
+      (_("%pB: cannot handle compressed Alpha binaries; "
+        "use compiler flags, or objZ, to generate uncompressed binaries"),
        abfd);
 
   return FALSE;
@@ -497,13 +457,10 @@ alpha_ecoff_bad_format_hook (abfd, filehdr)
 /* This is a hook called by coff_real_object_p to create any backend
    specific information.  */
 
-static PTR
-alpha_ecoff_mkobject_hook (abfd, filehdr, aouthdr)
-     bfd *abfd;
-     PTR filehdr;
-     PTR aouthdr;
+static void *
+alpha_ecoff_mkobject_hook (bfd *abfd, void * filehdr, void * aouthdr)
 {
-  PTR ecoff;
+  void * ecoff;
 
   ecoff = _bfd_ecoff_mkobject_hook (abfd, filehdr, aouthdr);
 
@@ -533,10 +490,9 @@ alpha_ecoff_mkobject_hook (abfd, filehdr, aouthdr)
 /* Swap a reloc in.  */
 
 static void
-alpha_ecoff_swap_reloc_in (abfd, ext_ptr, intern)
-     bfd *abfd;
-     PTR ext_ptr;
-     struct internal_reloc *intern;
+alpha_ecoff_swap_reloc_in (bfd *abfd,
+                          void * ext_ptr,
+                          struct internal_reloc *intern)
 {
   const RELOC *ext = (RELOC *) ext_ptr;
 
@@ -581,10 +537,9 @@ alpha_ecoff_swap_reloc_in (abfd, ext_ptr, intern)
 /* Swap a reloc out.  */
 
 static void
-alpha_ecoff_swap_reloc_out (abfd, intern, dst)
-     bfd *abfd;
-     const struct internal_reloc *intern;
-     PTR dst;
+alpha_ecoff_swap_reloc_out (bfd *abfd,
+                           const struct internal_reloc *intern,
+                           void * dst)
 {
   RELOC *ext = (RELOC *) dst;
   long symndx;
@@ -636,16 +591,15 @@ alpha_ecoff_swap_reloc_out (abfd, intern, dst)
    this backend routine.  It must fill in the howto field.  */
 
 static void
-alpha_adjust_reloc_in (abfd, intern, rptr)
-     bfd *abfd;
-     const struct internal_reloc *intern;
-     arelent *rptr;
+alpha_adjust_reloc_in (bfd *abfd,
+                      const struct internal_reloc *intern,
+                      arelent *rptr)
 {
   if (intern->r_type > ALPHA_R_GPVALUE)
     {
-      (*_bfd_error_handler)
-       (_("%B: unknown/unsupported relocation type %d"),
-        abfd, intern->r_type);
+      /* xgettext:c-format */
+      _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
+                         abfd, intern->r_type);
       bfd_set_error (bfd_error_bad_value);
       rptr->addend = 0;
       rptr->howto  = NULL;
@@ -659,8 +613,8 @@ alpha_adjust_reloc_in (abfd, intern, rptr)
     case ALPHA_R_SREL32:
     case ALPHA_R_SREL64:
       /* This relocs appear to be fully resolved when they are against
-         internal symbols.  Against external symbols, BRADDR at least
-         appears to be resolved against the next instruction.  */
+        internal symbols.  Against external symbols, BRADDR at least
+        appears to be resolved against the next instruction.  */
       if (! intern->r_extern)
        rptr->addend = 0;
       else
@@ -728,10 +682,9 @@ alpha_adjust_reloc_in (abfd, intern, rptr)
    not need to undo.  */
 
 static void
-alpha_adjust_reloc_out (abfd, rel, intern)
-     bfd *abfd ATTRIBUTE_UNUSED;
-     const arelent *rel;
-     struct internal_reloc *intern;
+alpha_adjust_reloc_out (bfd *abfd ATTRIBUTE_UNUSED,
+                       const arelent *rel,
+                       struct internal_reloc *intern)
 {
   switch (intern->r_type)
     {
@@ -770,14 +723,12 @@ alpha_adjust_reloc_out (abfd, rel, intern)
    assembler is going to handle this.  */
 
 static bfd_byte *
-alpha_ecoff_get_relocated_section_contents (abfd, link_info, link_order,
-                                           data, relocatable, symbols)
-     bfd *abfd;
-     struct bfd_link_info *link_info;
-     struct bfd_link_order *link_order;
-     bfd_byte *data;
-     bfd_boolean relocatable;
-     asymbol **symbols;
+alpha_ecoff_get_relocated_section_contents (bfd *abfd,
+                                           struct bfd_link_info *link_info,
+                                           struct bfd_link_order *link_order,
+                                           bfd_byte *data,
+                                           bfd_boolean relocatable,
+                                           asymbol **symbols)
 {
   bfd *input_bfd = link_order->u.indirect.section->owner;
   asection *input_section = link_order->u.indirect.section;
@@ -1150,24 +1101,19 @@ alpha_ecoff_get_relocated_section_contents (abfd, link_info, link_order,
          switch (r)
            {
            case bfd_reloc_undefined:
-             if (! ((*link_info->callbacks->undefined_symbol)
-                    (link_info, bfd_asymbol_name (*rel->sym_ptr_ptr),
-                     input_bfd, input_section, rel->address, TRUE)))
-               goto error_return;
+             (*link_info->callbacks->undefined_symbol)
+               (link_info, bfd_asymbol_name (*rel->sym_ptr_ptr),
+                input_bfd, input_section, rel->address, TRUE);
              break;
            case bfd_reloc_dangerous:
-             if (! ((*link_info->callbacks->reloc_dangerous)
-                    (link_info, err, input_bfd, input_section,
-                     rel->address)))
-               goto error_return;
+             (*link_info->callbacks->reloc_dangerous)
+               (link_info, err, input_bfd, input_section, rel->address);
              break;
            case bfd_reloc_overflow:
-             if (! ((*link_info->callbacks->reloc_overflow)
-                    (link_info, NULL,
-                     bfd_asymbol_name (*rel->sym_ptr_ptr),
-                     rel->howto->name, rel->addend, input_bfd,
-                     input_section, rel->address)))
-               goto error_return;
+             (*link_info->callbacks->reloc_overflow)
+               (link_info, NULL, bfd_asymbol_name (*rel->sym_ptr_ptr),
+                rel->howto->name, rel->addend, input_bfd,
+                input_section, rel->address);
              break;
            case bfd_reloc_outofrange:
            default:
@@ -1181,22 +1127,19 @@ alpha_ecoff_get_relocated_section_contents (abfd, link_info, link_order,
     abort ();
 
  successful_return:
-  if (reloc_vector != NULL)
-    free (reloc_vector);
+  free (reloc_vector);
   return data;
 
  error_return:
-  if (reloc_vector != NULL)
-    free (reloc_vector);
+  free (reloc_vector);
   return NULL;
 }
 
 /* Get the howto structure for a generic reloc type.  */
 
 static reloc_howto_type *
-alpha_bfd_reloc_type_lookup (abfd, code)
-     bfd *abfd ATTRIBUTE_UNUSED;
-     bfd_reloc_code_real_type code;
+alpha_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
+                            bfd_reloc_code_real_type code)
 {
   int alpha_type;
 
@@ -1267,17 +1210,16 @@ alpha_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
    relocation amount.  */
 
 static bfd_vma
-alpha_convert_external_reloc (output_bfd, info, input_bfd, ext_rel, h)
-     bfd *output_bfd ATTRIBUTE_UNUSED;
-     struct bfd_link_info *info;
-     bfd *input_bfd;
-     struct external_reloc *ext_rel;
-     struct ecoff_link_hash_entry *h;
+alpha_convert_external_reloc (bfd *output_bfd ATTRIBUTE_UNUSED,
+                             struct bfd_link_info *info,
+                             bfd *input_bfd,
+                             struct external_reloc *ext_rel,
+                             struct ecoff_link_hash_entry *h)
 {
   unsigned long r_symndx;
   bfd_vma relocation;
 
-  BFD_ASSERT (info->relocatable);
+  BFD_ASSERT (bfd_link_relocatable (info));
 
   if (h->root.type == bfd_link_hash_defined
       || h->root.type == bfd_link_hash_defweak)
@@ -1293,7 +1235,7 @@ alpha_convert_external_reloc (output_bfd, info, input_bfd, ext_rel, h)
 
       /* Compute a new r_symndx value.  */
       hsec = h->root.u.def.section;
-      name = bfd_get_section_name (output_bfd, hsec->output_section);
+      name = bfd_section_name (hsec->output_section);
 
       r_symndx = (unsigned long) -1;
       switch (name[1])
@@ -1384,14 +1326,12 @@ alpha_convert_external_reloc (output_bfd, info, input_bfd, ext_rel, h)
    could be combined somehow.  */
 
 static bfd_boolean
-alpha_relocate_section (output_bfd, info, input_bfd, input_section,
-                       contents, external_relocs)
-     bfd *output_bfd;
-     struct bfd_link_info *info;
-     bfd *input_bfd;
-     asection *input_section;
-     bfd_byte *contents;
-     PTR external_relocs;
+alpha_relocate_section (bfd *output_bfd,
+                       struct bfd_link_info *info,
+                       bfd *input_bfd,
+                       asection *input_section,
+                       bfd_byte *contents,
+                       void * external_relocs)
 {
   asection **symndx_to_section, *lita_sec;
   struct ecoff_link_hash_entry **sym_hashes;
@@ -1458,7 +1398,7 @@ alpha_relocate_section (output_bfd, info, input_bfd, input_section,
 
   lita_sec = symndx_to_section[RELOC_SECTION_LITA];
   gp = _bfd_get_gp_value (output_bfd);
-  if (! info->relocatable && lita_sec != NULL)
+  if (! bfd_link_relocatable (info) && lita_sec != NULL)
     {
       struct ecoff_section_tdata *lita_sec_data;
 
@@ -1556,23 +1496,21 @@ alpha_relocate_section (output_bfd, info, input_bfd, input_section,
       switch (r_type)
        {
        case ALPHA_R_GPRELHIGH:
-         (*_bfd_error_handler)
-           (_("%B: unsupported relocation: ALPHA_R_GPRELHIGH"),
-            input_bfd);
+         _bfd_error_handler (_("%pB: %s unsupported"),
+                             input_bfd, "ALPHA_R_GPRELHIGH");
          bfd_set_error (bfd_error_bad_value);
          continue;
-         
+
        case ALPHA_R_GPRELLOW:
-         (*_bfd_error_handler)
-           (_("%B: unsupported relocation: ALPHA_R_GPRELLOW"),
-            input_bfd);
+         _bfd_error_handler (_("%pB: %s unsupported"),
+                             input_bfd, "ALPHA_R_GPRELLOW");
          bfd_set_error (bfd_error_bad_value);
          continue;
-         
+
        default:
-         (*_bfd_error_handler)
-           (_("%B: unknown relocation type %d"),
-            input_bfd, (int) r_type);
+         /* xgettext:c-format */
+         _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
+                             input_bfd, (int) r_type);
          bfd_set_error (bfd_error_bad_value);
          continue;
 
@@ -1583,7 +1521,7 @@ alpha_relocate_section (output_bfd, info, input_bfd, input_section,
             not otherwise used for anything.  For some reason, the
             address of the relocation does not appear to include the
             section VMA, unlike the other relocation types.  */
-         if (info->relocatable)
+         if (bfd_link_relocatable (info))
            H_PUT_64 (input_bfd, input_section->output_offset + r_vaddr,
                      ext_rel->r_vaddr);
          adjust_addrp = FALSE;
@@ -1736,7 +1674,7 @@ alpha_relocate_section (output_bfd, info, input_bfd, input_section,
              if (h == (struct ecoff_link_hash_entry *) NULL)
                abort ();
 
-             if (! info->relocatable)
+             if (! bfd_link_relocatable (info))
                {
                  if (h->root.type == bfd_link_hash_defined
                      || h->root.type == bfd_link_hash_defweak)
@@ -1749,10 +1687,9 @@ alpha_relocate_section (output_bfd, info, input_bfd, input_section,
                         do not have a meaningful number for the
                         location within the section that is being
                         relocated.  */
-                     if (! ((*info->callbacks->undefined_symbol)
-                            (info, h->root.root.string, input_bfd,
-                             input_section, (bfd_vma) 0, TRUE)))
-                       return FALSE;
+                     (*info->callbacks->undefined_symbol)
+                       (info, h->root.root.string, input_bfd,
+                        input_section, (bfd_vma) 0, TRUE);
                      addend = 0;
                    }
                }
@@ -1765,10 +1702,9 @@ alpha_relocate_section (output_bfd, info, input_bfd, input_section,
                      /* This symbol is not being written out.  Pass
                         the address as 0, as with undefined_symbol,
                         above.  */
-                     if (! ((*info->callbacks->unattached_reloc)
-                            (info, h->root.root.string, input_bfd,
-                             input_section, (bfd_vma) 0)))
-                       return FALSE;
+                     (*info->callbacks->unattached_reloc)
+                       (info, h->root.root.string,
+                        input_bfd, input_section, (bfd_vma) 0);
                    }
 
                  addend = alpha_convert_external_reloc (output_bfd, info,
@@ -1779,7 +1715,7 @@ alpha_relocate_section (output_bfd, info, input_bfd, input_section,
 
          addend += r_vaddr;
 
-         if (info->relocatable)
+         if (bfd_link_relocatable (info))
            {
              /* Adjust r_vaddr by the addend.  */
              H_PUT_64 (input_bfd, addend, ext_rel->r_vaddr);
@@ -1815,7 +1751,7 @@ alpha_relocate_section (output_bfd, info, input_bfd, input_section,
          /* Store a value from the reloc stack into a bitfield.  If
             we are generating relocatable output, all we do is
             adjust the address of the reloc.  */
-         if (! info->relocatable)
+         if (! bfd_link_relocatable (info))
            {
              bfd_vma mask;
              bfd_vma val;
@@ -1881,7 +1817,7 @@ alpha_relocate_section (output_bfd, info, input_bfd, input_section,
                abort ();
            }
 
-         if (info->relocatable)
+         if (bfd_link_relocatable (info))
            {
              /* We are generating relocatable output, and must
                 convert the existing reloc.  */
@@ -1892,10 +1828,9 @@ alpha_relocate_section (output_bfd, info, input_bfd, input_section,
                      && h->indx == -1)
                    {
                      /* This symbol is not being written out.  */
-                     if (! ((*info->callbacks->unattached_reloc)
-                            (info, h->root.root.string, input_bfd,
-                             input_section, r_vaddr - input_section->vma)))
-                       return FALSE;
+                     (*info->callbacks->unattached_reloc)
+                       (info, h->root.root.string, input_bfd,
+                        input_section, r_vaddr - input_section->vma);
                    }
 
                  relocation = alpha_convert_external_reloc (output_bfd,
@@ -1949,11 +1884,9 @@ alpha_relocate_section (output_bfd, info, input_bfd, input_section,
                    }
                  else
                    {
-                     if (! ((*info->callbacks->undefined_symbol)
-                            (info, h->root.root.string, input_bfd,
-                             input_section,
-                             r_vaddr - input_section->vma, TRUE)))
-                       return FALSE;
+                     (*info->callbacks->undefined_symbol)
+                       (info, h->root.root.string, input_bfd, input_section,
+                        r_vaddr - input_section->vma, TRUE);
                      relocation = 0;
                    }
                }
@@ -1993,21 +1926,18 @@ alpha_relocate_section (output_bfd, info, input_bfd, input_section,
                    if (r_extern)
                      name = sym_hashes[r_symndx]->root.root.string;
                    else
-                     name = bfd_section_name (input_bfd,
-                                              symndx_to_section[r_symndx]);
-                   if (! ((*info->callbacks->reloc_overflow)
-                          (info, NULL, name,
-                           alpha_howto_table[r_type].name,
-                           (bfd_vma) 0, input_bfd, input_section,
-                           r_vaddr - input_section->vma)))
-                     return FALSE;
+                     name = bfd_section_name (symndx_to_section[r_symndx]);
+                   (*info->callbacks->reloc_overflow)
+                     (info, NULL, name, alpha_howto_table[r_type].name,
+                      (bfd_vma) 0, input_bfd, input_section,
+                      r_vaddr - input_section->vma);
                  }
                  break;
                }
            }
        }
 
-      if (info->relocatable && adjust_addrp)
+      if (bfd_link_relocatable (info) && adjust_addrp)
        {
          /* Change the address of the relocation.  */
          H_PUT_64 (input_bfd,
@@ -2020,10 +1950,9 @@ alpha_relocate_section (output_bfd, info, input_bfd, input_section,
 
       if (gp_usedp && gp_undefined)
        {
-         if (! ((*info->callbacks->reloc_dangerous)
-                (info, _("GP relative relocation used when GP not defined"),
-                 input_bfd, input_section, r_vaddr - input_section->vma)))
-           return FALSE;
+         (*info->callbacks->reloc_dangerous)
+           (info, _("GP relative relocation used when GP not defined"),
+            input_bfd, input_section, r_vaddr - input_section->vma);
          /* Only give the error once per link.  */
          gp = 4;
          _bfd_set_gp_value (output_bfd, gp);
@@ -2041,10 +1970,9 @@ alpha_relocate_section (output_bfd, info, input_bfd, input_section,
    sets the dynamic bits in the file header.  */
 
 static bfd_boolean
-alpha_adjust_headers (abfd, fhdr, ahdr)
-     bfd *abfd;
-     struct internal_filehdr *fhdr;
-     struct internal_aouthdr *ahdr ATTRIBUTE_UNUSED;
+alpha_adjust_headers (bfd *abfd,
+                     struct internal_filehdr *fhdr,
+                     struct internal_aouthdr *ahdr ATTRIBUTE_UNUSED)
 {
   if ((abfd->flags & (DYNAMIC | EXEC_P)) == (DYNAMIC | EXEC_P))
     fhdr->f_flags |= F_ALPHA_CALL_SHARED;
@@ -2065,6 +1993,7 @@ alpha_adjust_headers (abfd, fhdr, ahdr)
   _bfd_ecoff_construct_extended_name_table
 #define alpha_ecoff_truncate_arname _bfd_ecoff_truncate_arname
 #define alpha_ecoff_write_armap _bfd_ecoff_write_armap
+#define alpha_ecoff_write_ar_hdr _bfd_generic_write_ar_hdr
 #define alpha_ecoff_generic_stat_arch_elt _bfd_ecoff_generic_stat_arch_elt
 #define alpha_ecoff_update_armap_timestamp _bfd_ecoff_update_armap_timestamp
 
@@ -2075,9 +2004,8 @@ alpha_adjust_headers (abfd, fhdr, ahdr)
 /* Read an archive header.  This is like the standard routine, but it
    also accepts ARFZMAG.  */
 
-static PTR
-alpha_ecoff_read_ar_hdr (abfd)
-     bfd *abfd;
+static void *
+alpha_ecoff_read_ar_hdr (bfd *abfd)
 {
   struct areltdata *ret;
   struct ar_hdr *h;
@@ -2092,25 +2020,26 @@ alpha_ecoff_read_ar_hdr (abfd)
       bfd_byte ab[8];
 
       /* This is a compressed file.  We must set the size correctly.
-         The size is the eight bytes after the dummy file header.  */
+        The size is the eight bytes after the dummy file header.  */
       if (bfd_seek (abfd, (file_ptr) FILHSZ, SEEK_CUR) != 0
          || bfd_bread (ab, (bfd_size_type) 8, abfd) != 8
          || bfd_seek (abfd, (file_ptr) (- (FILHSZ + 8)), SEEK_CUR) != 0)
-       return NULL;
+       {
+         free (ret);
+         return NULL;
+       }
 
       ret->parsed_size = H_GET_64 (abfd, ab);
     }
 
-  return (PTR) ret;
+  return ret;
 }
 
 /* Get an archive element at a specified file position.  This is where
    we uncompress the archive element if necessary.  */
 
 static bfd *
-alpha_ecoff_get_elt_at_filepos (archive, filepos)
-     bfd *archive;
-     file_ptr filepos;
+alpha_ecoff_get_elt_at_filepos (bfd *archive, file_ptr filepos)
 {
   bfd *nbfd = NULL;
   struct areltdata *tdata;
@@ -2119,6 +2048,7 @@ alpha_ecoff_get_elt_at_filepos (archive, filepos)
   bfd_size_type size;
   bfd_byte *buf, *p;
   struct bfd_in_memory *bim;
+  ufile_ptr filesize;
 
   buf = NULL;
   nbfd = _bfd_get_elt_at_filepos (archive, filepos);
@@ -2152,6 +2082,14 @@ alpha_ecoff_get_elt_at_filepos (archive, filepos)
     goto error_return;
   size = H_GET_64 (nbfd, ab);
 
+  /* The decompression algorithm will at most expand by eight times.  */
+  filesize = bfd_get_file_size (archive);
+  if (filesize != 0 && size / 8 > filesize)
+    {
+      bfd_set_error (bfd_error_malformed_archive);
+      goto error_return;
+    }
+
   if (size != 0)
     {
       bfd_size_type left;
@@ -2190,7 +2128,7 @@ alpha_ecoff_get_elt_at_filepos (archive, filepos)
                n = dict[h];
              else
                {
-                 if (! bfd_bread (&n, (bfd_size_type) 1, nbfd))
+                 if (bfd_bread (&n, 1, nbfd) != 1)
                    goto error_return;
                  dict[h] = n;
                }
@@ -2223,14 +2161,15 @@ alpha_ecoff_get_elt_at_filepos (archive, filepos)
   nbfd->mtime = strtol (hdr->ar_date, (char **) NULL, 10);
 
   nbfd->flags |= BFD_IN_MEMORY;
-  nbfd->iostream = (PTR) bim;
+  nbfd->iostream = bim;
+  nbfd->iovec = &_bfd_memory_iovec;
+  nbfd->origin = 0;
   BFD_ASSERT (! nbfd->cacheable);
 
   return nbfd;
 
  error_return:
-  if (buf != NULL)
-    free (buf);
+  free (buf);
   if (nbfd != NULL)
     bfd_close (nbfd);
   return NULL;
@@ -2239,11 +2178,9 @@ alpha_ecoff_get_elt_at_filepos (archive, filepos)
 /* Open the next archived file.  */
 
 static bfd *
-alpha_ecoff_openr_next_archived_file (archive, last_file)
-     bfd *archive;
-     bfd *last_file;
+alpha_ecoff_openr_next_archived_file (bfd *archive, bfd *last_file)
 {
-  file_ptr filestart;
+  ufile_ptr filestart;
 
   if (last_file == NULL)
     filestart = bfd_ardata (archive)->first_file_filepos;
@@ -2254,7 +2191,7 @@ alpha_ecoff_openr_next_archived_file (archive, last_file)
       bfd_size_type size;
 
       /* We can't use arelt_size here, because that uses parsed_size,
-         which is the uncompressed size.  We need the compressed size.  */
+        which is the uncompressed size.  We need the compressed size.  */
       t = (struct areltdata *) last_file->arelt_data;
       h = (struct ar_hdr *) t->arch_header;
       size = strtol (h->ar_size, (char **) NULL, 10);
@@ -2262,8 +2199,14 @@ alpha_ecoff_openr_next_archived_file (archive, last_file)
       /* Pad to an even boundary...
         Note that last_file->origin can be odd in the case of
         BSD-4.4-style element with a long odd size.  */
-      filestart = last_file->origin + size;
+      filestart = last_file->proxy_origin + size;
       filestart += filestart % 2;
+      if (filestart < last_file->proxy_origin)
+       {
+         /* Prevent looping.  See PR19256.  */
+         bfd_set_error (bfd_error_malformed_archive);
+         return NULL;
+       }
     }
 
   return alpha_ecoff_get_elt_at_filepos (archive, filestart);
@@ -2279,6 +2222,67 @@ alpha_ecoff_get_elt_at_index (bfd *abfd, symindex sym_index)
   entry = bfd_ardata (abfd)->symdefs + sym_index;
   return alpha_ecoff_get_elt_at_filepos (abfd, entry->file_offset);
 }
+
+static void
+alpha_ecoff_swap_coff_aux_in (bfd *abfd ATTRIBUTE_UNUSED,
+                             void *ext1 ATTRIBUTE_UNUSED,
+                             int type ATTRIBUTE_UNUSED,
+                             int in_class ATTRIBUTE_UNUSED,
+                             int indx ATTRIBUTE_UNUSED,
+                             int numaux ATTRIBUTE_UNUSED,
+                             void *in1 ATTRIBUTE_UNUSED)
+{
+}
+
+static void
+alpha_ecoff_swap_coff_sym_in (bfd *abfd ATTRIBUTE_UNUSED,
+                             void *ext1 ATTRIBUTE_UNUSED,
+                             void *in1 ATTRIBUTE_UNUSED)
+{
+}
+
+static void
+alpha_ecoff_swap_coff_lineno_in (bfd *abfd ATTRIBUTE_UNUSED,
+                                void *ext1 ATTRIBUTE_UNUSED,
+                                void *in1 ATTRIBUTE_UNUSED)
+{
+}
+
+static unsigned int
+alpha_ecoff_swap_coff_aux_out (bfd *abfd ATTRIBUTE_UNUSED,
+                              void *inp ATTRIBUTE_UNUSED,
+                              int type ATTRIBUTE_UNUSED,
+                              int in_class ATTRIBUTE_UNUSED,
+                              int indx ATTRIBUTE_UNUSED,
+                              int numaux ATTRIBUTE_UNUSED,
+                              void *extp ATTRIBUTE_UNUSED)
+{
+  return 0;
+}
+
+static unsigned int
+alpha_ecoff_swap_coff_sym_out (bfd *abfd ATTRIBUTE_UNUSED,
+                              void *inp ATTRIBUTE_UNUSED,
+                              void *extp ATTRIBUTE_UNUSED)
+{
+  return 0;
+}
+
+static unsigned int
+alpha_ecoff_swap_coff_lineno_out (bfd *abfd ATTRIBUTE_UNUSED,
+                                 void *inp ATTRIBUTE_UNUSED,
+                                 void *extp ATTRIBUTE_UNUSED)
+{
+  return 0;
+}
+
+static unsigned int
+alpha_ecoff_swap_coff_reloc_out (bfd *abfd ATTRIBUTE_UNUSED,
+                                void *inp ATTRIBUTE_UNUSED,
+                                void *extp ATTRIBUTE_UNUSED)
+{
+  return 0;
+}
 \f
 /* This is the ECOFF backend structure.  The backend field of the
    target vector points to this.  */
@@ -2287,17 +2291,14 @@ static const struct ecoff_backend_data alpha_ecoff_backend_data =
 {
   /* COFF backend structure.  */
   {
-    (void (*) PARAMS ((bfd *,PTR,int,int,int,int,PTR))) bfd_void, /* aux_in */
-    (void (*) PARAMS ((bfd *,PTR,PTR))) bfd_void, /* sym_in */
-    (void (*) PARAMS ((bfd *,PTR,PTR))) bfd_void, /* lineno_in */
-    (unsigned (*) PARAMS ((bfd *,PTR,int,int,int,int,PTR)))bfd_void,/*aux_out*/
-    (unsigned (*) PARAMS ((bfd *,PTR,PTR))) bfd_void, /* sym_out */
-    (unsigned (*) PARAMS ((bfd *,PTR,PTR))) bfd_void, /* lineno_out */
-    (unsigned (*) PARAMS ((bfd *,PTR,PTR))) bfd_void, /* reloc_out */
+    alpha_ecoff_swap_coff_aux_in, alpha_ecoff_swap_coff_sym_in,
+    alpha_ecoff_swap_coff_lineno_in, alpha_ecoff_swap_coff_aux_out,
+    alpha_ecoff_swap_coff_sym_out, alpha_ecoff_swap_coff_lineno_out,
+    alpha_ecoff_swap_coff_reloc_out,
     alpha_ecoff_swap_filehdr_out, alpha_ecoff_swap_aouthdr_out,
     alpha_ecoff_swap_scnhdr_out,
-    FILHSZ, AOUTSZ, SCNHSZ, 0, 0, 0, 0, FILNMLEN, TRUE, 
-    ECOFF_NO_LONG_SECTION_NAMES, 4, FALSE, 2,
+    FILHSZ, AOUTSZ, SCNHSZ, 0, 0, 0, 0, FILNMLEN, TRUE,
+    ECOFF_NO_LONG_SECTION_NAMES, 4, FALSE, 2, 32768,
     alpha_ecoff_swap_filehdr_in, alpha_ecoff_swap_aouthdr_in,
     alpha_ecoff_swap_scnhdr_in, NULL,
     alpha_ecoff_bad_format_hook, _bfd_ecoff_set_arch_mach_hook,
@@ -2389,31 +2390,43 @@ static const struct ecoff_backend_data alpha_ecoff_backend_data =
 #define _bfd_ecoff_get_section_contents_in_window \
   _bfd_generic_get_section_contents_in_window
 
+/* Input section flag lookup is generic.  */
+#define _bfd_ecoff_bfd_lookup_section_flags bfd_generic_lookup_section_flags
+
 /* Relaxing sections is generic.  */
 #define _bfd_ecoff_bfd_relax_section bfd_generic_relax_section
 #define _bfd_ecoff_bfd_gc_sections bfd_generic_gc_sections
 #define _bfd_ecoff_bfd_merge_sections bfd_generic_merge_sections
 #define _bfd_ecoff_bfd_is_group_section bfd_generic_is_group_section
+#define _bfd_ecoff_bfd_group_name bfd_generic_group_name
 #define _bfd_ecoff_bfd_discard_group bfd_generic_discard_group
 #define _bfd_ecoff_section_already_linked \
-  _bfd_generic_section_already_linked
+  _bfd_coff_section_already_linked
 #define _bfd_ecoff_bfd_define_common_symbol bfd_generic_define_common_symbol
+#define _bfd_ecoff_bfd_link_hide_symbol _bfd_generic_link_hide_symbol
+#define _bfd_ecoff_bfd_define_start_stop    bfd_generic_define_start_stop
+#define _bfd_ecoff_bfd_link_check_relocs    _bfd_generic_link_check_relocs
 
-const bfd_target ecoffalpha_little_vec =
+/* Installing internal relocations in a section is also generic.  */
+#define _bfd_ecoff_set_reloc _bfd_generic_set_reloc
+
+const bfd_target alpha_ecoff_le_vec =
 {
   "ecoff-littlealpha",         /* name */
   bfd_target_ecoff_flavour,
   BFD_ENDIAN_LITTLE,           /* data byte order is little */
   BFD_ENDIAN_LITTLE,           /* header byte order is little */
 
-  (HAS_RELOC | EXEC_P |                /* object flags */
-   HAS_LINENO | HAS_DEBUG |
-   HAS_SYMS | HAS_LOCALS | DYNAMIC | WP_TEXT | D_PAGED),
+  (HAS_RELOC | EXEC_P          /* object flags */
+   | HAS_LINENO | HAS_DEBUG
+   HAS_SYMS | HAS_LOCALS | DYNAMIC | WP_TEXT | D_PAGED),
 
-  (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_CODE | SEC_DATA),
+  (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_CODE
+   | SEC_DATA | SEC_SMALL_DATA),
   0,                           /* 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_getl16, bfd_getl_signed_16, bfd_putl16, /* data */
@@ -2421,24 +2434,36 @@ const bfd_target ecoffalpha_little_vec =
      bfd_getl32, bfd_getl_signed_32, bfd_putl32,
      bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* hdrs */
 
-  {_bfd_dummy_target, alpha_ecoff_object_p, /* bfd_check_format */
-     bfd_generic_archive_p, _bfd_dummy_target},
-  {bfd_false, _bfd_ecoff_mkobject,  /* bfd_set_format */
-     _bfd_generic_mkarchive, bfd_false},
-  {bfd_false, _bfd_ecoff_write_object_contents, /* bfd_write_contents */
-     _bfd_write_archive_contents, bfd_false},
-
-     BFD_JUMP_TABLE_GENERIC (_bfd_ecoff),
-     BFD_JUMP_TABLE_COPY (_bfd_ecoff),
-     BFD_JUMP_TABLE_CORE (_bfd_nocore),
-     BFD_JUMP_TABLE_ARCHIVE (alpha_ecoff),
-     BFD_JUMP_TABLE_SYMBOLS (_bfd_ecoff),
-     BFD_JUMP_TABLE_RELOCS (_bfd_ecoff),
-     BFD_JUMP_TABLE_WRITE (_bfd_ecoff),
-     BFD_JUMP_TABLE_LINK (_bfd_ecoff),
-     BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
+  {                            /* bfd_check_format */
+    _bfd_dummy_target,
+    alpha_ecoff_object_p,
+    bfd_generic_archive_p,
+    _bfd_dummy_target
+  },
+  {                            /* bfd_set_format */
+    _bfd_bool_bfd_false_error,
+    _bfd_ecoff_mkobject,
+    _bfd_generic_mkarchive,
+    _bfd_bool_bfd_false_error
+  },
+  {                            /* bfd_write_contents */
+    _bfd_bool_bfd_false_error,
+    _bfd_ecoff_write_object_contents,
+    _bfd_write_archive_contents,
+    _bfd_bool_bfd_false_error
+  },
+
+  BFD_JUMP_TABLE_GENERIC (_bfd_ecoff),
+  BFD_JUMP_TABLE_COPY (_bfd_ecoff),
+  BFD_JUMP_TABLE_CORE (_bfd_nocore),
+  BFD_JUMP_TABLE_ARCHIVE (alpha_ecoff),
+  BFD_JUMP_TABLE_SYMBOLS (_bfd_ecoff),
+  BFD_JUMP_TABLE_RELOCS (_bfd_ecoff),
+  BFD_JUMP_TABLE_WRITE (_bfd_ecoff),
+  BFD_JUMP_TABLE_LINK (_bfd_ecoff),
+  BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
 
   NULL,
 
-  (PTR) &alpha_ecoff_backend_data
+  &alpha_ecoff_backend_data
 };
This page took 0.036795 seconds and 4 git commands to generate.