2007-07-03 Markus Deuling <deuling@de.ibm.com>
[deliverable/binutils-gdb.git] / bfd / coff-i860.c
index 74b599c91da8a7e3248f493bc3294e4bee840463..53e0fd199ea82052efb45310ea52a9bdd1dec2dc 100644 (file)
@@ -1,6 +1,6 @@
 /* BFD back-end for Intel i860 COFF files.
 /* BFD back-end for Intel i860 COFF files.
-   Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1999, 2000, 2001, 2002, 2003
-   Free Software Foundation, Inc.
+   Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1999, 2000, 2001, 2002,
+   2003, 2004, 2005, 2007 Free Software Foundation, Inc.
    Created mostly by substituting "860" for "386" in coff-i386.c
    Harry Dolan <dolan@ssd.intel.com>, October 1995
 
    Created mostly by substituting "860" for "386" in coff-i386.c
    Harry Dolan <dolan@ssd.intel.com>, October 1995
 
@@ -18,10 +18,10 @@ GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 along with this program; if not, write to the Free Software
 
 You should have received a copy of the GNU General Public License
 along with this program; if not, write to the Free Software
-Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
 
 
-#include "bfd.h"
 #include "sysdep.h"
 #include "sysdep.h"
+#include "bfd.h"
 #include "libbfd.h"
 
 #include "coff/i860.h"
 #include "libbfd.h"
 
 #include "coff/i860.h"
@@ -140,6 +140,7 @@ coff_i860_reloc_nyi (bfd *abfd ATTRIBUTE_UNUSED,
 {
   reloc_howto_type *howto = reloc_entry->howto;
   fprintf (stderr, _("Relocation `%s' not yet implemented\n"), howto->name);
 {
   reloc_howto_type *howto = reloc_entry->howto;
   fprintf (stderr, _("Relocation `%s' not yet implemented\n"), howto->name);
+  return bfd_reloc_notsupported;
 }
 
 #ifndef PCRELOFFSET
 }
 
 #ifndef PCRELOFFSET
@@ -462,31 +463,7 @@ static reloc_howto_type howto_table[] =
    FIXME: This macro refers to symbols and asect; these are from the
    calling function, not the macro arguments.  */
 
    FIXME: This macro refers to symbols and asect; these are from the
    calling function, not the macro arguments.  */
 
-/* FIXME: This was copied from the i386 version originally but
-   appears to be wrong for i860.  For now we'll do nothing.  */
-#if 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 (abfd, ptr);                  \
-    if (coffsym != (coff_symbol_type *) NULL                   \
-       && coffsym->native->u.syment.n_scnum == 0)              \
-      cache_ptr->addend = - coffsym->native->u.syment.n_value; \
-    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 && howto_table[reloc.r_type].pc_relative)          \
-      cache_ptr->addend += asect->vma;                         \
-  }
-#else
 #define CALC_ADDEND(abfd, ptr, reloc, cache_ptr)
 #define CALC_ADDEND(abfd, ptr, reloc, cache_ptr)
-#endif
 
 /* We use the special COFF backend linker.  */
 #define coff_relocate_section _bfd_coff_generic_relocate_section
 
 /* We use the special COFF backend linker.  */
 #define coff_relocate_section _bfd_coff_generic_relocate_section
@@ -524,7 +501,7 @@ coff_i860_rtype_to_howto (bfd *abfd ATTRIBUTE_UNUSED,
       BFD_ASSERT (h != NULL);
 
       /* I think we *do* want to bypass this.  If we don't, I have seen some data
       BFD_ASSERT (h != NULL);
 
       /* I think we *do* want to bypass this.  If we don't, I have seen some data
-        parameters get the wrong relcation address.  If I link two versions
+        parameters get the wrong relocation address.  If I link two versions
         with and without this section bypassed and then do a binary comparison,
         the addresses which are different can be looked up in the map.  The
         case in which this section has been bypassed has addresses which correspond
         with and without this section bypassed and then do a binary comparison,
         the addresses which are different can be looked up in the map.  The
         case in which this section has been bypassed has addresses which correspond
@@ -578,6 +555,20 @@ coff_i860_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
     }
 }
 
     }
 }
 
+static reloc_howto_type *
+coff_i860_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
+                            const char *r_name)
+{
+  unsigned int i;
+
+  for (i = 0; i < sizeof (howto_table) / sizeof (howto_table[0]); i++)
+    if (howto_table[i].name != NULL
+       && strcasecmp (howto_table[i].name, r_name) == 0)
+      return &howto_table[i];
+
+  return NULL;
+}
+
 /* This is called from coff_slurp_reloc_table for each relocation
    entry.  This special handling is due to the `PAIR' relocation
    which has a different meaning for the `r_symndx' field.  */
 /* This is called from coff_slurp_reloc_table for each relocation
    entry.  This special handling is due to the `PAIR' relocation
    which has a different meaning for the `r_symndx' field.  */
@@ -606,8 +597,8 @@ i860_reloc_processing (arelent *cache_ptr, struct internal_reloc *dst,
          if (dst->r_symndx < 0 || dst->r_symndx >= obj_conv_table_size (abfd))
            {
              (*_bfd_error_handler)
          if (dst->r_symndx < 0 || dst->r_symndx >= obj_conv_table_size (abfd))
            {
              (*_bfd_error_handler)
-               (_("%s: warning: illegal symbol index %ld in relocs"),
-                bfd_archive_filename (abfd), dst->r_symndx);
+               (_("%B: warning: illegal symbol index %ld in relocs"),
+                abfd, dst->r_symndx);
              cache_ptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
              ptr = NULL;
            }
              cache_ptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
              ptr = NULL;
            }
@@ -643,6 +634,7 @@ i860_reloc_processing (arelent *cache_ptr, struct internal_reloc *dst,
 \f
 #define coff_rtype_to_howto            coff_i860_rtype_to_howto
 #define coff_bfd_reloc_type_lookup     coff_i860_reloc_type_lookup
 \f
 #define coff_rtype_to_howto            coff_i860_rtype_to_howto
 #define coff_bfd_reloc_type_lookup     coff_i860_reloc_type_lookup
+#define coff_bfd_reloc_name_lookup coff_i860_reloc_name_lookup
 
 #define RELOC_PROCESSING(relent, reloc, symbols, abfd, section) \
   i860_reloc_processing (relent, reloc, symbols, abfd, section)
 
 #define RELOC_PROCESSING(relent, reloc, symbols, abfd, section) \
   i860_reloc_processing (relent, reloc, symbols, abfd, section)
This page took 0.029108 seconds and 4 git commands to generate.