Added Self to Write After Approval
[deliverable/binutils-gdb.git] / bfd / pe-mips.c
index 8f6e454cc62baa396cc4c5862bd3bb550f6fd7d4..c78726d1c3b398365c7d4db8f1a7accdf3e917b2 100644 (file)
@@ -1,5 +1,6 @@
 /* BFD back-end for MIPS PE COFF files.
-   Copyright (C) 1990, 91, 92, 93, 94, 95, 96, 97, 98, 99, 2000 Free Software Foundation, Inc.
+   Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+   2000, 2001 Free Software Foundation, Inc.
    Modified from coff-i386.c by DJ Delorie, dj@cygnus.com
 
 This file is part of BFD, the Binary File Descriptor library.
@@ -34,14 +35,14 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 #include "libcoff.h"
 
-static bfd_reloc_status_type coff_mips_reloc 
+static bfd_reloc_status_type coff_mips_reloc
   PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
 static reloc_howto_type *coff_mips_rtype_to_howto
   PARAMS ((bfd *, asection *, struct internal_reloc *,
           struct coff_link_hash_entry *, struct internal_syment *,
 
           bfd_vma *));
-
+#if 0
 static void mips_ecoff_swap_reloc_in PARAMS ((bfd *, PTR,
                                              struct internal_reloc *));
 static void mips_ecoff_swap_reloc_out PARAMS ((bfd *,
@@ -52,6 +53,15 @@ static void mips_adjust_reloc_in PARAMS ((bfd *,
                                          arelent *));
 static void mips_adjust_reloc_out PARAMS ((bfd *, const arelent *,
                                           struct internal_reloc *));
+#endif
+
+static boolean in_reloc_p PARAMS ((bfd *, reloc_howto_type *));
+static reloc_howto_type * coff_mips_reloc_type_lookup PARAMS ((bfd *, bfd_reloc_code_real_type));
+static void mips_swap_reloc_in PARAMS ((bfd *, PTR, PTR));
+static unsigned int mips_swap_reloc_out PARAMS ((bfd *, PTR, PTR));
+static boolean coff_pe_mips_relocate_section
+  PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
+          struct internal_reloc *, struct internal_syment *, asection **));
 
 #define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (2)
 /* The page size is a guess based on ELF.  */
@@ -74,9 +84,9 @@ coff_mips_reloc (abfd, reloc_entry, symbol, data, input_section, output_bfd,
      arelent *reloc_entry;
      asymbol *symbol;
      PTR data;
-     asection *input_section;
+     asection *input_section ATTRIBUTE_UNUSED;
      bfd *output_bfd;
-     char **error_message;
+     char **error_message ATTRIBUTE_UNUSED;
 {
   symvalue diff;
 
@@ -143,7 +153,7 @@ coff_mips_reloc (abfd, reloc_entry, symbol, data, input_section, output_bfd,
            {
              short x = bfd_get_16 (abfd, addr);
              DOIT (x);
-             bfd_put_16 (abfd, x, addr);
+             bfd_put_16 (abfd, (bfd_vma) x, addr);
            }
            break;
 
@@ -151,7 +161,7 @@ coff_mips_reloc (abfd, reloc_entry, symbol, data, input_section, output_bfd,
            {
              long x = bfd_get_32 (abfd, addr);
              DOIT (x);
-             bfd_put_32 (abfd, x, addr);
+             bfd_put_32 (abfd, (bfd_vma) x, addr);
            }
            break;
 
@@ -166,21 +176,22 @@ coff_mips_reloc (abfd, reloc_entry, symbol, data, input_section, output_bfd,
 
 #ifdef COFF_WITH_PE
 /* Return true if this relocation should
-   appear in the output .reloc section. */
+   appear in the output .reloc section.  */
 
-static boolean in_reloc_p(abfd, howto)
-     bfd * abfd;
+static boolean
+in_reloc_p (abfd, howto)
+     bfd * abfd ATTRIBUTE_UNUSED;
      reloc_howto_type *howto;
 {
   return ! howto->pc_relative && howto->type != MIPS_R_RVA;
-}     
+}
 #endif
 
 #ifndef PCRELOFFSET
 #define PCRELOFFSET false
 #endif
 
-static reloc_howto_type howto_table[] = 
+static reloc_howto_type howto_table[] =
 {
   /* Reloc type 0 is ignored.  The reloc reading code ensures that
      this is a reference to the .abs section, which will cause
@@ -310,59 +321,59 @@ static reloc_howto_type howto_table[] =
         0xffff,                /* dst_mask */
         false),                /* pcrel_offset */
 
-  { 8 },
-  { 9 },
-  { 10 },
-  { 11 },
-  { 12 },
-  { 13 },
-  { 14 },
-  { 15 },
-  { 16 },
-  { 17 },
-  { 18 },
-  { 19 },
-  { 20 },
-  { 21 },
-  { 22 },
-  { 23 },
-  { 24 },
-  { 25 },
-  { 26 },
-  { 27 },
-  { 28 },
-  { 29 },
-  { 30 },
-  { 31 },
-  { 32 },
-  { 33 },
-  HOWTO (MIPS_R_RVA,            /* type */                                 
-        0,                     /* rightshift */                           
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */ 
-        32,                    /* bitsize */                   
-        false,                 /* pc_relative */                          
-        0,                     /* bitpos */                               
+  EMPTY_HOWTO (8),
+  EMPTY_HOWTO (9),
+  EMPTY_HOWTO (10),
+  EMPTY_HOWTO (11),
+  EMPTY_HOWTO (12),
+  EMPTY_HOWTO (13),
+  EMPTY_HOWTO (14),
+  EMPTY_HOWTO (15),
+  EMPTY_HOWTO (16),
+  EMPTY_HOWTO (17),
+  EMPTY_HOWTO (18),
+  EMPTY_HOWTO (19),
+  EMPTY_HOWTO (20),
+  EMPTY_HOWTO (21),
+  EMPTY_HOWTO (22),
+  EMPTY_HOWTO (23),
+  EMPTY_HOWTO (24),
+  EMPTY_HOWTO (25),
+  EMPTY_HOWTO (26),
+  EMPTY_HOWTO (27),
+  EMPTY_HOWTO (28),
+  EMPTY_HOWTO (29),
+  EMPTY_HOWTO (30),
+  EMPTY_HOWTO (31),
+  EMPTY_HOWTO (32),
+  EMPTY_HOWTO (33),
+  HOWTO (MIPS_R_RVA,            /* type */
+        0,                     /* rightshift */
+        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        32,                    /* bitsize */
+        false,                 /* pc_relative */
+        0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
-        coff_mips_reloc,       /* special_function */                     
-        "rva32",               /* name */                                 
-        true,                  /* partial_inplace */                      
-        0xffffffff,            /* src_mask */                             
-        0xffffffff,            /* dst_mask */                             
+        coff_mips_reloc,       /* special_function */
+        "rva32",               /* name */
+        true,                  /* partial_inplace */
+        0xffffffff,            /* src_mask */
+        0xffffffff,            /* dst_mask */
         false),                /* pcrel_offset */
-  { 35 },
-  { 36 },
-  HOWTO (MIPS_R_PAIR,           /* type */                                 
-        0,                     /* rightshift */                           
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */ 
-        32,                    /* bitsize */                   
-        false,                 /* pc_relative */                          
-        0,                     /* bitpos */                               
+  EMPTY_HOWTO (35),
+  EMPTY_HOWTO (36),
+  HOWTO (MIPS_R_PAIR,           /* type */
+        0,                     /* rightshift */
+        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        32,                    /* bitsize */
+        false,                 /* pc_relative */
+        0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
-        coff_mips_reloc,       /* special_function */                     
-        "PAIR",                /* name */                                 
-        true,                  /* partial_inplace */                      
-        0xffffffff,            /* src_mask */                             
-        0xffffffff,            /* dst_mask */                             
+        coff_mips_reloc,       /* special_function */
+        "PAIR",                /* name */
+        true,                  /* partial_inplace */
+        0xffffffff,            /* src_mask */
+        0xffffffff,            /* dst_mask */
         false),                /* pcrel_offset */
 };
 
@@ -408,12 +419,11 @@ static reloc_howto_type howto_table[] =
       cache_ptr->addend += asect->vma;                         \
   }
 
-
 /* Convert an rtype to howto for the COFF backend linker.  */
 
 static reloc_howto_type *
 coff_mips_rtype_to_howto (abfd, sec, rel, h, sym, addendp)
-     bfd *abfd;
+     bfd *abfd ATTRIBUTE_UNUSED;
      asection *sec;
      struct internal_reloc *rel;
      struct coff_link_hash_entry *h;
@@ -439,7 +449,7 @@ coff_mips_rtype_to_howto (abfd, sec, rel, h, sym, addendp)
         function will be adding in the final value of the symbol.  We
         need to subtract out the current size in order to get the
         correct result.  */
+
       BFD_ASSERT (h != NULL);
 
 #ifndef COFF_WITH_PE
@@ -458,7 +468,7 @@ coff_mips_rtype_to_howto (abfd, sec, rel, h, sym, addendp)
   /* If the output symbol is common (in which case this must be a
      relocateable link), we need to add in the final size of the
      common symbol.  */
-  if (h != NULL && h->root.type == bfd_link_hash_common) 
+  if (h != NULL && h->root.type == bfd_link_hash_common)
     *addendp += h->root.u.c.size;
 #endif
 
@@ -488,16 +498,13 @@ coff_mips_rtype_to_howto (abfd, sec, rel, h, sym, addendp)
 
 #define coff_rtype_to_howto coff_mips_rtype_to_howto
 
-
 #define coff_bfd_reloc_type_lookup coff_mips_reloc_type_lookup
 
-
-
 /* Get the howto structure for a generic reloc type.  */
 
 static reloc_howto_type *
 coff_mips_reloc_type_lookup (abfd, code)
-     bfd *abfd;
+     bfd *abfd ATTRIBUTE_UNUSED;
      bfd_reloc_code_real_type code;
 {
   int mips_type;
@@ -520,7 +527,7 @@ coff_mips_reloc_type_lookup (abfd, code)
     case BFD_RELOC_LO16:
       mips_type = MIPS_R_REFLO;
       break;
-    case BFD_RELOC_MIPS_GPREL:
+    case BFD_RELOC_GPREL16:
       mips_type = MIPS_R_GPREL;
       break;
     case BFD_RELOC_MIPS_LITERAL:
@@ -560,10 +567,9 @@ mips_swap_reloc_in (abfd, src, dst)
   RELOC *reloc_src = (RELOC *) src;
   struct internal_reloc *reloc_dst = (struct internal_reloc *) dst;
 
-  reloc_dst->r_vaddr = bfd_h_get_32(abfd, (bfd_byte *)reloc_src->r_vaddr);
-  reloc_dst->r_symndx =
-    bfd_h_get_signed_32(abfd, (bfd_byte *) reloc_src->r_symndx);
-  reloc_dst->r_type = bfd_h_get_16(abfd, (bfd_byte *) reloc_src->r_type);
+  reloc_dst->r_vaddr = H_GET_32 (abfd, reloc_src->r_vaddr);
+  reloc_dst->r_symndx = H_GET_S32 (abfd, reloc_src->r_symndx);
+  reloc_dst->r_type = H_GET_16 (abfd, reloc_src->r_type);
   reloc_dst->r_size = 0;
   reloc_dst->r_extern = 0;
   reloc_dst->r_offset = 0;
@@ -577,7 +583,7 @@ mips_swap_reloc_in (abfd, src, dst)
     reloc_dst->r_offset = reloc_dst->r_symndx;
     if (reloc_dst->r_offset & 0x8000)
       reloc_dst->r_offset -= 0x10000;
-    /*printf("dj: pair offset is %08x\n", reloc_dst->r_offset);*/
+    /*printf ("dj: pair offset is %08x\n", reloc_dst->r_offset);*/
     reloc_dst->r_symndx = pair_prev.r_symndx;
     break;
   }
@@ -607,23 +613,18 @@ mips_swap_reloc_out (abfd, src, dst)
             the same address as a REFHI, we assume this is the matching
             PAIR reloc and output it accordingly.  The symndx is really
             the low 16 bits of the addend */
-         bfd_h_put_32 (abfd, reloc_src->r_vaddr,
-                       (bfd_byte *) reloc_dst->r_vaddr);
-         bfd_h_put_32 (abfd, reloc_src->r_symndx,
-                       (bfd_byte *) reloc_dst->r_symndx);
-
-         bfd_h_put_16(abfd, MIPS_R_PAIR, (bfd_byte *)
-                      reloc_dst->r_type);
+         H_PUT_32 (abfd, reloc_src->r_vaddr, reloc_dst->r_vaddr);
+         H_PUT_32 (abfd, reloc_src->r_symndx, reloc_dst->r_symndx);
+         H_PUT_16 (abfd, MIPS_R_PAIR, reloc_dst->r_type);
          return RELSZ;
        }
       break;
     }
 
-  bfd_h_put_32(abfd, reloc_src->r_vaddr, (bfd_byte *) reloc_dst->r_vaddr);
-  bfd_h_put_32(abfd, reloc_src->r_symndx, (bfd_byte *) reloc_dst->r_symndx);
+  H_PUT_32 (abfd, reloc_src->r_vaddr, reloc_dst->r_vaddr);
+  H_PUT_32 (abfd, reloc_src->r_symndx, reloc_dst->r_symndx);
 
-  bfd_h_put_16(abfd, reloc_src->r_type, (bfd_byte *)
-              reloc_dst->r_type);
+  H_PUT_16 (abfd, reloc_src->r_type, reloc_dst->r_type);
   return RELSZ;
 }
 
@@ -644,24 +645,19 @@ coff_pe_mips_relocate_section (output_bfd, info, input_bfd,
      struct internal_syment *syms;
      asection **sections;
 {
-  asection **symndx_to_section;
-  struct ecoff_link_hash_entry **sym_hashes;
-  struct coff_link_hash_entry *h;
   bfd_vma gp;
   boolean gp_undefined;
   size_t adjust;
-  long *offsets;
   struct internal_reloc *rel;
   struct internal_reloc *rel_end;
   unsigned int i;
   boolean got_lo;
-  struct internal_reloc lo_int_rel;
 
   if (info->relocateable)
   {
-    (*_bfd_error_handler)(_("\
+    (*_bfd_error_handler) (_("\
 %s: `ld -r' not supported with PE MIPS objects\n"),
-                         bfd_get_filename (input_bfd));
+                          bfd_archive_filename (input_bfd));
     bfd_set_error (bfd_error_bad_value);
     return false;
   }
@@ -670,7 +666,7 @@ coff_pe_mips_relocate_section (output_bfd, info, input_bfd,
              == output_bfd->xvec->byteorder);
 
 #if 0
-  printf("dj: relocate %s(%s) %08x\n",
+  printf ("dj: relocate %s(%s) %08x\n",
         input_bfd->filename, input_section->name,
         input_section->output_section->vma + input_section->output_offset);
 #endif
@@ -695,7 +691,6 @@ coff_pe_mips_relocate_section (output_bfd, info, input_bfd,
       bfd_vma addend = 0;
       bfd_vma val, tmp, targ, src, low;
       reloc_howto_type *howto;
-      bfd_reloc_status_type rstat;
       unsigned char *mem = contents + rel->r_vaddr;
 
       symndx = rel->r_symndx;
@@ -706,7 +701,7 @@ coff_pe_mips_relocate_section (output_bfd, info, input_bfd,
          sym = NULL;
        }
       else
-       {    
+       {
          h = obj_coff_sym_hashes (input_bfd)[symndx];
          sym = syms + symndx;
        }
@@ -721,7 +716,6 @@ coff_pe_mips_relocate_section (output_bfd, info, input_bfd,
       else
        addend = 0;
 
-
       howto = bfd_coff_rtype_to_howto (input_bfd, input_section, rel, h,
                                       sym, &addend);
       if (howto == NULL)
@@ -785,7 +779,7 @@ coff_pe_mips_relocate_section (output_bfd, info, input_bfd,
       src = rel->r_vaddr + input_section->output_section->vma
        + input_section->output_offset;
 #if 0
-      printf("dj: reloc %02x %-8s a=%08x/%08x(%08x) v=%08x+%08x %s\n",
+      printf ("dj: reloc %02x %-8s a=%08x/%08x(%08x) v=%08x+%08x %s\n",
             rel->r_type, howto_table[rel->r_type].name,
             src, rel->r_vaddr, *(unsigned long *)mem, val, rel->r_offset,
             h?h->root.root.string:"(none)");
@@ -797,8 +791,8 @@ coff_pe_mips_relocate_section (output_bfd, info, input_bfd,
           val = VMA of what we need to refer to
       */
 
-#define UI(x) (*_bfd_error_handler)(_("%s: unimplemented %s\n"), \
-                                   bfd_get_filename (input_bfd), x); \
+#define UI(x) (*_bfd_error_handler) (_("%s: unimplemented %s\n"), \
+                                    bfd_archive_filename (input_bfd), x); \
              bfd_set_error (bfd_error_bad_value);
 
       switch (rel->r_type)
@@ -813,7 +807,7 @@ coff_pe_mips_relocate_section (output_bfd, info, input_bfd,
 
        case MIPS_R_REFWORD:
          tmp = bfd_get_32(input_bfd, mem);
-         /* printf("refword: src=%08x targ=%08x+%08x\n", src, tmp, val); */
+         /* printf ("refword: src=%08x targ=%08x+%08x\n", src, tmp, val); */
          tmp += val;
          bfd_put_32(input_bfd, tmp, mem);
          break;
@@ -821,10 +815,10 @@ coff_pe_mips_relocate_section (output_bfd, info, input_bfd,
        case MIPS_R_JMPADDR:
          tmp = bfd_get_32(input_bfd, mem);
          targ = val + (tmp&0x03ffffff)*4;
-         if (src & 0xf0000000 != targ & 0xf0000000)
+         if ((src & 0xf0000000) != (targ & 0xf0000000))
            {
-             (*_bfd_error_handler)(_("%s: jump too far away\n"),
-                                   bfd_get_filename (input_bfd));
+             (*_bfd_error_handler) (_("%s: jump too far away\n"),
+                                    bfd_archive_filename (input_bfd));
              bfd_set_error (bfd_error_bad_value);
              return false;
            }
@@ -850,8 +844,8 @@ coff_pe_mips_relocate_section (output_bfd, info, input_bfd,
              targ = val + low + ((tmp & 0xffff) << 16);
              break;
            default:
-             (*_bfd_error_handler)(_("%s: bad pair/reflo after refhi\n"),
-                                   bfd_get_filename (input_bfd));
+             (*_bfd_error_handler) (_("%s: bad pair/reflo after refhi\n"),
+                                    bfd_archive_filename (input_bfd));
              bfd_set_error (bfd_error_bad_value);
              return false;
            }
@@ -863,7 +857,7 @@ coff_pe_mips_relocate_section (output_bfd, info, input_bfd,
        case MIPS_R_REFLO:
          tmp = bfd_get_32(input_bfd, mem);
          targ = val + (tmp & 0xffff);
-         /* printf("refword: src=%08x targ=%08x\n", src, targ); */
+         /* printf ("refword: src=%08x targ=%08x\n", src, targ); */
          tmp &= 0xffff0000;
          tmp |= targ & 0xffff;
          bfd_put_32(input_bfd, tmp, mem);
@@ -892,9 +886,9 @@ coff_pe_mips_relocate_section (output_bfd, info, input_bfd,
 
        case MIPS_R_RVA:
          tmp = bfd_get_32 (input_bfd, mem);
-         /* printf("rva: src=%08x targ=%08x+%08x\n", src, tmp, val); */
+         /* printf ("rva: src=%08x targ=%08x+%08x\n", src, tmp, val); */
          tmp += val
-        - pe_data (input_section->output_section->owner)->pe_opthdr.ImageBase;
+           - pe_data (input_section->output_section->owner)->pe_opthdr.ImageBase;
          bfd_put_32 (input_bfd, tmp, mem);
          break;
 
@@ -980,7 +974,7 @@ const bfd_target
      bfd_getl32, bfd_getl_signed_32, bfd_putl32,
      bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* hdrs */
 
-/* Note that we allow an object file to be treated as a core file as well. */
+/* Note that we allow an object file to be treated as a core file as well.  */
     {_bfd_dummy_target, coff_object_p, /* bfd_check_format */
        bfd_generic_archive_p, coff_object_p},
     {bfd_false, coff_mkobject, _bfd_generic_mkarchive, /* bfd_set_format */
@@ -999,6 +993,6 @@ const bfd_target
      BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
 
   NULL,
-  
+
   COFF_SWAP_TABLE
 };
This page took 0.031355 seconds and 4 git commands to generate.