import gdb-2000-01-17 snapshot
[external/binutils.git] / bfd / coff-rs6000.c
index ba27ebe..6923000 100644 (file)
@@ -1,5 +1,6 @@
 /* BFD back-end for IBM RS/6000 "XCOFF" files.
-   Copyright 1990, 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
+   Copyright 1990, 91, 92, 93, 94, 95, 96, 97, 98, 1999
+   Free Software Foundation, Inc.
    FIXME: Can someone provide a transliteration of this name into ASCII?
    Using the following chars caused a compiler warning on HIUX (so I replaced
    them with octal escapes), and isn't useful without an understanding of what
@@ -31,7 +32,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 #include "bfd.h"
 #include "sysdep.h"
 #include "libbfd.h"
-#include "obstack.h"
 #include "coff/internal.h"
 #include "coff/rs6000.h"
 #include "libcoff.h"
@@ -40,6 +40,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 static boolean xcoff_mkobject PARAMS ((bfd *));
 static boolean xcoff_copy_private_bfd_data PARAMS ((bfd *, bfd *));
+static boolean xcoff_is_local_label_name PARAMS ((bfd *, const char *));
 static void xcoff_rtype2howto
   PARAMS ((arelent *, struct internal_reloc *));
 static reloc_howto_type *xcoff_reloc_type_lookup
@@ -53,6 +54,7 @@ static const char *normalize_filename PARAMS ((bfd *));
 static boolean xcoff_write_armap
   PARAMS ((bfd *, unsigned int, struct orl *, unsigned int, int));
 static boolean xcoff_write_archive_contents PARAMS ((bfd *));
+static int _bfd_xcoff_sizeof_headers PARAMS ((bfd *, boolean));
 \f
 /* We use our own tdata type.  Its first field is the COFF tdata type,
    so the COFF routines are compatible.  */
@@ -94,6 +96,7 @@ xcoff_copy_private_bfd_data (ibfd, obfd)
      bfd *obfd;
 {
   struct xcoff_tdata *ix, *ox;
+  asection *sec;
 
   if (ibfd->xvec != obfd->xvec)
     return true;
@@ -101,14 +104,26 @@ xcoff_copy_private_bfd_data (ibfd, obfd)
   ox = xcoff_data (obfd);
   ox->full_aouthdr = ix->full_aouthdr;
   ox->toc = ix->toc;
-  if (ix->toc_section == NULL)
-    ox->toc_section = NULL;
+  if (ix->sntoc == 0)
+    ox->sntoc = 0;
   else
-    ox->toc_section = ix->toc_section->output_section;
-  if (ix->entry_section == NULL)
-    ox->entry_section = NULL;
+    {
+      sec = coff_section_from_bfd_index (ibfd, ix->sntoc);
+      if (sec == NULL)
+       ox->sntoc = 0;
+      else
+       ox->sntoc = sec->output_section->target_index;
+    }
+  if (ix->snentry == 0)
+    ox->snentry = 0;
   else
-    ox->entry_section = ix->entry_section->output_section;
+    {
+      sec = coff_section_from_bfd_index (ibfd, ix->snentry);
+      if (sec == NULL)
+       ox->snentry = 0;
+      else
+       ox->snentry = sec->output_section->target_index;
+    }
   ox->text_align_power = ix->text_align_power;
   ox->data_align_power = ix->data_align_power;
   ox->modtype = ix->modtype;
@@ -117,6 +132,19 @@ xcoff_copy_private_bfd_data (ibfd, obfd)
   ox->maxstack = ix->maxstack;
   return true;
 }
+
+/* I don't think XCOFF really has a notion of local labels based on
+   name.  This will mean that ld -X doesn't actually strip anything.
+   The AIX native linker does not have a -X option, and it ignores the
+   -x option.  */
+
+static boolean
+xcoff_is_local_label_name (abfd, name)
+     bfd *abfd ATTRIBUTE_UNUSED;
+     const char *name ATTRIBUTE_UNUSED;
+{
+  return false;
+}
 \f
 /* The XCOFF reloc table.  Actually, XCOFF relocations specify the
    bitsize and whether they are signed or not, along with a
@@ -231,7 +259,7 @@ static reloc_howto_type xcoff_howto_table[] =
         0xffff,                /* dst_mask */                             
         false),                /* pcrel_offset */
   
-  { 7 },
+  EMPTY_HOWTO (7),
   
   /* Non modifiable absolute branch.  */
   HOWTO (8,                    /* type */                                 
@@ -248,7 +276,7 @@ static reloc_howto_type xcoff_howto_table[] =
         0x3fffffc,             /* dst_mask */                             
         false),                /* pcrel_offset */
   
-  { 9 },
+  EMPTY_HOWTO (9),
 
   /* Non modifiable relative branch.  */
   HOWTO (0xa,                  /* type */                                 
@@ -265,7 +293,7 @@ static reloc_howto_type xcoff_howto_table[] =
         0x3fffffc,             /* dst_mask */                             
         false),                /* pcrel_offset */
   
-  { 0xb },
+  EMPTY_HOWTO (0xb),
 
   /* Indirect load.  */
   HOWTO (0xc,                  /* type */                                 
@@ -297,7 +325,7 @@ static reloc_howto_type xcoff_howto_table[] =
         0xffff,                /* dst_mask */                             
         false),                /* pcrel_offset */
   
-  { 0xe },
+  EMPTY_HOWTO (0xe),
   
   /* Non-relocating reference.  */
   HOWTO (0xf,                  /* type */                                 
@@ -314,8 +342,8 @@ static reloc_howto_type xcoff_howto_table[] =
         0,                     /* dst_mask */                             
         false),                /* pcrel_offset */
   
-  { 0x10 },
-  { 0x11 },
+  EMPTY_HOWTO (0x10),
+  EMPTY_HOWTO (0x11),
   
   /* TOC relative indirect load.  */
   HOWTO (0x12,                 /* type */                                 
@@ -491,7 +519,7 @@ xcoff_rtype2howto (relent, internal)
 
 static reloc_howto_type *
 xcoff_reloc_type_lookup (abfd, code)
-     bfd *abfd;
+     bfd *abfd ATTRIBUTE_UNUSED;
      bfd_reloc_code_real_type code;
 {
   switch (code)
@@ -528,6 +556,7 @@ xcoff_reloc_type_lookup (abfd, code)
 
 #define coff_mkobject xcoff_mkobject
 #define coff_bfd_copy_private_bfd_data xcoff_copy_private_bfd_data
+#define coff_bfd_is_local_label_name xcoff_is_local_label_name
 #define coff_bfd_reloc_type_lookup xcoff_reloc_type_lookup
 #define coff_relocate_section _bfd_ppc_xcoff_relocate_section
 
@@ -658,6 +687,10 @@ struct xcoff_ar_hdr
    bfd_false)
 #define xcoff_truncate_arname bfd_dont_truncate_arname
 
+/* We can use the standard get_elt_at_index routine.  */
+
+#define xcoff_get_elt_at_index _bfd_generic_get_elt_at_index
+
 /* XCOFF archives do not have a timestamp.  */
 
 #define xcoff_update_armap_timestamp bfd_true
@@ -819,7 +852,7 @@ xcoff_read_ar_hdr (abfd)
     return NULL;
 
   namlen = strtol (hdr.namlen, (char **) NULL, 10);
-  hdrp = bfd_alloc (abfd, SIZEOF_AR_HDR + namlen + 1);
+  hdrp = (struct xcoff_ar_hdr *) bfd_alloc (abfd, SIZEOF_AR_HDR + namlen + 1);
   if (hdrp == NULL)
     return NULL;
   memcpy (hdrp, &hdr, SIZEOF_AR_HDR);
@@ -924,7 +957,7 @@ normalize_filename (abfd)
 static boolean
 xcoff_write_armap (abfd, elength, map, orl_count, stridx)
      bfd *abfd;
-     unsigned int elength;
+     unsigned int elength ATTRIBUTE_UNUSED;
      struct orl *map;
      unsigned int orl_count;
      int stridx;
@@ -1091,8 +1124,7 @@ xcoff_write_archive_contents (abfd)
 
          if (sub->arelt_data == NULL)
            {
-             sub->arelt_data = ((struct areltdata *)
-                                bfd_alloc (sub, sizeof (struct areltdata)));
+             sub->arelt_data = bfd_alloc (sub, sizeof (struct areltdata));
              if (sub->arelt_data == NULL)
                return false;
            }
@@ -1262,7 +1294,7 @@ xcoff_write_archive_contents (abfd)
 static int
 _bfd_xcoff_sizeof_headers (abfd, reloc)
      bfd *abfd;
-     boolean reloc;
+     boolean reloc ATTRIBUTE_UNUSED;
 {
   int size;
 
@@ -1329,6 +1361,7 @@ extern int lynx_core_file_failing_signal PARAMS ((bfd *abfd));
 #define _bfd_xcoff_bfd_get_relocated_section_contents \
   coff_bfd_get_relocated_section_contents
 #define _bfd_xcoff_bfd_relax_section coff_bfd_relax_section
+#define _bfd_xcoff_bfd_gc_sections coff_bfd_gc_sections
 #define _bfd_xcoff_bfd_link_split_section coff_bfd_link_split_section
 
 /* The transfer vector that leads the outside world to all of the above. */
@@ -1346,8 +1379,8 @@ const bfd_target
   "aixcoff-rs6000",            /* name */
 #endif
   bfd_target_coff_flavour,     
-  true,                                /* data byte order is big */
-  true,                                /* header byte order is big */
+  BFD_ENDIAN_BIG,              /* data byte order is big */
+  BFD_ENDIAN_BIG,              /* header byte order is big */
 
   (HAS_RELOC | EXEC_P |                /* object flags */
    HAS_LINENO | HAS_DEBUG | DYNAMIC |
@@ -1380,7 +1413,9 @@ const bfd_target
      BFD_JUMP_TABLE_RELOCS (coff),
      BFD_JUMP_TABLE_WRITE (coff),
      BFD_JUMP_TABLE_LINK (_bfd_xcoff),
-     BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
+     BFD_JUMP_TABLE_DYNAMIC (_bfd_xcoff),
 
-  COFF_SWAP_TABLE,
+  NULL,
+  
+  COFF_SWAP_TABLE
 };