* alpha-dis.c: Fix formatting.
[deliverable/binutils-gdb.git] / bfd / coff-alpha.c
index b1134d08ef952e6eb7b9c3a1f54fa3b64642c9f7..d0db6a85e300c7bd3bfd305396d481ef11b04d12 100644 (file)
@@ -1,5 +1,6 @@
 /* BFD back-end for ALPHA Extended-Coff files.
-   Copyright 1993, 1994, 1995, 1996 Free Software Foundation, Inc.
+   Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+   Free Software Foundation, Inc.
    Modified from coff-mips.c by Steve Chamberlain <sac@cygnus.com> and
    Ian Lance Taylor <ian@cygnus.com>.
 
@@ -47,6 +48,8 @@ static void alpha_adjust_reloc_in PARAMS ((bfd *,
                                           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, boolean relocateable, asymbol **symbols));
@@ -125,13 +128,13 @@ reloc_nil PARAMS ((bfd *, arelent *, asymbol *, PTR,
 
 static bfd_reloc_status_type
 reloc_nil (abfd, reloc, sym, data, sec, output_bfd, error_message)
-     bfd *abfd;
-     arelent *reloc;
-     asymbol *sym;
-     PTR data;
-     asection *sec;
-     bfd *output_bfd;
-     char **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;
 {
   return bfd_reloc_ok;
 }
@@ -470,7 +473,7 @@ alpha_ecoff_object_p (abfd)
 
 static boolean
 alpha_ecoff_bad_format_hook (abfd, filehdr)
-     bfd *abfd;
+     bfd *abfd ATTRIBUTE_UNUSED;
      PTR filehdr;
 {
   struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
@@ -634,9 +637,13 @@ alpha_adjust_reloc_in (abfd, intern, rptr)
     case ALPHA_R_SREL16:
     case ALPHA_R_SREL32:
     case ALPHA_R_SREL64:
-      /* The PC relative relocs do not seem to use the section VMA as
-        a negative addend.  */
-      rptr->addend = 0;
+      /* 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.  */
+      if (! intern->r_extern)
+       rptr->addend = 0;
+      else
+       rptr->addend = - (intern->r_vaddr + 4);
       break;
 
     case ALPHA_R_GPREL32:
@@ -701,7 +708,7 @@ alpha_adjust_reloc_in (abfd, intern, rptr)
 
 static void
 alpha_adjust_reloc_out (abfd, rel, intern)
-     bfd *abfd;
+     bfd *abfd ATTRIBUTE_UNUSED;
      const arelent *rel;
      struct internal_reloc *intern;
 {
@@ -759,7 +766,6 @@ alpha_ecoff_get_relocated_section_contents (abfd, link_info, link_order,
   bfd *output_bfd = relocateable ? abfd : (bfd *) NULL;
   bfd_vma gp;
   boolean gp_undefined;
-  bfd_vma gp;
   bfd_vma stack[RELOC_STACKSIZE];
   int tos = 0;
 
@@ -872,7 +878,7 @@ alpha_ecoff_get_relocated_section_contents (abfd, link_info, link_order,
          if (r == bfd_reloc_ok && gp_undefined)
            {
              r = bfd_reloc_dangerous;
-             err = (char *) "GP relative relocation used when GP not defined";
+             err = (char *) _("GP relative relocation used when GP not defined");
            }
          break;
 
@@ -909,7 +915,7 @@ alpha_ecoff_get_relocated_section_contents (abfd, link_info, link_order,
              {
                r = bfd_reloc_dangerous;
                err =
-                 (char *) "GP relative relocation used when GP not defined";
+                 (char *) _("GP relative relocation used when GP not defined");
              }
          }
          break;
@@ -919,7 +925,7 @@ alpha_ecoff_get_relocated_section_contents (abfd, link_info, link_order,
             does not cause anything to happen, itself.  */
          rel->address += input_section->output_offset;
          break;
-           
+
        case ALPHA_R_GPDISP:
          /* This marks the ldah of an ldah/lda pair which loads the
             gp register with the difference of the gp value and the
@@ -975,7 +981,7 @@ alpha_ecoff_get_relocated_section_contents (abfd, link_info, link_order,
            rel->address += input_section->output_offset;
          }
          break;
-         
+
        case ALPHA_R_OP_PUSH:
          /* Push a value on the reloc evaluation stack.  */
          {
@@ -1101,7 +1107,7 @@ alpha_ecoff_get_relocated_section_contents (abfd, link_info, link_order,
            stack[tos - 1] >>= relocation;
          }
          break;
-           
+
        case ALPHA_R_GPVALUE:
          /* I really don't know if this does the right thing.  */
          gp = rel->addend;
@@ -1121,17 +1127,17 @@ alpha_ecoff_get_relocated_section_contents (abfd, link_info, link_order,
          os->reloc_count++;
        }
 
-      if (r != bfd_reloc_ok) 
+      if (r != bfd_reloc_ok)
        {
          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)))
+                     input_bfd, input_section, rel->address, true)))
                goto error_return;
              break;
-           case bfd_reloc_dangerous: 
+           case bfd_reloc_dangerous:
              if (! ((*link_info->callbacks->reloc_dangerous)
                     (link_info, err, input_bfd, input_section,
                      rel->address)))
@@ -1170,7 +1176,7 @@ alpha_ecoff_get_relocated_section_contents (abfd, link_info, link_order,
 
 static reloc_howto_type *
 alpha_bfd_reloc_type_lookup (abfd, code)
-     bfd *abfd;
+     bfd *abfd ATTRIBUTE_UNUSED;
      bfd_reloc_code_real_type code;
 {
   int alpha_type;
@@ -1244,7 +1250,7 @@ alpha_bfd_reloc_type_lookup (abfd, code)
 
 static bfd_vma
 alpha_convert_external_reloc (output_bfd, info, input_bfd, ext_rel, h)
-     bfd *output_bfd;
+     bfd *output_bfd ATTRIBUTE_UNUSED;
      struct bfd_link_info *info;
      bfd *input_bfd;
      struct external_reloc *ext_rel;
@@ -1327,7 +1333,7 @@ alpha_convert_external_reloc (output_bfd, info, input_bfd, ext_rel, h)
            r_symndx = RELOC_SECTION_XDATA;
          break;
        }
-                     
+
       if (r_symndx == -1)
        abort ();
 
@@ -1432,7 +1438,7 @@ alpha_relocate_section (output_bfd, info, input_bfd, input_section,
      pointer.  To support large programs, we need to allow multiple
      global pointers.  This works as long as each input .lita section
      is <64KB big.  This implies that when producing relocatable
-     output, the .lita section is limited to 64KB. . */
+     output, the .lita section is limited to 64KB. .  */
 
   lita_sec = symndx_to_section[RELOC_SECTION_LITA];
   gp = _bfd_get_gp_value (output_bfd);
@@ -1474,14 +1480,13 @@ alpha_relocate_section (output_bfd, info, input_bfd, input_section,
              /* Either gp hasn't been set at all or the current gp
                 cannot address this .lita section.  In both cases we
                 reset the gp to point into the "middle" of the
-                current input .lita section.  For now, we issue a
-                warning when redefining the gp value (probably should
-                be made optional). */
+                current input .lita section.  */
              if (gp && !ecoff_data (output_bfd)->issued_multiple_gp_warning)
                {
-                 (*_bfd_error_handler) 
-                   ("%s: warning: using multiple gp values",
-                    bfd_get_filename (output_bfd));
+                 (*info->callbacks->warning) (info,
+                                              _("using multiple gp values"),
+                                              (char *) NULL, output_bfd,
+                                              (asection *) NULL, (bfd_vma) 0);
                  ecoff_data (output_bfd)->issued_multiple_gp_warning = true;
                }
              if (lita_vma < gp - 0x8000)
@@ -1555,11 +1560,16 @@ alpha_relocate_section (output_bfd, info, input_bfd, input_section,
 
        case ALPHA_R_REFLONG:
        case ALPHA_R_REFQUAD:
-       case ALPHA_R_BRADDR:
        case ALPHA_R_HINT:
+         relocatep = true;
+         break;
+
+       case ALPHA_R_BRADDR:
        case ALPHA_R_SREL16:
        case ALPHA_R_SREL32:
        case ALPHA_R_SREL64:
+         if (r_extern)
+           addend += - (r_vaddr + 4);
          relocatep = true;
          break;
 
@@ -1610,7 +1620,7 @@ alpha_relocate_section (output_bfd, info, input_bfd, input_section,
          /* See ALPHA_R_LITERAL above for the uses of this reloc.  It
             does not cause anything to happen, itself.  */
          break;
-           
+
        case ALPHA_R_GPDISP:
          /* This marks the ldah of an ldah/lda pair which loads the
             gp register with the difference of the gp value and the
@@ -1670,7 +1680,7 @@ alpha_relocate_section (output_bfd, info, input_bfd, input_section,
            gp_usedp = true;
          }
          break;
-         
+
        case ALPHA_R_OP_PUSH:
        case ALPHA_R_OP_PSUB:
        case ALPHA_R_OP_PRSHIFT:
@@ -1710,7 +1720,7 @@ alpha_relocate_section (output_bfd, info, input_bfd, input_section,
                         relocated.  */
                      if (! ((*info->callbacks->undefined_symbol)
                             (info, h->root.root.string, input_bfd,
-                             input_section, (bfd_vma) 0)))
+                             input_section, (bfd_vma) 0, true)))
                        return false;
                      addend = 0;
                    }
@@ -1912,7 +1922,7 @@ alpha_relocate_section (output_bfd, info, input_bfd, input_section,
                      if (! ((*info->callbacks->undefined_symbol)
                             (info, h->root.root.string, input_bfd,
                              input_section,
-                             r_vaddr - input_section->vma)))
+                             r_vaddr - input_section->vma, true)))
                        return false;
                      relocation = 0;
                    }
@@ -1980,7 +1990,7 @@ alpha_relocate_section (output_bfd, info, input_bfd, input_section,
       if (gp_usedp && gp_undefined)
        {
          if (! ((*info->callbacks->reloc_dangerous)
-                (info, "GP relative relocation when GP not defined",
+                (info, _("GP relative relocation when GP not defined"),
                  input_bfd, input_section, r_vaddr - input_section->vma)))
            return false;
          /* Only give the error once per link.  */
@@ -1999,12 +2009,11 @@ alpha_relocate_section (output_bfd, info, input_bfd, input_section,
 /* Do final adjustments to the filehdr and the aouthdr.  This routine
    sets the dynamic bits in the file header.  */
 
-/*ARGSUSED*/
 static boolean
 alpha_adjust_headers (abfd, fhdr, ahdr)
      bfd *abfd;
      struct internal_filehdr *fhdr;
-     struct internal_aouthdr *ahdr;
+     struct internal_aouthdr *ahdr ATTRIBUTE_UNUSED;
 {
   if ((abfd->flags & (DYNAMIC | EXEC_P)) == (DYNAMIC | EXEC_P))
     fhdr->f_flags |= F_ALPHA_CALL_SHARED;
@@ -2127,7 +2136,7 @@ alpha_ecoff_get_elt_at_filepos (archive, filepos)
 
       left = size;
 
-      /* I don't know what the next eight bytes are for. */
+      /* I don't know what the next eight bytes are for.  */
       if (bfd_read (ab, 1, 8, nbfd) != 8)
        goto error_return;
 
@@ -2192,7 +2201,7 @@ alpha_ecoff_get_elt_at_filepos (archive, filepos)
  error_return:
   if (nbfd != NULL)
     bfd_close (nbfd);
-  return NULL;  
+  return NULL;
 }
 
 /* Open the next archived file.  */
@@ -2220,7 +2229,7 @@ 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. */
+        BSD-4.4-style element with a long odd size.  */
       filestart = last_file->origin + size;
       filestart += filestart % 2;
     }
@@ -2257,13 +2266,14 @@ static const struct ecoff_backend_data alpha_ecoff_backend_data =
     (unsigned (*) PARAMS ((bfd *,PTR,PTR))) bfd_void, /* reloc_out */
     alpha_ecoff_swap_filehdr_out, alpha_ecoff_swap_aouthdr_out,
     alpha_ecoff_swap_scnhdr_out,
-    FILHSZ, AOUTSZ, SCNHSZ, 0, 0, 0, 0, true,
+    FILHSZ, AOUTSZ, SCNHSZ, 0, 0, 0, 0, FILNMLEN, true, false, 4, false, 2,
     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,
     alpha_ecoff_mkobject_hook, _bfd_ecoff_styp_to_sec_flags,
     _bfd_ecoff_set_alignment_hook, _bfd_ecoff_slurp_symbol_table,
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+    NULL, NULL, NULL
   },
   /* Supported architecture.  */
   bfd_arch_alpha,
@@ -2348,6 +2358,8 @@ static const struct ecoff_backend_data alpha_ecoff_backend_data =
 
 /* 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
 
 const bfd_target ecoffalpha_little_vec =
 {
@@ -2388,5 +2400,7 @@ const bfd_target ecoffalpha_little_vec =
      BFD_JUMP_TABLE_LINK (_bfd_ecoff),
      BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
 
+  NULL,
+
   (PTR) &alpha_ecoff_backend_data
 };
This page took 0.029413 seconds and 4 git commands to generate.