This commit was generated by cvs2svn to track changes on a CVS vendor
[deliverable/binutils-gdb.git] / bfd / coff-alpha.c
index 1bbec4c01944dff207d5c062bdcc3e1f30acd094..79b8023d31d61c941103f613b886d44e7bf41e84 100644 (file)
@@ -1,5 +1,5 @@
 /* BFD back-end for ALPHA Extended-Coff files.
-   Copyright 1993, 1994 Free Software Foundation, Inc.
+   Copyright 1993, 94, 95, 96, 97, 98, 1999 Free Software Foundation, Inc.
    Modified from coff-mips.c by Steve Chamberlain <sac@cygnus.com> and
    Ian Lance Taylor <ian@cygnus.com>.
 
@@ -47,6 +47,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));
@@ -634,9 +636,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:
@@ -785,7 +791,8 @@ alpha_ecoff_get_relocated_section_contents (abfd, link_info, link_order,
 
   /* Get the GP value for the output BFD.  */
   gp_undefined = false;
-  if (ecoff_data (abfd)->gp == 0)
+  gp = _bfd_get_gp_value (abfd);
+  if (gp == 0)
     {
       if (relocateable != false)
        {
@@ -804,7 +811,8 @@ alpha_ecoff_get_relocated_section_contents (abfd, link_info, link_order,
                      || strcmp (sec->name, ".lita") == 0))
                lo = sec->vma;
            }
-         ecoff_data (abfd)->gp = lo + 0x8000;
+         gp = lo + 0x8000;
+         _bfd_set_gp_value (abfd, gp);
        }
       else
        {
@@ -816,12 +824,14 @@ alpha_ecoff_get_relocated_section_contents (abfd, link_info, link_order,
              || h->type != bfd_link_hash_defined)
            gp_undefined = true;
          else
-           ecoff_data (abfd)->gp = (h->u.def.value
-                                    + h->u.def.section->output_section->vma
-                                    + h->u.def.section->output_offset);
+           {
+             gp = (h->u.def.value
+                   + h->u.def.section->output_section->vma
+                   + h->u.def.section->output_offset);
+             _bfd_set_gp_value (abfd, gp);
+           }
        }
     }
-  gp = ecoff_data (abfd)->gp;
 
   for (; *reloc_vector != (arelent *) NULL; reloc_vector++)
     {
@@ -867,7 +877,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;
 
@@ -904,7 +914,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;
@@ -1123,7 +1133,7 @@ alpha_ecoff_get_relocated_section_contents (abfd, link_info, link_order,
            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: 
@@ -1430,7 +1440,7 @@ alpha_relocate_section (output_bfd, info, input_bfd, input_section,
      output, the .lita section is limited to 64KB. . */
 
   lita_sec = symndx_to_section[RELOC_SECTION_LITA];
-  gp = ecoff_data (output_bfd)->gp;
+  gp = _bfd_get_gp_value (output_bfd);
   if (! info->relocateable && lita_sec != NULL)
     {
       struct ecoff_section_tdata *lita_sec_data;
@@ -1469,14 +1479,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)
@@ -1489,7 +1498,7 @@ alpha_relocate_section (output_bfd, info, input_bfd, input_section,
          lita_sec_data->gp = gp;
        }
 
-      ecoff_data (output_bfd)->gp = gp;
+      _bfd_set_gp_value (output_bfd, gp);
     }
 
   gp_undefined = (gp == 0);
@@ -1550,11 +1559,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;
 
@@ -1705,7 +1719,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;
                    }
@@ -1907,7 +1921,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;
                    }
@@ -1975,11 +1989,12 @@ 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.  */
-         ecoff_data (output_bfd)->gp = gp = 4;
+         gp = 4;
+         _bfd_set_gp_value (output_bfd, gp);
          gp_undefined = false;
        }
     }
@@ -2251,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
   },
   /* Supported architecture.  */
   bfd_arch_alpha,
@@ -2342,6 +2358,7 @@ 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
 
 const bfd_target ecoffalpha_little_vec =
 {
@@ -2382,5 +2399,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.027638 seconds and 4 git commands to generate.