]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
Remove powerpc PE support
authorAlan Modra <amodra@gmail.com>
Wed, 8 Jul 2020 11:51:32 +0000 (21:21 +0930)
committerAlan Modra <amodra@gmail.com>
Thu, 9 Jul 2020 13:28:16 +0000 (22:58 +0930)
Plus some leftover powerpc lynxos support.

bfd/
* coff-ppc.c: Delete.
* pe-ppc.c: Delete.
* pei-ppc.c: Delete.
* Makefile.am (BFD32_BACKENDS, BFD32_BACKENDS_CFILES): Remove PE PPC.
* coffcode.h (coff_set_arch_mach_hook, coff_set_flags): Remove
PPCMAGIC code.
(coff_write_object_contents): Remove PPC_PE code.
* config.bfd: Move powerpcle-pe to removed targets.
* configure.ac: Remove powerpc PE entries.
* libcoff-in.h (ppc_allocate_toc_section): Delete.
(ppc_process_before_allocation): Delete.
* peXXigen.c: Remove POWERPC_LE_PE code and comments.
* targets.c: Remove powerpc PE vectors.
* po/SRC-POTFILES.in: Regenerate.
* libcoff.h: Regenerate.
* Makefile.in: Regenerate.
* configure: Regenerate.
binutils/
* dlltool.c: Remove powerpc PE support and comments.
* configure.ac: Remove powerpc PE dlltool config.
* configure: Regenerate.
gas/
* config/obj-coff.h: Remove TE_PE support.
* config/tc-ppc.c: Likewise.
* config/tc-ppc.h: Likewise.
* configure.tgt: Remove powerpc PE and powerpc lynxos.
* testsuite/gas/cfi/cfi.exp (cfi-common-6): Remove powerpc PE
condition.
* testsuite/gas/macros/macros.exp: Don't xfail powerpc PE.
include/
* coff/powerpc.h: Delete.
ld/
* emulparams/ppcpe.sh: Delete.
* scripttempl/ppcpe.sc: Delete.
* emulparams/ppclynx.sh: Delete.
* Makefile.am (ALL_EMULATION_SOURCES): Remove ppc PE and lynxos.
* configure.tgt: Likewise.
* emultempl/beos.em: Remove powerpc PE support.
* emultempl/pe.em: Likewise.
* po/BLD-POTFILES.in: Regenerate.
* Makefile.in: Regenerate.

38 files changed:
bfd/ChangeLog
bfd/Makefile.am
bfd/Makefile.in
bfd/coff-ppc.c [deleted file]
bfd/coffcode.h
bfd/config.bfd
bfd/configure
bfd/configure.ac
bfd/libcoff-in.h
bfd/libcoff.h
bfd/pe-ppc.c [deleted file]
bfd/peXXigen.c
bfd/pei-ppc.c [deleted file]
bfd/po/SRC-POTFILES.in
bfd/targets.c
binutils/ChangeLog
binutils/configure
binutils/configure.ac
binutils/dlltool.c
gas/ChangeLog
gas/config/obj-coff.h
gas/config/tc-ppc.c
gas/config/tc-ppc.h
gas/configure.tgt
gas/testsuite/gas/cfi/cfi.exp
gas/testsuite/gas/macros/macros.exp
include/ChangeLog
include/coff/powerpc.h [deleted file]
ld/ChangeLog
ld/Makefile.am
ld/Makefile.in
ld/configure.tgt
ld/emulparams/ppclynx.sh [deleted file]
ld/emulparams/ppcpe.sh [deleted file]
ld/emultempl/beos.em
ld/emultempl/pe.em
ld/po/BLD-POTFILES.in
ld/scripttempl/ppcpe.sc [deleted file]

index e11c77c071296f579a049f696802f6019892c278..afbccc3fa50ef4bb7271a7e0ec255dfbb43b9964 100644 (file)
@@ -1,3 +1,23 @@
+2020-07-09  Alan Modra  <amodra@gmail.com>
+
+       * coff-ppc.c: Delete.
+       * pe-ppc.c: Delete.
+       * pei-ppc.c: Delete.
+       * Makefile.am (BFD32_BACKENDS, BFD32_BACKENDS_CFILES): Remove PE PPC.
+       * coffcode.h (coff_set_arch_mach_hook, coff_set_flags): Remove
+       PPCMAGIC code.
+       (coff_write_object_contents): Remove PPC_PE code.
+       * config.bfd: Move powerpcle-pe to removed targets.
+       * configure.ac: Remove powerpc PE entries.
+       * libcoff-in.h (ppc_allocate_toc_section): Delete.
+       (ppc_process_before_allocation): Delete.
+       * peXXigen.c: Remove POWERPC_LE_PE code and comments.
+       * targets.c: Remove powerpc PE vectors.
+       * po/SRC-POTFILES.in: Regenerate.
+       * libcoff.h: Regenerate.
+       * Makefile.in: Regenerate.
+       * configure: Regenerate.
+
 2020-07-09  Nick Clifton  <nickc@redhat.com>
 
        * po/fr.po: Updated French translation.
index c88c4480001215e757d3dd342217bec56413aa0b..f48a8e708e9a861c241a968e49f1de7c01f6482a 100644 (file)
@@ -370,14 +370,12 @@ BFD32_BACKENDS = \
        pe-arm.lo \
        pe-i386.lo \
        pe-mcore.lo \
-       pe-ppc.lo \
        pe-sh.lo \
        pef.lo \
        pei-arm-wince.lo \
        pei-arm.lo \
        pei-i386.lo \
        pei-mcore.lo \
-       pei-ppc.lo \
        pei-sh.lo \
        peigen.lo \
        plugin.lo \
@@ -505,14 +503,12 @@ BFD32_BACKENDS_CFILES = \
        pe-arm.c \
        pe-i386.c \
        pe-mcore.c \
-       pe-ppc.c \
        pe-sh.c \
        pef.c \
        pei-arm-wince.c \
        pei-arm.c \
        pei-i386.c \
        pei-mcore.c \
-       pei-ppc.c \
        pei-sh.c \
        plugin.c \
        ppcboot.c \
index d0d14c6ab32e62f6ac4603fc878f9f06ae472f79..e2dce2501ee3472e59c012066514a2e740949fd8 100644 (file)
@@ -795,14 +795,12 @@ BFD32_BACKENDS = \
        pe-arm.lo \
        pe-i386.lo \
        pe-mcore.lo \
-       pe-ppc.lo \
        pe-sh.lo \
        pef.lo \
        pei-arm-wince.lo \
        pei-arm.lo \
        pei-i386.lo \
        pei-mcore.lo \
-       pei-ppc.lo \
        pei-sh.lo \
        peigen.lo \
        plugin.lo \
@@ -930,14 +928,12 @@ BFD32_BACKENDS_CFILES = \
        pe-arm.c \
        pe-i386.c \
        pe-mcore.c \
-       pe-ppc.c \
        pe-sh.c \
        pef.c \
        pei-arm-wince.c \
        pei-arm.c \
        pei-i386.c \
        pei-mcore.c \
-       pei-ppc.c \
        pei-sh.c \
        plugin.c \
        ppcboot.c \
@@ -1544,7 +1540,6 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pe-arm.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pe-i386.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pe-mcore.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pe-ppc.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pe-sh.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pe-x86_64.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pef.Plo@am__quote@
@@ -1553,7 +1548,6 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pei-i386.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pei-ia64.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pei-mcore.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pei-ppc.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pei-sh.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pei-x86_64.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/peigen.Plo@am__quote@
diff --git a/bfd/coff-ppc.c b/bfd/coff-ppc.c
deleted file mode 100644 (file)
index a3ad1ef..0000000
+++ /dev/null
@@ -1,2582 +0,0 @@
-/* BFD back-end for PowerPC Microsoft Portable Executable files.
-   Copyright (C) 1990-2020 Free Software Foundation, Inc.
-
-   Original version pieced together by Kim Knuttila (krk@cygnus.com)
-
-   There is nothing new under the sun. This file draws a lot on other
-   coff files, in particular, those for the rs/6000, alpha, mips, and
-   intel backends, and the PE work for the arm.
-
-   This file is part of BFD, the Binary File Descriptor library.
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   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
-   Foundation, 51 Franklin Street - Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
-
-/* Current State:
-   - objdump works
-   - relocs generated by gas
-   - ld will link files, but they do not run.
-   - dlltool will not produce correct output in some .reloc cases, and will
-     not produce the right glue code for dll function calls.  */
-
-#include "sysdep.h"
-#include "bfd.h"
-#include "libbfd.h"
-
-#include "coff/powerpc.h"
-#include "coff/internal.h"
-
-#include "coff/pe.h"
-
-#ifdef BADMAG
-#undef BADMAG
-#endif
-
-#define BADMAG(x) PPCBADMAG(x)
-
-#include "libcoff.h"
-
-/* This file is compiled more than once, but we only compile the
-   final_link routine once.  */
-extern bfd_boolean ppc_bfd_coff_final_link (bfd *, struct bfd_link_info *);
-extern void dump_toc (void *);
-
-/* The toc is a set of bfd_vma fields. We use the fact that valid
-   addresses are even (i.e. the bit representing "1" is off) to allow
-   us to encode a little extra information in the field
-   - Unallocated addresses are initialized to 1.
-   - Allocated addresses are even numbers.
-   The first time we actually write a reference to the toc in the bfd,
-   we want to record that fact in a fixup file (if it is asked for), so
-   we keep track of whether or not an address has been written by marking
-   the low order bit with a "1" upon writing.  */
-
-#define SET_UNALLOCATED(x)  ((x) = 1)
-#define IS_UNALLOCATED(x)   ((x) == 1)
-
-#define IS_WRITTEN(x)       ((x) & 1)
-#define MARK_AS_WRITTEN(x)  ((x) |= 1)
-#define MAKE_ADDR_AGAIN(x)  ((x) &= ~1)
-
-/* Turn on this check if you suspect something amiss in the hash tables.  */
-#ifdef DEBUG_HASH
-
-/* Need a 7 char string for an eye catcher.  */
-#define EYE "krkjunk"
-
-#define HASH_CHECK_DCL char eye_catcher[8];
-#define HASH_CHECK_INIT(ret)      strcpy(ret->eye_catcher, EYE)
-#define HASH_CHECK(addr) \
- if (strcmp (addr->eye_catcher, EYE) != 0) \
-  { \
-    fprintf (stderr,\
-    /* xgettext: c-format */ \
-    _("File %s, line %d, Hash check failure, bad eye %8s\n"), \
-    __FILE__, __LINE__, addr->eye_catcher); \
-    abort (); \
- }
-
-#else
-
-#define HASH_CHECK_DCL
-#define HASH_CHECK_INIT(ret)
-#define HASH_CHECK(addr)
-
-#endif
-
-/* In order not to add an int to every hash table item for every coff
-   linker, we define our own hash table, derived from the coff one.  */
-
-/* PE linker hash table entries.  */
-
-struct ppc_coff_link_hash_entry
-{
-  struct coff_link_hash_entry root; /* First entry, as required.  */
-
-  /* As we wonder around the relocs, we'll keep the assigned toc_offset
-     here.  */
-  bfd_vma toc_offset;              /* Our addition, as required.  */
-  int symbol_is_glue;
-  unsigned long int glue_insn;
-
-  HASH_CHECK_DCL
-};
-
-/* PE linker hash table.  */
-
-struct ppc_coff_link_hash_table
-{
-  struct coff_link_hash_table root; /* First entry, as required.  */
-};
-
-/* Routine to create an entry in the link hash table.  */
-
-static struct bfd_hash_entry *
-ppc_coff_link_hash_newfunc (struct bfd_hash_entry * entry,
-                           struct bfd_hash_table * table,
-                           const char * string)
-{
-  struct ppc_coff_link_hash_entry *ret =
-    (struct ppc_coff_link_hash_entry *) entry;
-
-  /* Allocate the structure if it has not already been allocated by a
-     subclass.  */
-  if (ret == (struct ppc_coff_link_hash_entry *) NULL)
-    ret = (struct ppc_coff_link_hash_entry *)
-      bfd_hash_allocate (table,
-                        sizeof (struct ppc_coff_link_hash_entry));
-
-  if (ret == (struct ppc_coff_link_hash_entry *) NULL)
-    return NULL;
-
-  /* Call the allocation method of the superclass.  */
-  ret = ((struct ppc_coff_link_hash_entry *)
-        _bfd_coff_link_hash_newfunc ((struct bfd_hash_entry *) ret,
-                                     table, string));
-
-  if (ret)
-    {
-      /* Initialize the local fields.  */
-      SET_UNALLOCATED (ret->toc_offset);
-      ret->symbol_is_glue = 0;
-      ret->glue_insn = 0;
-
-      HASH_CHECK_INIT (ret);
-    }
-
-  return (struct bfd_hash_entry *) ret;
-}
-
-/* Initialize a PE linker hash table.  */
-
-static bfd_boolean
-ppc_coff_link_hash_table_init (struct ppc_coff_link_hash_table *table,
-                              bfd *abfd,
-                              struct bfd_hash_entry *(*newfunc)
-                                (struct bfd_hash_entry *,
-                                 struct bfd_hash_table *,
-                                 const char *),
-                              unsigned int entsize)
-{
-  return _bfd_coff_link_hash_table_init (&table->root, abfd, newfunc, entsize);
-}
-
-/* Create a PE linker hash table.  */
-
-static struct bfd_link_hash_table *
-ppc_coff_link_hash_table_create (bfd *abfd)
-{
-  struct ppc_coff_link_hash_table *ret;
-  size_t amt = sizeof (struct ppc_coff_link_hash_table);
-
-  ret = (struct ppc_coff_link_hash_table *) bfd_malloc (amt);
-  if (ret == NULL)
-    return NULL;
-  if (!ppc_coff_link_hash_table_init (ret, abfd,
-                                     ppc_coff_link_hash_newfunc,
-                                     sizeof (struct ppc_coff_link_hash_entry)))
-    {
-      free (ret);
-      return (struct bfd_link_hash_table *) NULL;
-    }
-  return &ret->root.root;
-}
-
-/* Now, tailor coffcode.h to use our hash stuff.  */
-
-#define coff_bfd_link_hash_table_create ppc_coff_link_hash_table_create
-\f
-/* The nt loader points the toc register to &toc + 32768, in order to
-   use the complete range of a 16-bit displacement. We have to adjust
-   for this when we fix up loads displaced off the toc reg.  */
-#define TOC_LOAD_ADJUSTMENT (-32768)
-#define TOC_SECTION_NAME ".private.toc"
-
-/* The main body of code is in coffcode.h.  */
-
-#define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (3)
-
-/* In case we're on a 32-bit machine, construct a 64-bit "-1" value
-   from smaller values.  Start with zero, widen, *then* decrement.  */
-#define MINUS_ONE      (((bfd_vma)0) - 1)
-
-/* These should definitely go in a header file somewhere...  */
-
-/* NOP */
-#define IMAGE_REL_PPC_ABSOLUTE         0x0000
-
-/* 64-bit address */
-#define IMAGE_REL_PPC_ADDR64           0x0001
-
-/* 32-bit address */
-#define IMAGE_REL_PPC_ADDR32           0x0002
-
-/* 26-bit address, shifted left 2 (branch absolute) */
-#define IMAGE_REL_PPC_ADDR24           0x0003
-
-/* 16-bit address */
-#define IMAGE_REL_PPC_ADDR16           0x0004
-
-/* 16-bit address, shifted left 2 (load doubleword) */
-#define IMAGE_REL_PPC_ADDR14           0x0005
-
-/* 26-bit PC-relative offset, shifted left 2 (branch relative) */
-#define IMAGE_REL_PPC_REL24            0x0006
-
-/* 16-bit PC-relative offset, shifted left 2 (br cond relative) */
-#define IMAGE_REL_PPC_REL14            0x0007
-
-/* 16-bit offset from TOC base */
-#define IMAGE_REL_PPC_TOCREL16         0x0008
-
-/* 16-bit offset from TOC base, shifted left 2 (load doubleword) */
-#define IMAGE_REL_PPC_TOCREL14         0x0009
-
-/* 32-bit addr w/o image base */
-#define IMAGE_REL_PPC_ADDR32NB         0x000A
-
-/* va of containing section (as in an image sectionhdr) */
-#define IMAGE_REL_PPC_SECREL           0x000B
-
-/* sectionheader number */
-#define IMAGE_REL_PPC_SECTION          0x000C
-
-/* substitute TOC restore instruction iff symbol is glue code */
-#define IMAGE_REL_PPC_IFGLUE           0x000D
-
-/* symbol is glue code; virtual address is TOC restore instruction */
-#define IMAGE_REL_PPC_IMGLUE           0x000E
-
-/* va of containing section (limited to 16 bits) */
-#define IMAGE_REL_PPC_SECREL16         0x000F
-
-/* Stuff to handle immediate data when the number of bits in the
-   data is greater than the number of bits in the immediate field
-   We need to do (usually) 32 bit arithmetic on 16 bit chunks.  */
-#define IMAGE_REL_PPC_REFHI            0x0010
-#define IMAGE_REL_PPC_REFLO            0x0011
-#define IMAGE_REL_PPC_PAIR             0x0012
-
-/* This is essentially the same as tocrel16, with TOCDEFN assumed.  */
-#define IMAGE_REL_PPC_TOCREL16_DEFN    0x0013
-
-/* Flag bits in IMAGE_RELOCATION.TYPE.  */
-
-/* Subtract reloc value rather than adding it.  */
-#define IMAGE_REL_PPC_NEG              0x0100
-
-/* Fix branch prediction bit to predict branch taken.  */
-#define IMAGE_REL_PPC_BRTAKEN          0x0200
-
-/* Fix branch prediction bit to predict branch not taken.  */
-#define IMAGE_REL_PPC_BRNTAKEN         0x0400
-
-/* TOC slot defined in file (or, data in toc).  */
-#define IMAGE_REL_PPC_TOCDEFN          0x0800
-
-/* Masks to isolate above values in IMAGE_RELOCATION.Type.  */
-#define IMAGE_REL_PPC_TYPEMASK         0x00FF
-#define IMAGE_REL_PPC_FLAGMASK         0x0F00
-
-#define EXTRACT_TYPE(x)                        ((x) & IMAGE_REL_PPC_TYPEMASK)
-#define EXTRACT_FLAGS(x) ((x) & IMAGE_REL_PPC_FLAGMASK)
-#define EXTRACT_JUNK(x)         \
-          ((x) & ~(IMAGE_REL_PPC_TYPEMASK | IMAGE_REL_PPC_FLAGMASK))
-\f
-/* Static helper functions to make relocation work.  */
-/* (Work In Progress) */
-
-static bfd_reloc_status_type ppc_refhi_reloc
-  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
-static bfd_reloc_status_type ppc_pair_reloc
-  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
-static bfd_reloc_status_type ppc_toc16_reloc
-  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
-static bfd_reloc_status_type ppc_section_reloc
-  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
-static bfd_reloc_status_type ppc_secrel_reloc
-  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
-static bfd_reloc_status_type ppc_imglue_reloc
-  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
-
-/* FIXME: It'll take a while to get through all of these. I only need a few to
-   get us started, so those I'll make sure work. Those marked FIXME are either
-   completely unverified or have a specific unknown marked in the comment.  */
-
-/* Relocation entries for Windows/NT on PowerPC.
-
-   From the document "" we find the following listed as used relocs:
-
-     ABSOLUTE      : The noop
-     ADDR[64|32|16] : fields that hold addresses in data fields or the
-                     16 bit displacement field on a load/store.
-     ADDR[24|14]    : fields that hold addresses in branch and cond
-                     branches. These represent [26|16] bit addresses.
-                     The low order 2 bits are preserved.
-     REL[24|14]            : branches relative to the Instruction Address
-                     register. These represent [26|16] bit addresses,
-                     as before. The instruction field will be zero, and
-                     the address of the SYM will be inserted at link time.
-     TOCREL16      : 16 bit displacement field referring to a slot in
-                     toc.
-     TOCREL14      : 16 bit displacement field, similar to REL14 or ADDR14.
-     ADDR32NB      : 32 bit address relative to the virtual origin.
-                     (On the alpha, this is always a linker generated thunk)
-                     (i.e. 32bit addr relative to the image base)
-     SECREL        : The value is relative to the start of the section
-                     containing the symbol.
-     SECTION       : access to the header containing the item. Supports the
-                     codeview debugger.
-
-   In particular, note that the document does not indicate that the
-   relocations listed in the header file are used.  */
-
-
-static reloc_howto_type ppc_coff_howto_table[] =
-{
-  /* IMAGE_REL_PPC_ABSOLUTE 0x0000   NOP */
-  /* Unused: */
-  HOWTO (IMAGE_REL_PPC_ABSOLUTE, /* type */
-        0,                     /* rightshift */
-        0,                     /* size (0 = byte, 1 = short, 2 = long) */
-        0,                     /* bitsize */
-        FALSE,                 /* pc_relative */
-        0,                     /* bitpos */
-        complain_overflow_dont, /* dont complain_on_overflow */
-        0,                     /* special_function */
-        "ABSOLUTE",            /* name */
-        FALSE,                 /* partial_inplace */
-        0x00,                  /* src_mask */
-        0x00,                  /* dst_mask */
-        FALSE),                /* pcrel_offset */
-
-  /* IMAGE_REL_PPC_ADDR64 0x0001  64-bit address */
-  /* Unused: */
-  HOWTO(IMAGE_REL_PPC_ADDR64,  /* type */
-       0,                      /* rightshift */
-       3,                      /* size (0 = byte, 1 = short, 2 = long) */
-       64,                     /* bitsize */
-       FALSE,                  /* pc_relative */
-       0,                      /* bitpos */
-       complain_overflow_bitfield, /* complain_on_overflow */
-       0,                      /* special_function */
-       "ADDR64",               /* name */
-       TRUE,                   /* partial_inplace */
-       MINUS_ONE,              /* src_mask */
-       MINUS_ONE,              /* dst_mask */
-       FALSE),                 /* pcrel_offset */
-
-  /* IMAGE_REL_PPC_ADDR32 0x0002  32-bit address */
-  /* Used: */
-  HOWTO (IMAGE_REL_PPC_ADDR32, /* type */
-        0,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
-        32,                    /* bitsize */
-        FALSE,                 /* pc_relative */
-        0,                     /* bitpos */
-        complain_overflow_bitfield, /* complain_on_overflow */
-        0,                     /* special_function */
-        "ADDR32",              /* name */
-        TRUE,                  /* partial_inplace */
-        0xffffffff,            /* src_mask */
-        0xffffffff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
-
-  /* IMAGE_REL_PPC_ADDR24 0x0003  26-bit address, shifted left 2 (branch absolute) */
-  /* the LI field is in bit 6 through bit 29 is 24 bits, + 2 for the shift */
-  /* Of course, That's the IBM approved bit numbering, which is not what */
-  /* anyone else uses.... The li field is in bit 2 thru 25 */
-  /* Used: */
-  HOWTO (IMAGE_REL_PPC_ADDR24, /* type */
-        0,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
-        26,                    /* bitsize */
-        FALSE,                 /* pc_relative */
-        0,                     /* bitpos */
-        complain_overflow_bitfield, /* complain_on_overflow */
-        0,                     /* special_function */
-        "ADDR24",              /* name */
-        TRUE,                  /* partial_inplace */
-        0x07fffffc,            /* src_mask */
-        0x07fffffc,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
-
-  /* IMAGE_REL_PPC_ADDR16 0x0004  16-bit address */
-  /* Used: */
-  HOWTO (IMAGE_REL_PPC_ADDR16, /* type */
-        0,                     /* rightshift */
-        1,                     /* size (0 = byte, 1 = short, 2 = long) */
-        16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
-        0,                     /* bitpos */
-        complain_overflow_signed, /* complain_on_overflow */
-        0,                     /* special_function */
-        "ADDR16",              /* name */
-        TRUE,                  /* partial_inplace */
-        0xffff,                /* src_mask */
-        0xffff,                /* dst_mask */
-        FALSE),                /* pcrel_offset */
-
-  /* IMAGE_REL_PPC_ADDR14 0x0005 */
-  /*  16-bit address, shifted left 2 (load doubleword) */
-  /* FIXME: the mask is likely wrong, and the bit position may be as well */
-  /* Unused: */
-  HOWTO (IMAGE_REL_PPC_ADDR14, /* type */
-        1,                     /* rightshift */
-        1,                     /* size (0 = byte, 1 = short, 2 = long) */
-        16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
-        0,                     /* bitpos */
-        complain_overflow_signed, /* complain_on_overflow */
-        0,                     /* special_function */
-        "ADDR16",              /* name */
-        TRUE,                  /* partial_inplace */
-        0xffff,                /* src_mask */
-        0xffff,                /* dst_mask */
-        FALSE),                /* pcrel_offset */
-
-  /* IMAGE_REL_PPC_REL24 0x0006 */
-  /*   26-bit PC-relative offset, shifted left 2 (branch relative) */
-  /* Used: */
-  HOWTO (IMAGE_REL_PPC_REL24,  /* type */
-        0,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
-        26,                    /* bitsize */
-        TRUE,                  /* pc_relative */
-        0,                     /* bitpos */
-        complain_overflow_signed, /* complain_on_overflow */
-        0,                     /* special_function */
-        "REL24",               /* name */
-        TRUE,                  /* partial_inplace */
-        0x3fffffc,             /* src_mask */
-        0x3fffffc,             /* dst_mask */
-        FALSE),                /* pcrel_offset */
-
-  /* IMAGE_REL_PPC_REL14 0x0007 */
-  /*   16-bit PC-relative offset, shifted left 2 (br cond relative) */
-  /* FIXME: the mask is likely wrong, and the bit position may be as well */
-  /* FIXME: how does it know how far to shift? */
-  /* Unused: */
-  HOWTO (IMAGE_REL_PPC_ADDR14, /* type */
-        1,                     /* rightshift */
-        1,                     /* size (0 = byte, 1 = short, 2 = long) */
-        16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
-        0,                     /* bitpos */
-        complain_overflow_signed, /* complain_on_overflow */
-        0,                     /* special_function */
-        "ADDR16",              /* name */
-        TRUE,                  /* partial_inplace */
-        0xffff,                /* src_mask */
-        0xffff,                /* dst_mask */
-        TRUE),                 /* pcrel_offset */
-
-  /* IMAGE_REL_PPC_TOCREL16 0x0008 */
-  /*   16-bit offset from TOC base */
-  /* Used: */
-  HOWTO (IMAGE_REL_PPC_TOCREL16,/* type */
-        0,                     /* rightshift */
-        1,                     /* size (0 = byte, 1 = short, 2 = long) */
-        16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
-        0,                     /* bitpos */
-        complain_overflow_dont, /* complain_on_overflow */
-        ppc_toc16_reloc,       /* special_function */
-        "TOCREL16",            /* name */
-        FALSE,                 /* partial_inplace */
-        0xffff,                /* src_mask */
-        0xffff,                /* dst_mask */
-        FALSE),                /* pcrel_offset */
-
-  /* IMAGE_REL_PPC_TOCREL14 0x0009 */
-  /*   16-bit offset from TOC base, shifted left 2 (load doubleword) */
-  /* Unused: */
-  HOWTO (IMAGE_REL_PPC_TOCREL14,/* type */
-        1,                     /* rightshift */
-        1,                     /* size (0 = byte, 1 = short, 2 = long) */
-        16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
-        0,                     /* bitpos */
-        complain_overflow_signed, /* complain_on_overflow */
-        0,                     /* special_function */
-        "TOCREL14",            /* name */
-        FALSE,                 /* partial_inplace */
-        0xffff,                /* src_mask */
-        0xffff,                /* dst_mask */
-        FALSE),                /* pcrel_offset */
-
-  /* IMAGE_REL_PPC_ADDR32NB 0x000A */
-  /*   32-bit addr w/ image base */
-  /* Unused: */
-  HOWTO (IMAGE_REL_PPC_ADDR32NB,/* type */
-        0,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
-        32,                    /* bitsize */
-        FALSE,                 /* pc_relative */
-        0,                     /* bitpos */
-        complain_overflow_signed, /* complain_on_overflow */
-        0,                     /* special_function */
-        "ADDR32NB",            /* name */
-        TRUE,                  /* partial_inplace */
-        0xffffffff,            /* src_mask */
-        0xffffffff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
-
-  /* IMAGE_REL_PPC_SECREL 0x000B */
-  /*   va of containing section (as in an image sectionhdr) */
-  /* Unused: */
-  HOWTO (IMAGE_REL_PPC_SECREL,/* type */
-        0,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
-        32,                    /* bitsize */
-        FALSE,                 /* pc_relative */
-        0,                     /* bitpos */
-        complain_overflow_signed, /* complain_on_overflow */
-        ppc_secrel_reloc,      /* special_function */
-        "SECREL",              /* name */
-        TRUE,                  /* partial_inplace */
-        0xffffffff,            /* src_mask */
-        0xffffffff,            /* dst_mask */
-        TRUE),                 /* pcrel_offset */
-
-  /* IMAGE_REL_PPC_SECTION 0x000C */
-  /*   sectionheader number */
-  /* Unused: */
-  HOWTO (IMAGE_REL_PPC_SECTION,/* type */
-        0,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
-        32,                    /* bitsize */
-        FALSE,                 /* pc_relative */
-        0,                     /* bitpos */
-        complain_overflow_signed, /* complain_on_overflow */
-        ppc_section_reloc,     /* special_function */
-        "SECTION",             /* name */
-        TRUE,                  /* partial_inplace */
-        0xffffffff,            /* src_mask */
-        0xffffffff,            /* dst_mask */
-        TRUE),                 /* pcrel_offset */
-
-  /* IMAGE_REL_PPC_IFGLUE 0x000D */
-  /*   substitute TOC restore instruction iff symbol is glue code */
-  /* Used: */
-  HOWTO (IMAGE_REL_PPC_IFGLUE,/* type */
-        0,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
-        32,                    /* bitsize */
-        FALSE,                 /* pc_relative */
-        0,                     /* bitpos */
-        complain_overflow_signed, /* complain_on_overflow */
-        0,                     /* special_function */
-        "IFGLUE",              /* name */
-        TRUE,                  /* partial_inplace */
-        0xffffffff,            /* src_mask */
-        0xffffffff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
-
-  /* IMAGE_REL_PPC_IMGLUE 0x000E */
-  /*   symbol is glue code; virtual address is TOC restore instruction */
-  /* Unused: */
-  HOWTO (IMAGE_REL_PPC_IMGLUE,/* type */
-        0,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
-        32,                    /* bitsize */
-        FALSE,                 /* pc_relative */
-        0,                     /* bitpos */
-        complain_overflow_dont, /* complain_on_overflow */
-        ppc_imglue_reloc,      /* special_function */
-        "IMGLUE",              /* name */
-        FALSE,                 /* partial_inplace */
-        0xffffffff,            /* src_mask */
-        0xffffffff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
-
-  /* IMAGE_REL_PPC_SECREL16 0x000F */
-  /*   va of containing section (limited to 16 bits) */
-  /* Unused: */
-  HOWTO (IMAGE_REL_PPC_SECREL16,/* type */
-        0,                     /* rightshift */
-        1,                     /* size (0 = byte, 1 = short, 2 = long) */
-        16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
-        0,                     /* bitpos */
-        complain_overflow_signed, /* complain_on_overflow */
-        0,                     /* special_function */
-        "SECREL16",            /* name */
-        TRUE,                  /* partial_inplace */
-        0xffff,                /* src_mask */
-        0xffff,                /* dst_mask */
-        TRUE),                 /* pcrel_offset */
-
-  /* IMAGE_REL_PPC_REFHI            0x0010 */
-  /* Unused: */
-  HOWTO (IMAGE_REL_PPC_REFHI,  /* type */
-        0,                     /* rightshift */
-        1,                     /* size (0 = byte, 1 = short, 2 = long) */
-        16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
-        0,                     /* bitpos */
-        complain_overflow_signed, /* complain_on_overflow */
-        ppc_refhi_reloc,       /* special_function */
-        "REFHI",               /* name */
-        TRUE,                  /* partial_inplace */
-        0xffffffff,            /* src_mask */
-        0xffffffff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
-
-  /* IMAGE_REL_PPC_REFLO            0x0011 */
-  /* Unused: */
-  HOWTO (IMAGE_REL_PPC_REFLO,  /* type */
-        0,                     /* rightshift */
-        1,                     /* size (0 = byte, 1 = short, 2 = long) */
-        16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
-        0,                     /* bitpos */
-        complain_overflow_signed, /* complain_on_overflow */
-        ppc_refhi_reloc,       /* special_function */
-        "REFLO",               /* name */
-        TRUE,                  /* partial_inplace */
-        0xffffffff,            /* src_mask */
-        0xffffffff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
-
-  /* IMAGE_REL_PPC_PAIR                     0x0012 */
-  /* Unused: */
-  HOWTO (IMAGE_REL_PPC_PAIR,   /* type */
-        0,                     /* rightshift */
-        1,                     /* size (0 = byte, 1 = short, 2 = long) */
-        16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
-        0,                     /* bitpos */
-        complain_overflow_signed, /* complain_on_overflow */
-        ppc_pair_reloc,        /* special_function */
-        "PAIR",                /* name */
-        TRUE,                  /* partial_inplace */
-        0xffffffff,            /* src_mask */
-        0xffffffff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
-
-  /* IMAGE_REL_PPC_TOCREL16_DEFN 0x0013 */
-  /*   16-bit offset from TOC base, without causing a definition */
-  /* Used: */
-  HOWTO ( (IMAGE_REL_PPC_TOCREL16 | IMAGE_REL_PPC_TOCDEFN), /* type */
-        0,                     /* rightshift */
-        1,                     /* size (0 = byte, 1 = short, 2 = long) */
-        16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
-        0,                     /* bitpos */
-        complain_overflow_dont, /* complain_on_overflow */
-        0,                     /* special_function */
-        "TOCREL16, TOCDEFN",   /* name */
-        FALSE,                 /* partial_inplace */
-        0xffff,                /* src_mask */
-        0xffff,                /* dst_mask */
-        FALSE),                /* pcrel_offset */
-
-};
-\f
-/* Some really cheezy macros that can be turned on to test stderr :-)  */
-
-#ifdef DEBUG_RELOC
-#define UN_IMPL(x)                                          \
-{                                                           \
-   static int i;                                            \
-   if (i == 0)                                              \
-     {                                                      \
-       i = 1;                                               \
-       fprintf (stderr,_("Unimplemented Relocation -- %s\n"),x); \
-     }                                                      \
-}
-
-#define DUMP_RELOC(n,r)                                     \
-{                                                   \
-   fprintf (stderr,"%s sym %d, addr %d, addend %d\n", \
-          n, (*(r->sym_ptr_ptr))->name,             \
-          r->address, r->addend);                   \
-}
-
-/* Given a reloc name, n, and a pointer to an internal_reloc,
-   dump out interesting information on the contents
-
-#define n_name         _n._n_name
-#define n_zeroes       _n._n_n._n_zeroes
-#define n_offset       _n._n_n._n_offset  */
-
-#define DUMP_RELOC2(n,r)                               \
-{                                                      \
-   fprintf (stderr,"%s sym %d, r_vaddr %d %s\n",       \
-          n, r->r_symndx, r->r_vaddr,                  \
-          (((r->r_type) & IMAGE_REL_PPC_TOCDEFN) == 0) \
-          ?" ":" TOCDEFN"  );                          \
-}
-
-#else
-#define UN_IMPL(x)
-#define DUMP_RELOC(n,r)
-#define DUMP_RELOC2(n,r)
-#endif
-\f
-/* TOC construction and management routines.  */
-
-/* This file is compiled twice, and these variables are defined in one
-   of the compilations.  FIXME: This is confusing and weird.  Also,
-   BFD should not use global variables.  */
-extern bfd *    bfd_of_toc_owner;
-extern long int global_toc_size;
-extern long int import_table_size;
-extern long int first_thunk_address;
-extern long int thunk_size;
-
-enum toc_type
-{
-  default_toc,
-  toc_32,
-  toc_64
-};
-
-enum ref_category
-{
-  priv,
-  pub,
-  tocdata
-};
-
-struct list_ele
-{
-  struct list_ele *next;
-  bfd_vma addr;
-  enum ref_category cat;
-  int offset;
-  const char *name;
-};
-
-extern struct list_ele *head;
-extern struct list_ele *tail;
-
-static void
-record_toc (asection *toc_section,
-           bfd_signed_vma our_toc_offset,
-           enum ref_category cat,
-           const char *name)
-{
-  /* Add this entry to our toc addr-offset-name list.  */
-  size_t amt = sizeof (struct list_ele);
-  struct list_ele *t = (struct list_ele *) bfd_malloc (amt);
-
-  if (t == NULL)
-    abort ();
-  t->next = 0;
-  t->offset = our_toc_offset;
-  t->name = name;
-  t->cat = cat;
-  t->addr = toc_section->output_offset + our_toc_offset;
-
-  if (head == 0)
-    {
-      head = t;
-      tail = t;
-    }
-  else
-    {
-      tail->next = t;
-      tail = t;
-    }
-}
-
-#ifdef COFF_IMAGE_WITH_PE
-
-/* Record a toc offset against a symbol.  */
-static bfd_boolean
-ppc_record_toc_entry (bfd *abfd,
-                     struct bfd_link_info *info ATTRIBUTE_UNUSED,
-                     asection *sec ATTRIBUTE_UNUSED,
-                     int sym,
-                     enum toc_type toc_kind ATTRIBUTE_UNUSED)
-{
-  struct ppc_coff_link_hash_entry *h;
-  int *local_syms;
-
-  h = 0;
-
-  h = (struct ppc_coff_link_hash_entry *) (obj_coff_sym_hashes (abfd)[sym]);
-  if (h != 0)
-    {
-      HASH_CHECK(h);
-    }
-
-  if (h == 0)
-    {
-      local_syms = obj_coff_local_toc_table(abfd);
-
-      if (local_syms == 0)
-       {
-         unsigned int i;
-         bfd_size_type amt;
-
-         /* allocate a table */
-         amt = (bfd_size_type) obj_raw_syment_count (abfd) * sizeof (int);
-         local_syms = (int *) bfd_zalloc (abfd, amt);
-         if (local_syms == 0)
-           return FALSE;
-         obj_coff_local_toc_table (abfd) = local_syms;
-
-         for (i = 0; i < obj_raw_syment_count (abfd); ++i)
-           {
-             SET_UNALLOCATED (local_syms[i]);
-           }
-       }
-
-      if (IS_UNALLOCATED(local_syms[sym]))
-       {
-         local_syms[sym] = global_toc_size;
-         global_toc_size += 4;
-
-         /* The size must fit in a 16-bit displacement.  */
-         if (global_toc_size > 65535)
-           {
-             _bfd_error_handler (_("TOC overflow"));
-             bfd_set_error (bfd_error_file_too_big);
-             return FALSE;
-           }
-       }
-    }
-  else
-    {
-      /* Check to see if there's a toc slot allocated. If not, do it
-        here. It will be used in relocate_section.  */
-      if (IS_UNALLOCATED(h->toc_offset))
-       {
-         h->toc_offset = global_toc_size;
-         global_toc_size += 4;
-
-         /* The size must fit in a 16-bit displacement.  */
-         if (global_toc_size >= 65535)
-           {
-             _bfd_error_handler (_("TOC overflow"));
-             bfd_set_error (bfd_error_file_too_big);
-             return FALSE;
-           }
-       }
-    }
-
-  return TRUE;
-}
-
-/* Record a toc offset against a symbol.  */
-static void
-ppc_mark_symbol_as_glue (bfd *abfd,
-                        int sym,
-                        struct internal_reloc *rel)
-{
-  struct ppc_coff_link_hash_entry *h;
-
-  h = (struct ppc_coff_link_hash_entry *) (obj_coff_sym_hashes (abfd)[sym]);
-
-  HASH_CHECK(h);
-
-  h->symbol_is_glue = 1;
-  h->glue_insn = bfd_get_32 (abfd, (bfd_byte *) &rel->r_vaddr);
-
-  return;
-}
-
-#endif /* COFF_IMAGE_WITH_PE */
-\f
-/* Return TRUE if this relocation should
-   appear in the output .reloc section.  */
-
-static bfd_boolean
-in_reloc_p (bfd * abfd ATTRIBUTE_UNUSED,
-           reloc_howto_type *howto)
-{
-  return
-    (! howto->pc_relative)
-      && (howto->type != IMAGE_REL_PPC_ADDR32NB)
-      && (howto->type != IMAGE_REL_PPC_TOCREL16)
-      && (howto->type != IMAGE_REL_PPC_IMGLUE)
-      && (howto->type != IMAGE_REL_PPC_IFGLUE)
-      && (howto->type != IMAGE_REL_PPC_SECREL)
-      && (howto->type != IMAGE_REL_PPC_SECTION)
-      && (howto->type != IMAGE_REL_PPC_SECREL16)
-      && (howto->type != IMAGE_REL_PPC_REFHI)
-      && (howto->type != IMAGE_REL_PPC_REFLO)
-      && (howto->type != IMAGE_REL_PPC_PAIR)
-      && (howto->type != IMAGE_REL_PPC_TOCREL16_DEFN) ;
-}
-
-static bfd_boolean
-write_base_file_entry (bfd *obfd, struct bfd_link_info *info, bfd_vma addr)
-{
-  if (coff_data (obfd)->pe)
-     addr -= pe_data (obfd)->pe_opthdr.ImageBase;
-  if (fwrite (&addr, sizeof (addr), 1, (FILE *) info->base_file) == 1)
-    return TRUE;
-
-  bfd_set_error (bfd_error_system_call);
-  return FALSE;
-}
-
-/* The reloc processing routine for the optimized COFF linker.  */
-
-static bfd_boolean
-coff_ppc_relocate_section (bfd *output_bfd,
-                          struct bfd_link_info *info,
-                          bfd *input_bfd,
-                          asection *input_section,
-                          bfd_byte *contents,
-                          struct internal_reloc *relocs,
-                          struct internal_syment *syms,
-                          asection **sections)
-{
-  struct internal_reloc *rel;
-  struct internal_reloc *relend;
-  asection *toc_section = 0;
-  bfd_vma relocation;
-  reloc_howto_type *howto = 0;
-
-  /* If we are performing a relocatable link, we don't need to do a
-     thing.  The caller will take care of adjusting the reloc
-     addresses and symbol indices.  */
-  if (bfd_link_relocatable (info))
-    return TRUE;
-
-  rel = relocs;
-  relend = rel + input_section->reloc_count;
-  for (; rel < relend; rel++)
-    {
-      long symndx;
-      struct ppc_coff_link_hash_entry *h;
-      struct internal_syment *sym;
-      bfd_vma val;
-
-      asection *sec;
-      bfd_reloc_status_type rstat;
-      bfd_byte *loc;
-
-      unsigned short r_type  = EXTRACT_TYPE (rel->r_type);
-      unsigned short r_flags = EXTRACT_FLAGS(rel->r_type);
-
-      symndx = rel->r_symndx;
-      loc = contents + rel->r_vaddr - input_section->vma;
-
-      /* FIXME: check bounds on r_type */
-      howto = ppc_coff_howto_table + r_type;
-
-      if (symndx == -1)
-       {
-         h = NULL;
-         sym = NULL;
-       }
-      else
-       {
-         h = (struct ppc_coff_link_hash_entry *)
-           (obj_coff_sym_hashes (input_bfd)[symndx]);
-         if (h != 0)
-           {
-             HASH_CHECK(h);
-           }
-
-         sym = syms + symndx;
-       }
-
-      if (r_type == IMAGE_REL_PPC_IMGLUE && h == 0)
-       {
-         /* An IMGLUE reloc must have a name. Something is very wrong.  */
-         abort ();
-       }
-
-      sec = NULL;
-      val = 0;
-
-      /* FIXME: PAIR unsupported in the following code.  */
-      if (h == NULL)
-       {
-         if (symndx == -1)
-           sec = bfd_abs_section_ptr;
-         else
-           {
-             sec = sections[symndx];
-             val = (sec->output_section->vma
-                    + sec->output_offset
-                    + sym->n_value);
-             if (! obj_pe (output_bfd))
-               val -= sec->vma;
-           }
-       }
-      else
-       {
-         HASH_CHECK(h);
-
-         if (h->root.root.type == bfd_link_hash_defined
-             || h->root.root.type == bfd_link_hash_defweak)
-           {
-             sec = h->root.root.u.def.section;
-             val = (h->root.root.u.def.value
-                    + sec->output_section->vma
-                    + sec->output_offset);
-           }
-         else
-           (*info->callbacks->undefined_symbol)
-             (info, h->root.root.root.string, input_bfd, input_section,
-              rel->r_vaddr - input_section->vma, TRUE);
-       }
-
-      rstat = bfd_reloc_ok;
-
-      /* Each case must do its own relocation, setting rstat appropriately.  */
-      switch (r_type)
-       {
-       default:
-         /* xgettext: c-format */
-         _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
-                             input_bfd, r_type);
-         bfd_set_error (bfd_error_bad_value);
-         return FALSE;
-       case IMAGE_REL_PPC_TOCREL16:
-         {
-           bfd_signed_vma our_toc_offset;
-           int fixit;
-
-           DUMP_RELOC2(howto->name, rel);
-
-           if (toc_section == 0)
-             {
-               toc_section = bfd_get_section_by_name (bfd_of_toc_owner,
-                                                      TOC_SECTION_NAME);
-
-               if ( toc_section == NULL )
-                 {
-                   /* There is no toc section. Something is very wrong.  */
-                   abort ();
-                 }
-             }
-
-           /* Amazing bit tricks present. As we may have seen earlier, we
-              use the 1 bit to tell us whether or not a toc offset has been
-              allocated. Now that they've all been allocated, we will use
-              the 1 bit to tell us if we've written this particular toc
-              entry out.  */
-           fixit = FALSE;
-           if (h == 0)
-             {
-               /* It is a file local symbol.  */
-               int *local_toc_table;
-               char name[SYMNMLEN + 1];
-
-               sym = syms + symndx;
-               strncpy (name, sym->_n._n_name, SYMNMLEN);
-               name[SYMNMLEN] = '\0';
-
-               local_toc_table = obj_coff_local_toc_table(input_bfd);
-               our_toc_offset = local_toc_table[symndx];
-
-               if (IS_WRITTEN(our_toc_offset))
-                 {
-                   /* If it has been written out, it is marked with the
-                      1 bit. Fix up our offset, but do not write it out
-                      again.  */
-                   MAKE_ADDR_AGAIN(our_toc_offset);
-                 }
-               else
-                 {
-                   /* Write out the toc entry.  */
-                   record_toc (toc_section, our_toc_offset, priv,
-                               strdup (name));
-
-                   bfd_put_32 (output_bfd, val,
-                              toc_section->contents + our_toc_offset);
-
-                   MARK_AS_WRITTEN(local_toc_table[symndx]);
-                   fixit = TRUE;
-                 }
-             }
-           else
-             {
-               const char *name = h->root.root.root.string;
-               our_toc_offset = h->toc_offset;
-
-               if ((r_flags & IMAGE_REL_PPC_TOCDEFN)
-                   == IMAGE_REL_PPC_TOCDEFN )
-                 {
-                   /* This is unbelievable cheese. Some knowledgable asm
-                      hacker has decided to use r2 as a base for loading
-                      a value. He/She does this by setting the tocdefn bit,
-                      and not supplying a toc definition. The behaviour is
-                      then to use the difference between the value of the
-                      symbol and the actual location of the toc as the toc
-                      index.
-
-                      In fact, what is usually happening is, because the
-                      Import Address Table is mapped immediately following
-                      the toc, some trippy library code trying for speed on
-                      dll linkage, takes advantage of that and considers
-                      the IAT to be part of the toc, thus saving a load.  */
-
-                   our_toc_offset = val - (toc_section->output_section->vma
-                                           + toc_section->output_offset);
-
-                   /* The size must still fit in a 16-bit displacement.  */
-                   if ((bfd_vma) our_toc_offset >= 65535)
-                     {
-                       _bfd_error_handler
-                         /* xgettext: c-format */
-                         (_("%pB: Relocation for %s of %#" PRIx64 " exceeds "
-                            "Toc size limit"),
-                          input_bfd, name, (uint64_t) our_toc_offset);
-                       bfd_set_error (bfd_error_bad_value);
-                       return FALSE;
-                     }
-
-                   record_toc (toc_section, our_toc_offset, pub,
-                               strdup (name));
-                 }
-               else if (IS_WRITTEN (our_toc_offset))
-                 {
-                   /* If it has been written out, it is marked with the
-                      1 bit. Fix up our offset, but do not write it out
-                      again.  */
-                   MAKE_ADDR_AGAIN(our_toc_offset);
-                 }
-               else
-                 {
-                   record_toc(toc_section, our_toc_offset, pub,
-                              strdup (name));
-
-                   /* Write out the toc entry.  */
-                   bfd_put_32 (output_bfd, val,
-                              toc_section->contents + our_toc_offset);
-
-                   MARK_AS_WRITTEN(h->toc_offset);
-                   /* The tricky part is that this is the address that
-                      needs a .reloc entry for it.  */
-                   fixit = TRUE;
-                 }
-             }
-
-           if (fixit && info->base_file)
-             {
-               /* So if this is non pcrelative, and is referenced
-                  to a section or a common symbol, then it needs a reloc.  */
-
-               /* Relocation to a symbol in a section which
-                  isn't absolute - we output the address here
-                  to a file.  */
-               bfd_vma addr = (toc_section->output_section->vma
-                               + toc_section->output_offset + our_toc_offset);
-
-               if (!write_base_file_entry (output_bfd, info, addr))
-                 return FALSE;
-             }
-
-           /* FIXME: this test is conservative.  */
-           if ((r_flags & IMAGE_REL_PPC_TOCDEFN) != IMAGE_REL_PPC_TOCDEFN
-               && (bfd_vma) our_toc_offset > toc_section->size)
-             {
-               _bfd_error_handler
-                 /* xgettext: c-format */
-                 (_("%pB: Relocation exceeds allocated TOC (%#" PRIx64 ")"),
-                  input_bfd, (uint64_t) toc_section->size);
-               bfd_set_error (bfd_error_bad_value);
-               return FALSE;
-             }
-
-           /* Now we know the relocation for this toc reference.  */
-           relocation =  our_toc_offset + TOC_LOAD_ADJUSTMENT;
-           rstat = _bfd_relocate_contents (howto, input_bfd, relocation, loc);
-         }
-         break;
-       case IMAGE_REL_PPC_IFGLUE:
-         {
-           /* To solve this, we need to know whether or not the symbol
-              appearing on the call instruction is a glue function or not.
-              A glue function must announce itself via a IMGLUE reloc, and
-              the reloc contains the required toc restore instruction.  */
-           DUMP_RELOC2 (howto->name, rel);
-
-           if (h != 0)
-             {
-               if (h->symbol_is_glue == 1)
-                 {
-                   bfd_put_32 (input_bfd, (bfd_vma) h->glue_insn, loc);
-                 }
-             }
-         }
-         break;
-       case IMAGE_REL_PPC_SECREL:
-         /* Unimplemented: codeview debugging information.  */
-         /* For fast access to the header of the section
-            containing the item.  */
-         break;
-       case IMAGE_REL_PPC_SECTION:
-         /* Unimplemented: codeview debugging information.  */
-         /* Is used to indicate that the value should be relative
-            to the beginning of the section that contains the
-            symbol.  */
-         break;
-       case IMAGE_REL_PPC_ABSOLUTE:
-         {
-           const char *my_name;
-           char buf[SYMNMLEN + 1];
-
-           if (h == 0)
-             {
-               strncpy (buf, (syms+symndx)->_n._n_name, SYMNMLEN);
-               buf[SYMNMLEN] = '\0';
-               my_name = buf;
-             }
-           else
-             my_name = h->root.root.root.string;
-
-           _bfd_error_handler
-             /* xgettext: c-format */
-             (_("warning: unsupported reloc %s <file %pB, section %pA>\n"
-                "sym %ld (%s), r_vaddr %" PRId64 " (%#" PRIx64 ")"),
-              howto->name, input_bfd, input_section,
-              rel->r_symndx, my_name,
-              (int64_t) rel->r_vaddr, (uint64_t) rel->r_vaddr);
-         }
-         break;
-       case IMAGE_REL_PPC_IMGLUE:
-         {
-           /* There is nothing to do now. This reloc was noted in the first
-              pass over the relocs, and the glue instruction extracted.  */
-           const char *my_name;
-
-           if (h->symbol_is_glue == 1)
-             break;
-           my_name = h->root.root.root.string;
-
-           _bfd_error_handler
-             /* xgettext: c-format */
-             (_("%pB: Out of order IMGLUE reloc for %s"), input_bfd, my_name);
-           bfd_set_error (bfd_error_bad_value);
-           return FALSE;
-         }
-
-       case IMAGE_REL_PPC_ADDR32NB:
-         {
-           const char *name = 0;
-
-           DUMP_RELOC2 (howto->name, rel);
-
-           if (CONST_STRNEQ (input_section->name, ".idata$2") && first_thunk_address == 0)
-             {
-               /* Set magic values.  */
-               int idata5offset;
-               struct coff_link_hash_entry *myh;
-
-               myh = coff_link_hash_lookup (coff_hash_table (info),
-                                            "__idata5_magic__",
-                                            FALSE, FALSE, TRUE);
-               first_thunk_address = myh->root.u.def.value +
-                 sec->output_section->vma +
-                   sec->output_offset -
-                     pe_data(output_bfd)->pe_opthdr.ImageBase;
-
-               idata5offset = myh->root.u.def.value;
-               myh = coff_link_hash_lookup (coff_hash_table (info),
-                                            "__idata6_magic__",
-                                            FALSE, FALSE, TRUE);
-
-               thunk_size = myh->root.u.def.value - idata5offset;
-               myh = coff_link_hash_lookup (coff_hash_table (info),
-                                            "__idata4_magic__",
-                                            FALSE, FALSE, TRUE);
-               import_table_size = myh->root.u.def.value;
-             }
-
-           if (h == 0)
-             /* It is a file local symbol.  */
-             sym = syms + symndx;
-           else
-             {
-               char *target = 0;
-
-               name = h->root.root.root.string;
-               if (strcmp (".idata$2", name) == 0)
-                 target = "__idata2_magic__";
-               else if (strcmp (".idata$4", name) == 0)
-                 target = "__idata4_magic__";
-               else if (strcmp (".idata$5", name) == 0)
-                 target = "__idata5_magic__";
-
-               if (target != 0)
-                 {
-                   struct coff_link_hash_entry *myh;
-
-                   myh = coff_link_hash_lookup (coff_hash_table (info),
-                                                target,
-                                                FALSE, FALSE, TRUE);
-                   if (myh == 0)
-                     {
-                       /* Missing magic cookies. Something is very wrong.  */
-                       abort ();
-                     }
-
-                   val = myh->root.u.def.value +
-                     sec->output_section->vma + sec->output_offset;
-                   if (first_thunk_address == 0)
-                     {
-                       int idata5offset;
-                       myh = coff_link_hash_lookup (coff_hash_table (info),
-                                                    "__idata5_magic__",
-                                                    FALSE, FALSE, TRUE);
-                       first_thunk_address = myh->root.u.def.value +
-                         sec->output_section->vma +
-                           sec->output_offset -
-                             pe_data(output_bfd)->pe_opthdr.ImageBase;
-
-                       idata5offset = myh->root.u.def.value;
-                       myh = coff_link_hash_lookup (coff_hash_table (info),
-                                                    "__idata6_magic__",
-                                                    FALSE, FALSE, TRUE);
-
-                       thunk_size = myh->root.u.def.value - idata5offset;
-                       myh = coff_link_hash_lookup (coff_hash_table (info),
-                                                    "__idata4_magic__",
-                                                    FALSE, FALSE, TRUE);
-                       import_table_size = myh->root.u.def.value;
-                     }
-                 }
-             }
-
-           rstat = _bfd_relocate_contents (howto,
-                                           input_bfd,
-                                           val -
-                                           pe_data (output_bfd)->pe_opthdr.ImageBase,
-                                           loc);
-         }
-         break;
-
-       case IMAGE_REL_PPC_REL24:
-         DUMP_RELOC2(howto->name, rel);
-         val -= (input_section->output_section->vma
-                 + input_section->output_offset);
-
-         rstat = _bfd_relocate_contents (howto,
-                                         input_bfd,
-                                         val,
-                                         loc);
-         break;
-       case IMAGE_REL_PPC_ADDR16:
-       case IMAGE_REL_PPC_ADDR24:
-       case IMAGE_REL_PPC_ADDR32:
-         DUMP_RELOC2(howto->name, rel);
-         rstat = _bfd_relocate_contents (howto,
-                                         input_bfd,
-                                         val,
-                                         loc);
-         break;
-       }
-
-      if (info->base_file)
-       {
-         /* So if this is non pcrelative, and is referenced
-            to a section or a common symbol, then it needs a reloc.  */
-         if (sym && pe_data(output_bfd)->in_reloc_p (output_bfd, howto))
-           {
-             /* Relocation to a symbol in a section which
-                isn't absolute - we output the address here
-                to a file.  */
-             bfd_vma addr = (rel->r_vaddr
-                             - input_section->vma
-                             + input_section->output_offset
-                             + input_section->output_section->vma);
-
-             if (!write_base_file_entry (output_bfd, info, addr))
-               return FALSE;
-           }
-       }
-
-      switch (rstat)
-       {
-       default:
-         abort ();
-       case bfd_reloc_ok:
-         break;
-       case bfd_reloc_overflow:
-         {
-           const char *name;
-           char buf[SYMNMLEN + 1];
-
-           if (symndx == -1)
-             name = "*ABS*";
-           else if (h != NULL)
-             name = NULL;
-           else if (sym == NULL)
-             name = "*unknown*";
-           else if (sym->_n._n_n._n_zeroes == 0
-                    && sym->_n._n_n._n_offset != 0)
-             name = obj_coff_strings (input_bfd) + sym->_n._n_n._n_offset;
-           else
-             {
-               strncpy (buf, sym->_n._n_name, SYMNMLEN);
-               buf[SYMNMLEN] = '\0';
-               name = buf;
-             }
-
-           (*info->callbacks->reloc_overflow)
-             (info, (h ? &h->root.root : NULL), name, howto->name,
-              (bfd_vma) 0, input_bfd, input_section,
-              rel->r_vaddr - input_section->vma);
-         }
-       }
-    }
-
-  return TRUE;
-}
-
-#ifdef COFF_IMAGE_WITH_PE
-
-/* FIXME: BFD should not use global variables.  This file is compiled
-   twice, and these variables are shared.  This is confusing and
-   weird.  */
-
-long int global_toc_size = 4;
-
-bfd* bfd_of_toc_owner = 0;
-
-long int import_table_size;
-long int first_thunk_address;
-long int thunk_size;
-
-struct list_ele *head;
-struct list_ele *tail;
-
-static char *
-h1 = N_("\n\t\t\tTOC MAPPING\n\n");
-static char *
-h2 = N_(" TOC    disassembly  Comments       Name\n");
-static char *
-h3 = N_(" Offset  spelling                   (if present)\n");
-
-void
-dump_toc (void * vfile)
-{
-  FILE *file = (FILE *) vfile;
-  struct list_ele *t;
-
-  fputs (_(h1), file);
-  fputs (_(h2), file);
-  fputs (_(h3), file);
-
-  for (t = head; t != 0; t=t->next)
-    {
-      const char *cat = "";
-
-      if (t->cat == priv)
-       cat = _("private       ");
-      else if (t->cat == pub)
-       cat = _("public        ");
-      else if (t->cat == tocdata)
-       cat = _("data-in-toc   ");
-
-      if (t->offset > global_toc_size)
-       {
-         if (t->offset <= global_toc_size + thunk_size)
-           cat = _("IAT reference ");
-         else
-           {
-             fprintf (file,
-                      /* xgettext: c-format */
-                     _("**** global_toc_size %ld(%lx), thunk_size %ld(%lx)\n"),
-                      global_toc_size, (unsigned long) global_toc_size,
-                      thunk_size, (unsigned long) thunk_size);
-             cat = _("Out of bounds!");
-           }
-       }
-
-      fprintf (file,
-             " %04lx    (%d)", (unsigned long) t->offset, t->offset - 32768);
-      fprintf (file,
-             "    %s %s\n",
-             cat, t->name);
-
-    }
-
-  fprintf (file, "\n");
-}
-
-bfd_boolean
-ppc_allocate_toc_section (struct bfd_link_info *info ATTRIBUTE_UNUSED)
-{
-  asection *s;
-  bfd_byte *foo;
-  static char test_char = '1';
-
-  if ( global_toc_size == 0 ) /* FIXME: does this get me in trouble?  */
-    return TRUE;
-
-  if (bfd_of_toc_owner == 0)
-    /* No toc owner? Something is very wrong.  */
-    abort ();
-
-  s = bfd_get_section_by_name ( bfd_of_toc_owner , TOC_SECTION_NAME);
-  if (s == NULL)
-    /* No toc section? Something is very wrong.  */
-    abort ();
-
-  foo = (bfd_byte *) bfd_alloc (bfd_of_toc_owner, global_toc_size);
-  memset(foo, test_char, (size_t) global_toc_size);
-
-  s->size = global_toc_size;
-  s->contents = foo;
-
-  return TRUE;
-}
-
-bfd_boolean
-ppc_process_before_allocation (bfd *abfd,
-                              struct bfd_link_info *info)
-{
-  asection *sec;
-  struct internal_reloc *i, *rel;
-
-  /* Here we have a bfd that is to be included on the link. We have a hook
-     to do reloc rummaging, before section sizes are nailed down.  */
-  _bfd_coff_get_external_symbols (abfd);
-
-  /* Rummage around all the relocs and map the toc.  */
-  sec = abfd->sections;
-
-  if (sec == 0)
-    return TRUE;
-
-  for (; sec != 0; sec = sec->next)
-    {
-      if (sec->reloc_count == 0)
-       continue;
-
-      /* load the relocs */
-      /* FIXME: there may be a storage leak here */
-      i=_bfd_coff_read_internal_relocs(abfd,sec,1,0,0,0);
-
-      if (i == 0)
-       abort ();
-
-      for (rel = i; rel < i + sec->reloc_count; ++rel)
-       {
-         unsigned short r_type  = EXTRACT_TYPE  (rel->r_type);
-         unsigned short r_flags = EXTRACT_FLAGS (rel->r_type);
-         bfd_boolean ok = TRUE;
-
-         DUMP_RELOC2 (ppc_coff_howto_table[r_type].name, rel);
-
-         switch(r_type)
-           {
-           case IMAGE_REL_PPC_TOCREL16:
-             /* If TOCDEFN is on, ignore as someone else has allocated the
-                toc entry.  */
-             if ((r_flags & IMAGE_REL_PPC_TOCDEFN) != IMAGE_REL_PPC_TOCDEFN)
-               ok = ppc_record_toc_entry(abfd, info, sec,
-                                         rel->r_symndx, default_toc);
-             if (!ok)
-               return FALSE;
-             break;
-           case IMAGE_REL_PPC_IMGLUE:
-             ppc_mark_symbol_as_glue (abfd, rel->r_symndx, rel);
-             break;
-           default:
-             break;
-           }
-       }
-    }
-
-  return TRUE;
-}
-
-#endif
-
-static bfd_reloc_status_type
-ppc_refhi_reloc (bfd *abfd ATTRIBUTE_UNUSED,
-                arelent *reloc_entry ATTRIBUTE_UNUSED,
-                asymbol *symbol ATTRIBUTE_UNUSED,
-                void * data ATTRIBUTE_UNUSED,
-                asection *input_section ATTRIBUTE_UNUSED,
-                bfd *output_bfd,
-                char **error_message ATTRIBUTE_UNUSED)
-{
-  UN_IMPL("REFHI");
-  DUMP_RELOC("REFHI",reloc_entry);
-
-  if (output_bfd == (bfd *) NULL)
-    return bfd_reloc_continue;
-
-  return bfd_reloc_undefined;
-}
-
-static bfd_reloc_status_type
-ppc_pair_reloc (bfd *abfd ATTRIBUTE_UNUSED,
-               arelent *reloc_entry ATTRIBUTE_UNUSED,
-               asymbol *symbol ATTRIBUTE_UNUSED,
-               void * data ATTRIBUTE_UNUSED,
-               asection *input_section ATTRIBUTE_UNUSED,
-               bfd *output_bfd,
-               char **error_message ATTRIBUTE_UNUSED)
-{
-  UN_IMPL("PAIR");
-  DUMP_RELOC("PAIR",reloc_entry);
-
-  if (output_bfd == (bfd *) NULL)
-    return bfd_reloc_continue;
-
-  return bfd_reloc_undefined;
-}
-
-static bfd_reloc_status_type
-ppc_toc16_reloc (bfd *abfd ATTRIBUTE_UNUSED,
-                arelent *reloc_entry ATTRIBUTE_UNUSED,
-                asymbol *symbol ATTRIBUTE_UNUSED,
-                void * data ATTRIBUTE_UNUSED,
-                asection *input_section ATTRIBUTE_UNUSED,
-                bfd *output_bfd,
-                char **error_message ATTRIBUTE_UNUSED)
-{
-  UN_IMPL ("TOCREL16");
-  DUMP_RELOC ("TOCREL16",reloc_entry);
-
-  if (output_bfd == (bfd *) NULL)
-    return bfd_reloc_continue;
-
-  return bfd_reloc_ok;
-}
-
-static bfd_reloc_status_type
-ppc_secrel_reloc (bfd *abfd ATTRIBUTE_UNUSED,
-                 arelent *reloc_entry ATTRIBUTE_UNUSED,
-                 asymbol *symbol ATTRIBUTE_UNUSED,
-                 void * data ATTRIBUTE_UNUSED,
-                 asection *input_section ATTRIBUTE_UNUSED,
-                 bfd *output_bfd,
-                 char **error_message ATTRIBUTE_UNUSED)
-{
-  UN_IMPL("SECREL");
-  DUMP_RELOC("SECREL",reloc_entry);
-
-  if (output_bfd == (bfd *) NULL)
-    return bfd_reloc_continue;
-
-  return bfd_reloc_ok;
-}
-
-static bfd_reloc_status_type
-ppc_section_reloc (bfd *abfd ATTRIBUTE_UNUSED,
-                  arelent *reloc_entry ATTRIBUTE_UNUSED,
-                  asymbol *symbol ATTRIBUTE_UNUSED,
-                  void * data ATTRIBUTE_UNUSED,
-                  asection *input_section ATTRIBUTE_UNUSED,
-                  bfd *output_bfd,
-                  char **error_message ATTRIBUTE_UNUSED)
-{
-  UN_IMPL("SECTION");
-  DUMP_RELOC("SECTION",reloc_entry);
-
-  if (output_bfd == (bfd *) NULL)
-    return bfd_reloc_continue;
-
-  return bfd_reloc_ok;
-}
-
-static bfd_reloc_status_type
-ppc_imglue_reloc (bfd *abfd ATTRIBUTE_UNUSED,
-                 arelent *reloc_entry ATTRIBUTE_UNUSED,
-                 asymbol *symbol ATTRIBUTE_UNUSED,
-                 void * data ATTRIBUTE_UNUSED,
-                 asection *input_section ATTRIBUTE_UNUSED,
-                 bfd *output_bfd,
-                 char **error_message ATTRIBUTE_UNUSED)
-
-{
-  UN_IMPL("IMGLUE");
-  DUMP_RELOC("IMGLUE",reloc_entry);
-
-  if (output_bfd == (bfd *) NULL)
-    return bfd_reloc_continue;
-
-  return bfd_reloc_ok;
-}
-\f
-#define MAX_RELOC_INDEX  \
-      (sizeof (ppc_coff_howto_table) / sizeof (ppc_coff_howto_table[0]) - 1)
-
-/* FIXME: There is a possibility that when we read in a reloc from a file,
-         that there are some bits encoded in the upper portion of the
-         type field. Not yet implemented.  */
-
-static void
-ppc_coff_rtype2howto (arelent *relent, struct internal_reloc *internal)
-{
-  /* We can encode one of three things in the type field, aside from the
-     type:
-     1. IMAGE_REL_PPC_NEG - indicates the value field is a subtraction
-       value, rather than an addition value
-     2. IMAGE_REL_PPC_BRTAKEN, IMAGE_REL_PPC_BRNTAKEN - indicates that
-       the branch is expected to be taken or not.
-     3. IMAGE_REL_PPC_TOCDEFN - toc slot definition in the file
-     For now, we just strip this stuff to find the type, and ignore it other
-     than that.  */
-  reloc_howto_type *howto;
-  unsigned short r_type  = EXTRACT_TYPE (internal->r_type);
-  unsigned short r_flags = EXTRACT_FLAGS(internal->r_type);
-  unsigned short junk    = EXTRACT_JUNK (internal->r_type);
-
-  /* The masking process only slices off the bottom byte for r_type.  */
-  if ( r_type > MAX_RELOC_INDEX )
-    abort ();
-
-  /* Check for absolute crap.  */
-  if (junk != 0)
-    abort ();
-
-  switch(r_type)
-    {
-    case IMAGE_REL_PPC_ADDR16:
-    case IMAGE_REL_PPC_REL24:
-    case IMAGE_REL_PPC_ADDR24:
-    case IMAGE_REL_PPC_ADDR32:
-    case IMAGE_REL_PPC_IFGLUE:
-    case IMAGE_REL_PPC_ADDR32NB:
-    case IMAGE_REL_PPC_SECTION:
-    case IMAGE_REL_PPC_SECREL:
-      DUMP_RELOC2 (ppc_coff_howto_table[r_type].name, internal);
-      howto = ppc_coff_howto_table + r_type;
-      break;
-    case IMAGE_REL_PPC_IMGLUE:
-      DUMP_RELOC2 (ppc_coff_howto_table[r_type].name, internal);
-      howto = ppc_coff_howto_table + r_type;
-      break;
-    case IMAGE_REL_PPC_TOCREL16:
-      DUMP_RELOC2 (ppc_coff_howto_table[r_type].name, internal);
-      if (r_flags & IMAGE_REL_PPC_TOCDEFN)
-       howto = ppc_coff_howto_table + IMAGE_REL_PPC_TOCREL16_DEFN;
-      else
-       howto = ppc_coff_howto_table + IMAGE_REL_PPC_TOCREL16;
-      break;
-    default:
-      _bfd_error_handler
-       /* xgettext: c-format */
-       (_("warning: unsupported reloc %s [%d] used -- it may not work"),
-        ppc_coff_howto_table[r_type].name, r_type);
-      howto = ppc_coff_howto_table + r_type;
-      break;
-    }
-
-  relent->howto = howto;
-}
-
-static reloc_howto_type *
-coff_ppc_rtype_to_howto (bfd *abfd ATTRIBUTE_UNUSED,
-                        asection *sec,
-                        struct internal_reloc *rel,
-                        struct coff_link_hash_entry *h ATTRIBUTE_UNUSED,
-                        struct internal_syment *sym ATTRIBUTE_UNUSED,
-                        bfd_vma *addendp)
-{
-  reloc_howto_type *howto;
-
-  /* We can encode one of three things in the type field, aside from the
-     type:
-     1. IMAGE_REL_PPC_NEG - indicates the value field is a subtraction
-       value, rather than an addition value
-     2. IMAGE_REL_PPC_BRTAKEN, IMAGE_REL_PPC_BRNTAKEN - indicates that
-       the branch is expected to be taken or not.
-     3. IMAGE_REL_PPC_TOCDEFN - toc slot definition in the file
-     For now, we just strip this stuff to find the type, and ignore it other
-     than that.  */
-
-  unsigned short r_type  = EXTRACT_TYPE  (rel->r_type);
-  unsigned short r_flags = EXTRACT_FLAGS (rel->r_type);
-  unsigned short junk    = EXTRACT_JUNK  (rel->r_type);
-
-  /* The masking process only slices off the bottom byte for r_type.  */
-  if (r_type > MAX_RELOC_INDEX)
-    abort ();
-
-  /* Check for absolute crap.  */
-  if (junk != 0)
-    abort ();
-
-  switch(r_type)
-    {
-    case IMAGE_REL_PPC_ADDR32NB:
-      DUMP_RELOC2(ppc_coff_howto_table[r_type].name, rel);
-      *addendp -= pe_data(sec->output_section->owner)->pe_opthdr.ImageBase;
-      howto = ppc_coff_howto_table + r_type;
-      break;
-    case IMAGE_REL_PPC_TOCREL16:
-      DUMP_RELOC2(ppc_coff_howto_table[r_type].name, rel);
-      if (r_flags & IMAGE_REL_PPC_TOCDEFN)
-       howto = ppc_coff_howto_table + IMAGE_REL_PPC_TOCREL16_DEFN;
-      else
-       howto = ppc_coff_howto_table + IMAGE_REL_PPC_TOCREL16;
-      break;
-    case IMAGE_REL_PPC_ADDR16:
-    case IMAGE_REL_PPC_REL24:
-    case IMAGE_REL_PPC_ADDR24:
-    case IMAGE_REL_PPC_ADDR32:
-    case IMAGE_REL_PPC_IFGLUE:
-    case IMAGE_REL_PPC_SECTION:
-    case IMAGE_REL_PPC_SECREL:
-      DUMP_RELOC2(ppc_coff_howto_table[r_type].name, rel);
-      howto = ppc_coff_howto_table + r_type;
-      break;
-    case IMAGE_REL_PPC_IMGLUE:
-      DUMP_RELOC2(ppc_coff_howto_table[r_type].name, rel);
-      howto = ppc_coff_howto_table + r_type;
-      break;
-    default:
-      _bfd_error_handler
-       /* xgettext: c-format */
-       (_("warning: unsupported reloc %s [%d] used -- it may not work"),
-        ppc_coff_howto_table[r_type].name, r_type);
-      howto = ppc_coff_howto_table + r_type;
-      break;
-    }
-
-  return howto;
-}
-
-/* A cheesy little macro to make the code a little more readable.  */
-#define HOW2MAP(bfd_rtype,ppc_rtype)  \
- case bfd_rtype: return &ppc_coff_howto_table[ppc_rtype]
-
-static reloc_howto_type *
-ppc_coff_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
-                           bfd_reloc_code_real_type code)
-{
-  switch (code)
-    {
-      HOW2MAP(BFD_RELOC_32_GOTOFF,    IMAGE_REL_PPC_IMGLUE);
-      HOW2MAP(BFD_RELOC_16_GOT_PCREL, IMAGE_REL_PPC_IFGLUE);
-      HOW2MAP(BFD_RELOC_16,          IMAGE_REL_PPC_ADDR16);
-      HOW2MAP(BFD_RELOC_PPC_B26,      IMAGE_REL_PPC_REL24);
-      HOW2MAP(BFD_RELOC_PPC_BA26,     IMAGE_REL_PPC_ADDR24);
-      HOW2MAP(BFD_RELOC_PPC_TOC16,    IMAGE_REL_PPC_TOCREL16);
-      HOW2MAP(BFD_RELOC_16_GOTOFF,    IMAGE_REL_PPC_TOCREL16_DEFN);
-      HOW2MAP(BFD_RELOC_32,          IMAGE_REL_PPC_ADDR32);
-      HOW2MAP(BFD_RELOC_RVA,         IMAGE_REL_PPC_ADDR32NB);
-    default:
-      return NULL;
-    }
-}
-#undef HOW2MAP
-
-static reloc_howto_type *
-ppc_coff_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
-                           const char *r_name)
-{
-  unsigned int i;
-
-  for (i = 0;
-       i < sizeof (ppc_coff_howto_table) / sizeof (ppc_coff_howto_table[0]);
-       i++)
-    if (ppc_coff_howto_table[i].name != NULL
-       && strcasecmp (ppc_coff_howto_table[i].name, r_name) == 0)
-      return &ppc_coff_howto_table[i];
-
-  return NULL;
-}
-\f
-/* Tailor coffcode.h -- macro heaven.  */
-
-#define RTYPE2HOWTO(cache_ptr, dst)  ppc_coff_rtype2howto (cache_ptr, dst)
-
-/* We use the special COFF backend linker, with our own special touch.  */
-
-#define coff_bfd_reloc_type_lookup   ppc_coff_reloc_type_lookup
-#define coff_bfd_reloc_name_lookup ppc_coff_reloc_name_lookup
-#define coff_rtype_to_howto         coff_ppc_rtype_to_howto
-#define coff_relocate_section       coff_ppc_relocate_section
-#define coff_bfd_final_link         ppc_bfd_coff_final_link
-
-#ifndef COFF_IMAGE_WITH_PE
-#endif
-
-#define SELECT_RELOC(internal, howto) {internal.r_type=howto->type;}
-
-#define COFF_PAGE_SIZE                      0x1000
-
-/* FIXME: This controls some code that used to be in peicode.h and is
-   now in peigen.c.  It will not control the code in peigen.c.  If
-   anybody wants to get this working, you will need to fix that.  */
-#define POWERPC_LE_PE
-
-#define COFF_SECTION_ALIGNMENT_ENTRIES \
-{ COFF_SECTION_NAME_EXACT_MATCH (".idata$2"), \
-  COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 0 }, \
-{ COFF_SECTION_NAME_EXACT_MATCH (".idata$3"), \
-  COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 0 }, \
-{ COFF_SECTION_NAME_EXACT_MATCH (".idata$4"), \
-  COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 2 }, \
-{ COFF_SECTION_NAME_EXACT_MATCH (".idata$5"), \
-  COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 2 }, \
-{ COFF_SECTION_NAME_EXACT_MATCH (".idata$6"), \
-  COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 1 }, \
-{ COFF_SECTION_NAME_EXACT_MATCH (".reloc"), \
-  COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 1 }
-
-#include "coffcode.h"
-\f
-#ifndef COFF_IMAGE_WITH_PE
-
-static bfd_boolean
-ppc_do_last (bfd *abfd)
-{
-  if (abfd == bfd_of_toc_owner)
-    return TRUE;
-  else
-    return FALSE;
-}
-
-static bfd *
-ppc_get_last (void)
-{
-  return bfd_of_toc_owner;
-}
-
-/* This piece of machinery exists only to guarantee that the bfd that holds
-   the toc section is written last.
-
-   This does depend on bfd_make_section attaching a new section to the
-   end of the section list for the bfd.
-
-   This is otherwise intended to be functionally the same as
-   cofflink.c:_bfd_coff_final_link(). It is specifically different only
-   where the POWERPC_LE_PE macro modifies the code. It is left in as a
-   precise form of comment. krk@cygnus.com  */
-
-/* Do the final link step.  */
-
-bfd_boolean
-ppc_bfd_coff_final_link (bfd *abfd, struct bfd_link_info *info)
-{
-  bfd_size_type symesz;
-  struct coff_final_link_info flaginfo;
-  bfd_boolean debug_merge_allocated;
-  asection *o;
-  struct bfd_link_order *p;
-  bfd_size_type max_sym_count;
-  bfd_size_type max_lineno_count;
-  bfd_size_type max_reloc_count;
-  bfd_size_type max_output_reloc_count;
-  bfd_size_type max_contents_size;
-  file_ptr rel_filepos;
-  unsigned int relsz;
-  file_ptr line_filepos;
-  unsigned int linesz;
-  bfd *sub;
-  bfd_byte *external_relocs = NULL;
-  char strbuf[STRING_SIZE_SIZE];
-  bfd_size_type amt;
-
-  symesz = bfd_coff_symesz (abfd);
-
-  flaginfo.info = info;
-  flaginfo.output_bfd = abfd;
-  flaginfo.strtab = NULL;
-  flaginfo.section_info = NULL;
-  flaginfo.last_file_index = -1;
-  flaginfo.last_bf_index = -1;
-  flaginfo.internal_syms = NULL;
-  flaginfo.sec_ptrs = NULL;
-  flaginfo.sym_indices = NULL;
-  flaginfo.outsyms = NULL;
-  flaginfo.linenos = NULL;
-  flaginfo.contents = NULL;
-  flaginfo.external_relocs = NULL;
-  flaginfo.internal_relocs = NULL;
-  debug_merge_allocated = FALSE;
-
-  coff_data (abfd)->link_info = info;
-
-  flaginfo.strtab = _bfd_stringtab_init ();
-  if (flaginfo.strtab == NULL)
-    goto error_return;
-
-  if (! coff_debug_merge_hash_table_init (&flaginfo.debug_merge))
-    goto error_return;
-  debug_merge_allocated = TRUE;
-
-  /* Compute the file positions for all the sections.  */
-  if (! abfd->output_has_begun)
-    {
-      if (! bfd_coff_compute_section_file_positions (abfd))
-       return FALSE;
-    }
-
-  /* Count the line numbers and relocation entries required for the
-     output file.  Set the file positions for the relocs.  */
-  rel_filepos = obj_relocbase (abfd);
-  relsz = bfd_coff_relsz (abfd);
-  max_contents_size = 0;
-  max_lineno_count = 0;
-  max_reloc_count = 0;
-
-  for (o = abfd->sections; o != NULL; o = o->next)
-    {
-      o->reloc_count = 0;
-      o->lineno_count = 0;
-
-      for (p = o->map_head.link_order; p != NULL; p = p->next)
-       {
-         if (p->type == bfd_indirect_link_order)
-           {
-             asection *sec;
-
-             sec = p->u.indirect.section;
-
-             /* Mark all sections which are to be included in the
-                link.  This will normally be every section.  We need
-                to do this so that we can identify any sections which
-                the linker has decided to not include.  */
-             sec->linker_mark = TRUE;
-
-             if (info->strip == strip_none
-                 || info->strip == strip_some)
-               o->lineno_count += sec->lineno_count;
-
-             if (bfd_link_relocatable (info))
-               o->reloc_count += sec->reloc_count;
-
-             if (sec->rawsize > max_contents_size)
-               max_contents_size = sec->rawsize;
-             if (sec->size > max_contents_size)
-               max_contents_size = sec->size;
-             if (sec->lineno_count > max_lineno_count)
-               max_lineno_count = sec->lineno_count;
-             if (sec->reloc_count > max_reloc_count)
-               max_reloc_count = sec->reloc_count;
-           }
-         else if (bfd_link_relocatable (info)
-                  && (p->type == bfd_section_reloc_link_order
-                      || p->type == bfd_symbol_reloc_link_order))
-           ++o->reloc_count;
-       }
-      if (o->reloc_count == 0)
-       o->rel_filepos = 0;
-      else
-       {
-         o->flags |= SEC_RELOC;
-         o->rel_filepos = rel_filepos;
-         rel_filepos += o->reloc_count * relsz;
-       }
-    }
-
-  /* If doing a relocatable link, allocate space for the pointers we
-     need to keep.  */
-  if (bfd_link_relocatable (info))
-    {
-      unsigned int i;
-
-      /* We use section_count + 1, rather than section_count, because
-        the target_index fields are 1 based.  */
-      amt = abfd->section_count + 1;
-      amt *= sizeof (struct coff_link_section_info);
-      flaginfo.section_info = (struct coff_link_section_info *) bfd_malloc (amt);
-
-      if (flaginfo.section_info == NULL)
-       goto error_return;
-
-      for (i = 0; i <= abfd->section_count; i++)
-       {
-         flaginfo.section_info[i].relocs = NULL;
-         flaginfo.section_info[i].rel_hashes = NULL;
-       }
-    }
-
-  /* We now know the size of the relocs, so we can determine the file
-     positions of the line numbers.  */
-  line_filepos = rel_filepos;
-  linesz = bfd_coff_linesz (abfd);
-  max_output_reloc_count = 0;
-
-  for (o = abfd->sections; o != NULL; o = o->next)
-    {
-      if (o->lineno_count == 0)
-       o->line_filepos = 0;
-      else
-       {
-         o->line_filepos = line_filepos;
-         line_filepos += o->lineno_count * linesz;
-       }
-
-      if (o->reloc_count != 0)
-       {
-         /* We don't know the indices of global symbols until we have
-            written out all the local symbols.  For each section in
-            the output file, we keep an array of pointers to hash
-            table entries.  Each entry in the array corresponds to a
-            reloc.  When we find a reloc against a global symbol, we
-            set the corresponding entry in this array so that we can
-            fix up the symbol index after we have written out all the
-            local symbols.
-
-            Because of this problem, we also keep the relocs in
-            memory until the end of the link.  This wastes memory,
-            but only when doing a relocatable link, which is not the
-            common case.  */
-         BFD_ASSERT (bfd_link_relocatable (info));
-         amt = o->reloc_count;
-         amt *= sizeof (struct internal_reloc);
-         flaginfo.section_info[o->target_index].relocs =
-           (struct internal_reloc *) bfd_malloc (amt);
-         amt = o->reloc_count;
-         amt *= sizeof (struct coff_link_hash_entry *);
-         flaginfo.section_info[o->target_index].rel_hashes =
-           (struct coff_link_hash_entry **) bfd_malloc (amt);
-         if (flaginfo.section_info[o->target_index].relocs == NULL
-             || flaginfo.section_info[o->target_index].rel_hashes == NULL)
-           goto error_return;
-
-         if (o->reloc_count > max_output_reloc_count)
-           max_output_reloc_count = o->reloc_count;
-       }
-
-      /* Reset the reloc and lineno counts, so that we can use them to
-        count the number of entries we have output so far.  */
-      o->reloc_count = 0;
-      o->lineno_count = 0;
-    }
-
-  obj_sym_filepos (abfd) = line_filepos;
-
-  /* Figure out the largest number of symbols in an input BFD.  Take
-     the opportunity to clear the output_has_begun fields of all the
-     input BFD's.  */
-  max_sym_count = 0;
-  for (sub = info->input_bfds; sub != NULL; sub = sub->link.next)
-    {
-      bfd_size_type sz;
-
-      sub->output_has_begun = FALSE;
-      sz = obj_raw_syment_count (sub);
-      if (sz > max_sym_count)
-       max_sym_count = sz;
-    }
-
-  /* Allocate some buffers used while linking.  */
-  amt = max_sym_count * sizeof (struct internal_syment);
-  flaginfo.internal_syms = (struct internal_syment *) bfd_malloc (amt);
-  amt = max_sym_count * sizeof (asection *);
-  flaginfo.sec_ptrs = (asection **) bfd_malloc (amt);
-  amt = max_sym_count * sizeof (long);
-  flaginfo.sym_indices = (long *) bfd_malloc (amt);
-  amt = (max_sym_count + 1) * symesz;
-  flaginfo.outsyms = (bfd_byte *) bfd_malloc (amt);
-  amt = max_lineno_count * bfd_coff_linesz (abfd);
-  flaginfo.linenos = (bfd_byte *) bfd_malloc (amt);
-  flaginfo.contents = (bfd_byte *) bfd_malloc (max_contents_size);
-  flaginfo.external_relocs = (bfd_byte *) bfd_malloc (max_reloc_count * relsz);
-  if (! bfd_link_relocatable (info))
-    {
-      amt = max_reloc_count * sizeof (struct internal_reloc);
-      flaginfo.internal_relocs = (struct internal_reloc *) bfd_malloc (amt);
-    }
-  if ((flaginfo.internal_syms == NULL && max_sym_count > 0)
-      || (flaginfo.sec_ptrs == NULL && max_sym_count > 0)
-      || (flaginfo.sym_indices == NULL && max_sym_count > 0)
-      || flaginfo.outsyms == NULL
-      || (flaginfo.linenos == NULL && max_lineno_count > 0)
-      || (flaginfo.contents == NULL && max_contents_size > 0)
-      || (flaginfo.external_relocs == NULL && max_reloc_count > 0)
-      || (! bfd_link_relocatable (info)
-         && flaginfo.internal_relocs == NULL
-         && max_reloc_count > 0))
-    goto error_return;
-
-  /* We now know the position of everything in the file, except that
-     we don't know the size of the symbol table and therefore we don't
-     know where the string table starts.  We just build the string
-     table in memory as we go along.  We process all the relocations
-     for a single input file at once.  */
-  obj_raw_syment_count (abfd) = 0;
-
-  if (coff_backend_info (abfd)->_bfd_coff_start_final_link)
-    {
-      if (! bfd_coff_start_final_link (abfd, info))
-       goto error_return;
-    }
-
-  for (o = abfd->sections; o != NULL; o = o->next)
-    {
-      for (p = o->map_head.link_order; p != NULL; p = p->next)
-       {
-         if (p->type == bfd_indirect_link_order
-             && (bfd_get_flavour (p->u.indirect.section->owner)
-                 == bfd_target_coff_flavour))
-           {
-             sub = p->u.indirect.section->owner;
-#ifdef POWERPC_LE_PE
-             if (! sub->output_has_begun && !ppc_do_last(sub))
-#else
-             if (! sub->output_has_begun)
-#endif
-               {
-                 if (! _bfd_coff_link_input_bfd (&flaginfo, sub))
-                   goto error_return;
-                 sub->output_has_begun = TRUE;
-               }
-           }
-         else if (p->type == bfd_section_reloc_link_order
-                  || p->type == bfd_symbol_reloc_link_order)
-           {
-             if (! _bfd_coff_reloc_link_order (abfd, &flaginfo, o, p))
-               goto error_return;
-           }
-         else
-           {
-             if (! _bfd_default_link_order (abfd, info, o, p))
-               goto error_return;
-           }
-       }
-    }
-
-#ifdef POWERPC_LE_PE
-  {
-    bfd* last_one = ppc_get_last();
-    if (last_one)
-      {
-       if (! _bfd_coff_link_input_bfd (&flaginfo, last_one))
-         goto error_return;
-      }
-    last_one->output_has_begun = TRUE;
-  }
-#endif
-
-  /* Free up the buffers used by _bfd_coff_link_input_bfd.  */
-  coff_debug_merge_hash_table_free (&flaginfo.debug_merge);
-  debug_merge_allocated = FALSE;
-
-  free (flaginfo.internal_syms);
-  flaginfo.internal_syms = NULL;
-  free (flaginfo.sec_ptrs);
-  flaginfo.sec_ptrs = NULL;
-  free (flaginfo.sym_indices);
-  flaginfo.sym_indices = NULL;
-  free (flaginfo.linenos);
-  flaginfo.linenos = NULL;
-  free (flaginfo.contents);
-  flaginfo.contents = NULL;
-  free (flaginfo.external_relocs);
-  flaginfo.external_relocs = NULL;
-  free (flaginfo.internal_relocs);
-  flaginfo.internal_relocs = NULL;
-
-  /* The value of the last C_FILE symbol is supposed to be the symbol
-     index of the first external symbol.  Write it out again if
-     necessary.  */
-  if (flaginfo.last_file_index != -1
-      && (unsigned int) flaginfo.last_file.n_value != obj_raw_syment_count (abfd))
-    {
-      file_ptr pos;
-
-      flaginfo.last_file.n_value = obj_raw_syment_count (abfd);
-      bfd_coff_swap_sym_out (abfd, &flaginfo.last_file,
-                            flaginfo.outsyms);
-      pos = obj_sym_filepos (abfd) + flaginfo.last_file_index * symesz;
-      if (bfd_seek (abfd, pos, SEEK_SET) != 0
-         || bfd_bwrite (flaginfo.outsyms, symesz, abfd) != symesz)
-       return FALSE;
-    }
-
-  /* Write out the global symbols.  */
-  flaginfo.failed = FALSE;
-  bfd_hash_traverse (&info->hash->table, _bfd_coff_write_global_sym, &flaginfo);
-  if (flaginfo.failed)
-    goto error_return;
-
-  /* The outsyms buffer is used by _bfd_coff_write_global_sym.  */
-  free (flaginfo.outsyms);
-  flaginfo.outsyms = NULL;
-
-  if (bfd_link_relocatable (info))
-    {
-      /* Now that we have written out all the global symbols, we know
-        the symbol indices to use for relocs against them, and we can
-        finally write out the relocs.  */
-      amt = max_output_reloc_count * relsz;
-      external_relocs = (bfd_byte *) bfd_malloc (amt);
-      if (external_relocs == NULL)
-       goto error_return;
-
-      for (o = abfd->sections; o != NULL; o = o->next)
-       {
-         struct internal_reloc *irel;
-         struct internal_reloc *irelend;
-         struct coff_link_hash_entry **rel_hash;
-         bfd_byte *erel;
-
-         if (o->reloc_count == 0)
-           continue;
-
-         irel = flaginfo.section_info[o->target_index].relocs;
-         irelend = irel + o->reloc_count;
-         rel_hash = flaginfo.section_info[o->target_index].rel_hashes;
-         erel = external_relocs;
-         for (; irel < irelend; irel++, rel_hash++, erel += relsz)
-           {
-             if (*rel_hash != NULL)
-               {
-                 BFD_ASSERT ((*rel_hash)->indx >= 0);
-                 irel->r_symndx = (*rel_hash)->indx;
-               }
-             bfd_coff_swap_reloc_out (abfd, irel, erel);
-           }
-
-         amt = relsz * o->reloc_count;
-         if (bfd_seek (abfd, o->rel_filepos, SEEK_SET) != 0
-             || bfd_bwrite (external_relocs, amt, abfd) != amt)
-           goto error_return;
-       }
-
-      free (external_relocs);
-      external_relocs = NULL;
-    }
-
-  /* Free up the section information.  */
-  if (flaginfo.section_info != NULL)
-    {
-      unsigned int i;
-
-      for (i = 0; i < abfd->section_count; i++)
-       {
-         free (flaginfo.section_info[i].relocs);
-         free (flaginfo.section_info[i].rel_hashes);
-       }
-      free (flaginfo.section_info);
-      flaginfo.section_info = NULL;
-    }
-
-  /* If we have optimized stabs strings, output them.  */
-  if (coff_hash_table (info)->stab_info.stabstr != NULL)
-    {
-      if (! _bfd_write_stab_strings (abfd, &coff_hash_table (info)->stab_info))
-       return FALSE;
-    }
-
-  /* Write out the string table.  */
-  if (obj_raw_syment_count (abfd) != 0)
-    {
-      file_ptr pos;
-
-      pos = obj_sym_filepos (abfd) + obj_raw_syment_count (abfd) * symesz;
-      if (bfd_seek (abfd, pos, SEEK_SET) != 0)
-       return FALSE;
-
-#if STRING_SIZE_SIZE == 4
-      H_PUT_32 (abfd,
-               _bfd_stringtab_size (flaginfo.strtab) + STRING_SIZE_SIZE,
-               strbuf);
-#else
- #error Change H_PUT_32 above
-#endif
-
-      if (bfd_bwrite (strbuf, (bfd_size_type) STRING_SIZE_SIZE, abfd)
-         != STRING_SIZE_SIZE)
-       return FALSE;
-
-      if (! _bfd_stringtab_emit (abfd, flaginfo.strtab))
-       return FALSE;
-    }
-
-  _bfd_stringtab_free (flaginfo.strtab);
-
-  /* Setting symcount to 0 will cause write_object_contents to
-     not try to write out the symbols.  */
-  abfd->symcount = 0;
-
-  return TRUE;
-
- error_return:
-  if (debug_merge_allocated)
-    coff_debug_merge_hash_table_free (&flaginfo.debug_merge);
-  if (flaginfo.strtab != NULL)
-    _bfd_stringtab_free (flaginfo.strtab);
-  if (flaginfo.section_info != NULL)
-    {
-      unsigned int i;
-
-      for (i = 0; i < abfd->section_count; i++)
-       {
-         free (flaginfo.section_info[i].relocs);
-         free (flaginfo.section_info[i].rel_hashes);
-       }
-      free (flaginfo.section_info);
-    }
-  free (flaginfo.internal_syms);
-  free (flaginfo.sec_ptrs);
-  free (flaginfo.sym_indices);
-  free (flaginfo.outsyms);
-  free (flaginfo.linenos);
-  free (flaginfo.contents);
-  free (flaginfo.external_relocs);
-  free (flaginfo.internal_relocs);
-  free (external_relocs);
-  return FALSE;
-}
-#endif
-\f
-/* Forward declaration for use by alternative_target field.  */
-#ifdef TARGET_BIG_SYM
-extern const bfd_target TARGET_BIG_SYM;
-#endif
-
-/* The transfer vectors that lead the outside world to all of the above.  */
-
-#ifdef TARGET_LITTLE_SYM
-const bfd_target TARGET_LITTLE_SYM =
-{
-  TARGET_LITTLE_NAME,          /* name or coff-arm-little */
-  bfd_target_coff_flavour,
-  BFD_ENDIAN_LITTLE,           /* data byte order is little */
-  BFD_ENDIAN_LITTLE,           /* header byte order is little */
-
-  (HAS_RELOC | EXEC_P          /* FIXME: object flags */
-   | HAS_LINENO | HAS_DEBUG
-   | HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED),
-
-#ifndef COFF_WITH_PE
-  (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_READONLY
-   | SEC_RELOC),               /* section flags */
-#else
-  (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_READONLY
-   | SEC_RELOC | SEC_LINK_ONCE | SEC_LINK_DUPLICATES),
-#endif
-
-  0,                           /* leading char */
-  '/',                         /* ar_pad_char */
-  15,                          /* ar_max_namelen??? FIXMEmgo */
-  0,                           /* match priority.  */
-
-  bfd_getl64, bfd_getl_signed_64, bfd_putl64,
-  bfd_getl32, bfd_getl_signed_32, bfd_putl32,
-  bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */
-
-  bfd_getl64, bfd_getl_signed_64, bfd_putl64,
-  bfd_getl32, bfd_getl_signed_32, bfd_putl32,
-  bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* hdrs */
-
-  {                            /* bfd_check_format */
-    _bfd_dummy_target,
-    coff_object_p,
-    bfd_generic_archive_p,
-    coff_object_p
-  },
-  {                            /* bfd_set_format */
-    _bfd_bool_bfd_false_error,
-    coff_mkobject,
-    _bfd_generic_mkarchive,
-    _bfd_bool_bfd_false_error
-  },
-  {                            /* bfd_write_contents */
-    _bfd_bool_bfd_false_error,
-    coff_write_object_contents,
-    _bfd_write_archive_contents,
-    _bfd_bool_bfd_false_error
-  },
-
-  BFD_JUMP_TABLE_GENERIC (coff),
-  BFD_JUMP_TABLE_COPY (coff),
-  BFD_JUMP_TABLE_CORE (_bfd_nocore),
-  BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),
-  BFD_JUMP_TABLE_SYMBOLS (coff),
-  BFD_JUMP_TABLE_RELOCS (coff),
-  BFD_JUMP_TABLE_WRITE (coff),
-  BFD_JUMP_TABLE_LINK (coff),
-  BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
-
-  /* Alternative_target.  */
-#ifdef TARGET_BIG_SYM
-  &TARGET_BIG_SYM,
-#else
-  NULL,
-#endif
-
-  COFF_SWAP_TABLE
-};
-#endif
-
-#ifdef TARGET_BIG_SYM
-const bfd_target TARGET_BIG_SYM =
-{
-  TARGET_BIG_NAME,
-  bfd_target_coff_flavour,
-  BFD_ENDIAN_BIG,              /* data byte order is big */
-  BFD_ENDIAN_BIG,              /* header byte order is big */
-
-  (HAS_RELOC | EXEC_P          /* FIXME: object flags */
-   | HAS_LINENO | HAS_DEBUG
-   | HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED),
-
-#ifndef COFF_WITH_PE
-  (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_READONLY
-   | SEC_RELOC),               /* section flags */
-#else
-  (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_READONLY
-   | SEC_RELOC | SEC_LINK_ONCE | SEC_LINK_DUPLICATES),
-#endif
-
-  0,                           /* leading char */
-  '/',                         /* ar_pad_char */
-  15,                          /* ar_max_namelen??? FIXMEmgo */
-  0,                           /* match priority.  */
-
-  bfd_getb64, bfd_getb_signed_64, bfd_putb64,
-  bfd_getb32, bfd_getb_signed_32, bfd_putb32,
-  bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* data */
-
-  bfd_getb64, bfd_getb_signed_64, bfd_putb64,
-  bfd_getb32, bfd_getb_signed_32, bfd_putb32,
-  bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* hdrs */
-
-  {                            /* bfd_check_format */
-    _bfd_dummy_target,
-    coff_object_p,
-    bfd_generic_archive_p,
-    coff_object_p
-  },
-  {                            /* bfd_set_format */
-    _bfd_bool_bfd_false_error,
-    coff_mkobject,
-    _bfd_generic_mkarchive,
-    _bfd_bool_bfd_false_error
-  },
-  {                            /* bfd_write_contents */
-    _bfd_bool_bfd_false_error,
-    coff_write_object_contents,
-    _bfd_write_archive_contents,
-    _bfd_bool_bfd_false_error
-  },
-
-  BFD_JUMP_TABLE_GENERIC (coff),
-  BFD_JUMP_TABLE_COPY (coff),
-  BFD_JUMP_TABLE_CORE (_bfd_nocore),
-  BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),
-  BFD_JUMP_TABLE_SYMBOLS (coff),
-  BFD_JUMP_TABLE_RELOCS (coff),
-  BFD_JUMP_TABLE_WRITE (coff),
-  BFD_JUMP_TABLE_LINK (coff),
-  BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
-
-  /* Alternative_target.  */
-#ifdef TARGET_LITTLE_SYM
-  &TARGET_LITTLE_SYM,
-#else
-  NULL,
-#endif
-
-  COFF_SWAP_TABLE
-};
-
-#endif
index 0910f918d13bf46394e3d3f3da40055fd2aa7a79..4b934b9b2b96fb29f1e42e1d214f95720a12e07b 100644 (file)
@@ -2136,11 +2136,6 @@ coff_set_arch_mach_hook (bfd *abfd, void * filehdr)
   machine = 0;
   switch (internal_f->f_magic)
     {
-#ifdef PPCMAGIC
-    case PPCMAGIC:
-      arch = bfd_arch_powerpc;
-      break;
-#endif
 #ifdef I386MAGIC
     case I386MAGIC:
     case I386PTXMAGIC:
@@ -2790,12 +2785,6 @@ coff_set_flags (bfd * abfd,
       return TRUE;
 #endif
 
-#ifdef PPCMAGIC
-    case bfd_arch_powerpc:
-      *magicp = PPCMAGIC;
-      return TRUE;
-#endif
-
 #if defined(I386MAGIC) || defined(AMD64MAGIC)
     case bfd_arch_i386:
 #if defined(I386MAGIC)
@@ -2848,9 +2837,7 @@ coff_set_flags (bfd * abfd,
 
 #ifdef RS6000COFF_C
     case bfd_arch_rs6000:
-#ifndef PPCMAGIC
     case bfd_arch_powerpc:
-#endif
       BFD_ASSERT (bfd_get_flavour (abfd) == bfd_target_xcoff_flavour);
       *magicp = bfd_xcoff_magic_number (abfd);
       return TRUE;
@@ -3890,11 +3877,6 @@ coff_write_object_contents (bfd * abfd)
     internal_a.magic = ZMAGIC;
 #endif
 
-#if defined(PPC_PE)
-#define __A_MAGIC_SET__
-    internal_a.magic = IMAGE_NT_OPTIONAL_HDR_MAGIC;
-#endif
-
 #if defined MCORE_PE
 #define __A_MAGIC_SET__
     internal_a.magic = IMAGE_NT_OPTIONAL_HDR_MAGIC;
@@ -3976,24 +3958,6 @@ coff_write_object_contents (bfd * abfd)
        return FALSE;
     }
 #endif
-#ifdef COFF_IMAGE_WITH_PE
-#ifdef PPC_PE
-  else if ((abfd->flags & EXEC_P) != 0)
-    {
-      bfd_byte b;
-
-      /* PowerPC PE appears to require that all executable files be
-        rounded up to the page size.  */
-      b = 0;
-      if (bfd_seek (abfd,
-                   (file_ptr) BFD_ALIGN (sym_base, COFF_PAGE_SIZE) - 1,
-                   SEEK_SET) != 0
-         || bfd_bwrite (&b, (bfd_size_type) 1, abfd) != 1)
-       return FALSE;
-    }
-#endif
-#endif
-
   /* If bfd_get_symcount (abfd) != 0, then we are not using the COFF
      backend linker, and obj_raw_syment_count is not valid until after
      coff_write_symbols is called.  */
index 14523caf0c5f17b3f0f33706d502c247ed42dec9..4586a89d0f97b411bed19f2f0af9094c432c7ede 100644 (file)
@@ -53,7 +53,6 @@ case $targ in
     echo "*** Use or1k-*-elf or or1k-*-linux as the target instead" >&2
     exit 1
     ;;
- powerpcle-*-pe | powerpcle-*-winnt* | powerpcle-*-cygwin* | \
  xc16x-*-* | \
  null)
     if test "x$enable_obsolete" != xyes; then
@@ -143,6 +142,7 @@ case $targ in
  mips*-sgi-* | \
  mips*el-*-rtems* | \
  powerpc-*-lynxos* | powerpc-*-windiss* | \
+ powerpcle-*-pe | powerpcle-*-winnt* | powerpcle-*-cygwin* | \
  sh*-*-symbianelf* | sh5*-*-* | sh64*-*-* | \
  sparc*-*-*aout* | \
  sparc*-*-chorus* | \
@@ -1145,10 +1145,6 @@ case "${targ}" in
     targ_selvecs="rs6000_xcoff_vec powerpc_elf32_vec powerpc_boot_vec"
     targ64_selvecs="powerpc_elf64_vec powerpc_elf64_le_vec"
     ;;
-  powerpcle-*-pe | powerpcle-*-winnt* | powerpcle-*-cygwin*)
-    targ_defvec=powerpc_pe_le_vec
-    targ_selvecs="powerpc_pei_le_vec powerpc_pei_vec powerpc_pe_le_vec powerpc_pe_vec"
-    ;;
 
   pru-*-*)
     targ_defvec=pru_elf32_vec
index 47fd4576cabd413c963a1eede0eac936a0c8328b..ca255aaa55d41f43b627e26a94dfeaa6e0e43eaf 100755 (executable)
     powerpc_elf64_vec)          tb="$tb elf64-ppc.lo elf64-gen.lo elf64.lo $elf"; target_size=64 ;;
     powerpc_elf64_le_vec)       tb="$tb elf64-ppc.lo elf64-gen.lo elf64.lo $elf" target_size=64 ;;
     powerpc_elf64_fbsd_vec)     tb="$tb elf64-ppc.lo elf64-gen.lo elf64.lo $elf" target_size=64 ;;
-    powerpc_pe_vec)             tb="$tb pe-ppc.lo peigen.lo $coff" ;;
-    powerpc_pe_le_vec)          tb="$tb pe-ppc.lo peigen.lo $coff" ;;
-    powerpc_pei_vec)            tb="$tb pei-ppc.lo peigen.lo $coff" ;;
-    powerpc_pei_le_vec)                 tb="$tb pei-ppc.lo peigen.lo $coff" ;;
     powerpc_xcoff_vec)          tb="$tb coff-rs6000.lo $xcoff" ;;
     pru_elf32_vec)              tb="$tb elf32-pru.lo elf32.lo $elf" ;;
     riscv_elf32_vec)            tb="$tb elf32-riscv.lo elfxx-riscv.lo elf32.lo $elf" ;;
index 8e86f8399ce0bd366d18416aed09ec425f1217d2..ee3075aca34ae37871578e77101b1d548f0a0d6f 100644 (file)
@@ -619,10 +619,6 @@ do
     powerpc_elf64_vec)          tb="$tb elf64-ppc.lo elf64-gen.lo elf64.lo $elf"; target_size=64 ;;
     powerpc_elf64_le_vec)       tb="$tb elf64-ppc.lo elf64-gen.lo elf64.lo $elf" target_size=64 ;;
     powerpc_elf64_fbsd_vec)     tb="$tb elf64-ppc.lo elf64-gen.lo elf64.lo $elf" target_size=64 ;;
-    powerpc_pe_vec)             tb="$tb pe-ppc.lo peigen.lo $coff" ;;
-    powerpc_pe_le_vec)          tb="$tb pe-ppc.lo peigen.lo $coff" ;;
-    powerpc_pei_vec)            tb="$tb pei-ppc.lo peigen.lo $coff" ;;
-    powerpc_pei_le_vec)                 tb="$tb pei-ppc.lo peigen.lo $coff" ;;
     powerpc_xcoff_vec)          tb="$tb coff-rs6000.lo $xcoff" ;;
     pru_elf32_vec)              tb="$tb elf32-pru.lo elf32.lo $elf" ;;
     riscv_elf32_vec)            tb="$tb elf32-riscv.lo elfxx-riscv.lo elf32.lo $elf" ;;
index b7fcea30bb4754d72bea70206fd7f8218e57317f..aa5edc2e96286e5215bb47ddd3878bd08424b6ab 100644 (file)
@@ -616,11 +616,3 @@ extern bfd_boolean _bfd_xcoff_define_common_symbol
 extern bfd_boolean _bfd_ppc_xcoff_relocate_section
   (bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
    struct internal_reloc *, struct internal_syment *, asection **);
-
-/* Functions in coff-ppc.c.  FIXME: These are called by pe.em in the
-   linker, and so should start with bfd and be declared in bfd.h.  */
-
-extern bfd_boolean ppc_allocate_toc_section
-  (struct bfd_link_info *);
-extern bfd_boolean ppc_process_before_allocation
-  (bfd *, struct bfd_link_info *);
index df32c8604ec090b373df036b17e719d8acf4c934..514cec11499b901e2e895a155d8db429b077d354 100644 (file)
@@ -620,14 +620,6 @@ extern bfd_boolean _bfd_xcoff_define_common_symbol
 extern bfd_boolean _bfd_ppc_xcoff_relocate_section
   (bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
    struct internal_reloc *, struct internal_syment *, asection **);
-
-/* Functions in coff-ppc.c.  FIXME: These are called by pe.em in the
-   linker, and so should start with bfd and be declared in bfd.h.  */
-
-extern bfd_boolean ppc_allocate_toc_section
-  (struct bfd_link_info *);
-extern bfd_boolean ppc_process_before_allocation
-  (bfd *, struct bfd_link_info *);
 /* Extracted from coffcode.h.  */
 
 typedef struct coff_ptr_struct
diff --git a/bfd/pe-ppc.c b/bfd/pe-ppc.c
deleted file mode 100644 (file)
index 1832576..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-/* BFD back-end for PowerPC PECOFF files.
-   Copyright (C) 1995-2020 Free Software Foundation, Inc.
-
-   This file is part of BFD, the Binary File Descriptor library.
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   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
-   Foundation, 51 Franklin Street - Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
-
-#include "sysdep.h"
-#include "bfd.h"
-
-#define E_FILENMLEN     18
-
-#define PPC_PE
-
-#define TARGET_LITTLE_SYM   powerpc_pe_le_vec
-#define TARGET_LITTLE_NAME "pe-powerpcle"
-
-#define TARGET_BIG_SYM      powerpc_pe_vec
-#define TARGET_BIG_NAME    "pe-powerpc"
-
-#define COFF_WITH_PE
-
-#define COFF_LONG_SECTION_NAMES
-
-/* FIXME: verify PCRELOFFSET is always false */
-
-/* FIXME: This target no longer works.  Search for POWERPC_LE_PE in
-   coff-ppc.c and peigen.c.  */
-
-#ifndef bfd_pe_print_pdata
-#define bfd_pe_print_pdata     NULL
-#endif
-
-#include "coff-ppc.c"
index 5149ef582bf6dea0ad176e441b0041ae4234248a..3c3fa27e02004d944c75a60f2e6e40ace1aea563 100644 (file)
 #define HighBitSet(val)      ((val) & 0x80000000)
 #define SetHighBit(val)      ((val) | 0x80000000)
 #define WithoutHighBit(val)  ((val) & 0x7fffffff)
-
-/* FIXME: This file has various tests of POWERPC_LE_PE.  Those tests
-   worked when the code was in peicode.h, but no longer work now that
-   the code is in peigen.c.  PowerPC NT is said to be dead.  If
-   anybody wants to revive the code, you will have to figure out how
-   to handle those issues.  */
 \f
 void
 _bfd_XXi_swap_sym_in (bfd * abfd, void * ext1, void * in1)
@@ -222,12 +216,6 @@ _bfd_XXi_swap_sym_in (bfd * abfd, void * ext1, void * in1)
       in->n_sclass = C_STAT;
     }
 #endif
-
-#ifdef coff_swap_sym_in_hook
-  /* This won't work in peigen.c, but since it's for PPC PE, it's not
-     worth fixing.  */
-  coff_swap_sym_in_hook (abfd, ext1, in1);
-#endif
 }
 
 static bfd_boolean
@@ -592,15 +580,6 @@ _bfd_XXi_swap_aouthdr_in (bfd * abfd,
       aouthdr_int->data_start &= 0xffffffff;
     }
 #endif
-
-#ifdef POWERPC_LE_PE
-  /* These three fields are normally set up by ppc_relocate_section.
-     In the case of reading a file in, we can pick them up from the
-     DataDirectory.  */
-  first_thunk_address = a->DataDirectory[PE_IMPORT_ADDRESS_TABLE].VirtualAddress;
-  thunk_size = a->DataDirectory[PE_IMPORT_ADDRESS_TABLE].Size;
-  import_table_size = a->DataDirectory[PE_IMPORT_TABLE].Size;
-#endif
 }
 
 /* A support function for below.  */
@@ -1010,7 +989,7 @@ _bfd_XXi_swap_scnhdr_out (bfd * abfd, void * in, void * out)
        (0x02000000).  Also, the resource data should also be read and
        writable.  */
 
-    /* FIXME: Alignment is also encoded in this field, at least on PPC and
+    /* FIXME: Alignment is also encoded in this field, at least on
        ARM-WINCE.  Although - how do we get the original alignment field
        back ?  */
 
@@ -1256,14 +1235,6 @@ static char * dir_names[IMAGE_NUMBEROF_DIRECTORY_ENTRIES] =
   N_("Reserved")
 };
 
-#ifdef POWERPC_LE_PE
-/* The code for the PPC really falls in the "architecture dependent"
-   category.  However, it's not clear that anyone will ever care, so
-   we're ignoring the issue for now; if/when PPC matters, some of this
-   may need to go into peicode.h, or arguments passed to enable the
-   PPC- specific code.  */
-#endif
-
 static bfd_boolean
 pe_print_idata (bfd * abfd, void * vfile)
 {
@@ -1271,11 +1242,6 @@ pe_print_idata (bfd * abfd, void * vfile)
   bfd_byte *data;
   asection *section;
   bfd_signed_vma adj;
-
-#ifdef POWERPC_LE_PE
-  asection *rel_section = bfd_get_section_by_name (abfd, ".reldata");
-#endif
-
   bfd_size_type datasize = 0;
   bfd_size_type dataoff;
   bfd_size_type i;
@@ -1331,56 +1297,6 @@ pe_print_idata (bfd * abfd, void * vfile)
 
   dataoff = addr - section->vma;
 
-#ifdef POWERPC_LE_PE
-  if (rel_section != 0 && rel_section->size != 0)
-    {
-      /* The toc address can be found by taking the starting address,
-        which on the PPC locates a function descriptor. The
-        descriptor consists of the function code starting address
-        followed by the address of the toc. The starting address we
-        get from the bfd, and the descriptor is supposed to be in the
-        .reldata section.  */
-
-      bfd_vma loadable_toc_address;
-      bfd_vma toc_address;
-      bfd_vma start_address;
-      bfd_byte *data;
-      bfd_vma offset;
-
-      if (!bfd_malloc_and_get_section (abfd, rel_section, &data))
-       {
-         free (data);
-         return FALSE;
-       }
-
-      offset = abfd->start_address - rel_section->vma;
-
-      if (offset >= rel_section->size || offset + 8 > rel_section->size)
-       {
-         free (data);
-         return FALSE;
-       }
-
-      start_address = bfd_get_32 (abfd, data + offset);
-      loadable_toc_address = bfd_get_32 (abfd, data + offset + 4);
-      toc_address = loadable_toc_address - 32768;
-
-      fprintf (file,
-              _("\nFunction descriptor located at the start address: %04lx\n"),
-              (unsigned long int) (abfd->start_address));
-      fprintf (file,
-              /* xgettext:c-format */
-              _("\tcode-base %08lx toc (loadable/actual) %08lx/%08lx\n"),
-              start_address, loadable_toc_address, toc_address);
-      free (data);
-    }
-  else
-    {
-      fprintf (file,
-              _("\nNo reldata section! Function descriptor not decoded.\n"));
-    }
-#endif
-
   fprintf (file,
           _("\nThe Import Tables (interpreted %s section contents)\n"),
           section->name);
@@ -1985,33 +1901,6 @@ pe_print_pdata (bfd * abfd, void * vfile)
       bfd_fprintf_vma (abfd, file, prolog_end_addr);
       fprintf (file, "   %x", em_data);
 #endif
-
-#ifdef POWERPC_LE_PE
-      if (eh_handler == 0 && eh_data != 0)
-       {
-         /* Special bits here, although the meaning may be a little
-            mysterious. The only one I know for sure is 0x03
-            Code Significance
-            0x00 None
-            0x01 Register Save Millicode
-            0x02 Register Restore Millicode
-            0x03 Glue Code Sequence.  */
-         switch (eh_data)
-           {
-           case 0x01:
-             fprintf (file, _(" Register save millicode"));
-             break;
-           case 0x02:
-             fprintf (file, _(" Register restore millicode"));
-             break;
-           case 0x03:
-             fprintf (file, _(" Glue code sequence"));
-             break;
-           default:
-             break;
-           }
-       }
-#endif
       fprintf (file, "\n");
     }
 
diff --git a/bfd/pei-ppc.c b/bfd/pei-ppc.c
deleted file mode 100644 (file)
index b39c11e..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-/* BFD back-end for PowerPC PE IMAGE COFF files.
-   Copyright (C) 1995-2020 Free Software Foundation, Inc.
-
-   This file is part of BFD, the Binary File Descriptor library.
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   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
-   Foundation, 51 Franklin Street - Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
-
-#include "sysdep.h"
-#include "bfd.h"
-
-/* setting up for a PE environment stolen directly from the i386 structure */
-#define E_FILNMLEN     18      /* # characters in a file name          */
-
-#define PPC_PE
-
-#define TARGET_LITTLE_SYM   powerpc_pei_le_vec
-#define TARGET_LITTLE_NAME "pei-powerpcle"
-
-#define TARGET_BIG_SYM      powerpc_pei_vec
-#define TARGET_BIG_NAME    "pei-powerpc"
-
-#define COFF_IMAGE_WITH_PE
-#define COFF_WITH_PE
-
-/* Long section names not allowed in executable images, only object files.  */
-#define COFF_LONG_SECTION_NAMES 0
-
-/* FIXME: Verify PCRELOFFSET is always false */
-
-/* FIXME: This target no longer works.  Search for POWERPC_LE_PE in
-   coff-ppc.c and peigen.c.  */
-
-#ifndef bfd_pe_print_pdata
-#define bfd_pe_print_pdata     NULL
-#endif
-
-#include "coff-ppc.c"
index 1e12399903db2fc8d6e5873a2bfffc65a0c54f86..83530b27f23e48f062499638883ffeb0e97a5a8e 100644 (file)
@@ -314,7 +314,6 @@ pe-arm-wince.c
 pe-arm.c
 pe-i386.c
 pe-mcore.c
-pe-ppc.c
 pe-sh.c
 pe-x86_64.c
 pef-traceback.h
@@ -325,7 +324,6 @@ pei-arm.c
 pei-i386.c
 pei-ia64.c
 pei-mcore.c
-pei-ppc.c
 pei-sh.c
 pei-x86_64.c
 peicode.h
index 0732c5e4292aa04fcf1ed25de113d27c06a5d485..35492b92bbecc0f8359ee1a2ef872de69cd91724 100644 (file)
@@ -838,10 +838,6 @@ extern const bfd_target powerpc_elf32_vxworks_vec;
 extern const bfd_target powerpc_elf64_vec;
 extern const bfd_target powerpc_elf64_le_vec;
 extern const bfd_target powerpc_elf64_fbsd_vec;
-extern const bfd_target powerpc_pe_vec;
-extern const bfd_target powerpc_pe_le_vec;
-extern const bfd_target powerpc_pei_vec;
-extern const bfd_target powerpc_pei_le_vec;
 extern const bfd_target powerpc_xcoff_vec;
 extern const bfd_target pru_elf32_vec;
 extern const bfd_target riscv_elf32_vec;
@@ -1229,10 +1225,6 @@ static const bfd_target * const _bfd_target_vector[] =
        &powerpc_elf64_le_vec,
        &powerpc_elf64_fbsd_vec,
 #endif
-       &powerpc_pe_vec,
-       &powerpc_pe_le_vec,
-       &powerpc_pei_vec,
-       &powerpc_pei_le_vec,
 #if 0
        /* This has the same magic number as RS/6000.  */
        &powerpc_xcoff_vec,
index 9f6be43f0cfaa5e56a5e8fd6be911cd17c13b1d8..9bb68e6991eec12fbba096160d4b08691427f80c 100644 (file)
@@ -1,3 +1,9 @@
+2020-07-09  Alan Modra  <amodra@gmail.com>
+
+       * dlltool.c: Remove powerpc PE support and comments.
+       * configure.ac: Remove powerpc PE dlltool config.
+       * configure: Regenerate.
+
 2020-07-09  Nick Clifton  <nickc@redhat.com>
 
        * rclex.c: Add OWNERDRAW keyword.
index 834527995c1ed03b137f036c025932b76b2c3fdf..da7da53f1dedb034efecc8aa3fff7b2f33cb393d 100755 (executable)
        powerpc*-aix[5-9].*)
          OBJDUMP_DEFS="-DAIX_WEAK_SUPPORT"
          ;;
-       powerpc*-*-pe* | powerpc*-*-cygwin*)
-         BUILD_DLLTOOL='$(DLLTOOL_PROG)$(EXEEXT)'
-         if test -z "$DLLTOOL_DEFAULT"; then
-           DLLTOOL_DEFAULT="-DDLLTOOL_DEFAULT_PPC"
-         fi
-         DLLTOOL_DEFS="$DLLTOOL_DEFS -DDLLTOOL_PPC"
-         BUILD_WINDRES='$(WINDRES_PROG)$(EXEEXT)'
-         BUILD_WINDMC='$(WINDMC_PROG)$(EXEEXT)'
-         ;;
        powerpc*-*-linux* | powerpc*-*-elf* | powerpc*-*-eabi*)
          case "$BUILD_INSTALL_MISC" in
            *embedspu*) ;;
index 4ac1f34a6d200d51c4eca2118d1a7b350cf20f45..883f3187e722ec7cf6bdf05b24c4f6f958f97e18 100644 (file)
@@ -330,15 +330,6 @@ changequote(,)dnl
 changequote([,])dnl
          OBJDUMP_DEFS="-DAIX_WEAK_SUPPORT"
          ;;
-       powerpc*-*-pe* | powerpc*-*-cygwin*)
-         BUILD_DLLTOOL='$(DLLTOOL_PROG)$(EXEEXT)'
-         if test -z "$DLLTOOL_DEFAULT"; then
-           DLLTOOL_DEFAULT="-DDLLTOOL_DEFAULT_PPC"
-         fi
-         DLLTOOL_DEFS="$DLLTOOL_DEFS -DDLLTOOL_PPC"
-         BUILD_WINDRES='$(WINDRES_PROG)$(EXEEXT)'
-         BUILD_WINDMC='$(WINDMC_PROG)$(EXEEXT)'
-         ;;
        powerpc*-*-linux* | powerpc*-*-elf* | powerpc*-*-eabi*)
          case "$BUILD_INSTALL_MISC" in
            *embedspu*) ;;
index d22ff54e098a19551ebab7ba8e2a02cf18002c00..ed016b97dc38cdb1b85d2f6df676b9c9750f0d41 100644 (file)
    = Array of { short, asciz } entries, one for each imported function.
    The `short' is the function's ordinal number.
 
-   .idata$7 = dll name (eg: "kernel32.dll"). (.idata$6 for ppc).  */
+   .idata$7 = dll name (eg: "kernel32.dll").  */
 
 #include "sysdep.h"
 #include "bfd.h"
@@ -449,10 +449,6 @@ static const char *mname = "i386";
 static const char *mname = "i386:x86-64";
 #endif
 
-#ifdef DLLTOOL_DEFAULT_PPC
-static const char *mname = "ppc";
-#endif
-
 #ifdef DLLTOOL_DEFAULT_SH
 static const char *mname = "sh";
 #endif
@@ -563,28 +559,6 @@ static const unsigned char mcore_le_jtab[] =
   0x00, 0x00, 0x00, 0x00 /* <address>      */
 };
 
-/* This is the glue sequence for PowerPC PE. There is a
-   tocrel16-tocdefn reloc against the first instruction.
-   We also need a IMGLUE reloc against the glue function
-   to restore the toc saved by the third instruction in
-   the glue.  */
-static const unsigned char ppc_jtab[] =
-{
-  0x00, 0x00, 0x62, 0x81, /* lwz r11,0(r2)               */
-                          /*   Reloc TOCREL16 __imp_xxx  */
-  0x00, 0x00, 0x8B, 0x81, /* lwz r12,0(r11)              */
-  0x04, 0x00, 0x41, 0x90, /* stw r2,4(r1)                */
-  0xA6, 0x03, 0x89, 0x7D, /* mtctr r12                   */
-  0x04, 0x00, 0x4B, 0x80, /* lwz r2,4(r11)               */
-  0x20, 0x04, 0x80, 0x4E  /* bctr                        */
-};
-
-#ifdef DLLTOOL_PPC
-/* The glue instruction, picks up the toc from the stw in
-   the above code: "lwz r2,4(r1)".  */
-static bfd_vma ppc_glue_insn = 0x80410004;
-#endif
-
 static const char i386_trampoline[] =
   "\tpushl %%ecx\n"
   "\tpushl %%edx\n"
@@ -661,16 +635,7 @@ mtable[] =
   }
   ,
   {
-#define MPPC 2
-    "ppc", ".byte", ".short", ".long", ".asciz", "#",
-    "jmp *", ".global", ".space", ".align\t2",".align\t4", "",
-    "pe-powerpcle",bfd_arch_powerpc,
-    ppc_jtab, sizeof (ppc_jtab), 0,
-    0, 0, 0, 0, 0, 0
-  }
-  ,
-  {
-#define MTHUMB 3
+#define MTHUMB 2
     "thumb", ".byte", ".short", ".long", ".asciz", "@",
     "push\t{r6}\n\tldr\tr6, [pc, #8]\n\tldr\tr6, [r6]\n\tmov\tip, r6\n\tpop\t{r6}\n\tbx\tip",
     ".global", ".space", ".align\t2",".align\t4", "-mthumb-interwork",
@@ -679,7 +644,7 @@ mtable[] =
     0, 0, 0, 0, 0, 0
   }
   ,
-#define MARM_INTERWORK 4
+#define MARM_INTERWORK 3
   {
     "arm_interwork", ".byte", ".short", ".long", ".asciz", "@",
     "ldr\tip,[pc]\n\tldr\tip,[ip]\n\tbx\tip\n\t.long",
@@ -690,7 +655,7 @@ mtable[] =
   }
   ,
   {
-#define MMCORE_BE 5
+#define MMCORE_BE 4
     "mcore-be", ".byte", ".short", ".long", ".asciz", "//",
     "lrw r1,[1f]\n\tld.w r1,(r1,0)\n\tjmp r1\n\tnop\n1:.long",
     ".global", ".space", ".align\t2",".align\t4", "",
@@ -700,7 +665,7 @@ mtable[] =
   }
   ,
   {
-#define MMCORE_LE 6
+#define MMCORE_LE 5
     "mcore-le", ".byte", ".short", ".long", ".asciz", "//",
     "lrw r1,[1f]\n\tld.w r1,(r1,0)\n\tjmp r1\n\tnop\n1:.long",
     ".global", ".space", ".align\t2",".align\t4", "-EL",
@@ -710,7 +675,7 @@ mtable[] =
   }
   ,
   {
-#define MMCORE_ELF 7
+#define MMCORE_ELF 6
     "mcore-elf-be", ".byte", ".short", ".long", ".asciz", "//",
     "lrw r1,[1f]\n\tld.w r1,(r1,0)\n\tjmp r1\n\tnop\n1:.long",
     ".global", ".space", ".align\t2",".align\t4", "",
@@ -720,7 +685,7 @@ mtable[] =
   }
   ,
   {
-#define MMCORE_ELF_LE 8
+#define MMCORE_ELF_LE 7
     "mcore-elf-le", ".byte", ".short", ".long", ".asciz", "//",
     "lrw r1,[1f]\n\tld.w r1,(r1,0)\n\tjmp r1\n\tnop\n1:.long",
     ".global", ".space", ".align\t2",".align\t4", "-EL",
@@ -730,7 +695,7 @@ mtable[] =
   }
   ,
   {
-#define MARM_WINCE 9
+#define MARM_WINCE 8
     "arm-wince", ".byte", ".short", ".long", ".asciz", "@",
     "ldr\tip,[pc]\n\tldr\tpc,[ip]\n\t.long",
     ".global", ".space", ".align\t2",".align\t4", "-mapcs-32",
@@ -740,7 +705,7 @@ mtable[] =
   }
   ,
   {
-#define MX86 10
+#define MX86 9
     "i386:x86-64", ".byte", ".short", ".long", ".asciz", "#",
     "jmp *", ".global", ".space", ".align\t2",".align\t4", "",
     "pe-x86-64",bfd_arch_i386,
@@ -888,7 +853,6 @@ rvaafter (int mach)
     case MARM:
     case M386:
     case MX86:
-    case MPPC:
     case MTHUMB:
     case MARM_INTERWORK:
     case MMCORE_BE:
@@ -913,7 +877,6 @@ rvabefore (int mach)
     case MARM:
     case M386:
     case MX86:
-    case MPPC:
     case MTHUMB:
     case MARM_INTERWORK:
     case MMCORE_BE:
@@ -936,7 +899,6 @@ asm_prefix (int mach, const char *name)
   switch (mach)
     {
     case MARM:
-    case MPPC:
     case MTHUMB:
     case MARM_INTERWORK:
     case MMCORE_BE:
@@ -2296,8 +2258,6 @@ typedef struct
 #define INIT_SEC_DATA(id, name, flags, align) \
         { id, name, flags, align, NULL, NULL, NULL, 0, NULL }
 
-#ifndef DLLTOOL_PPC
-
 #define TEXT 0
 #define DATA 1
 #define BSS 2
@@ -2324,37 +2284,6 @@ static sinfo secdata[NSECS] =
   INIT_SEC_DATA (IDATA6, ".idata$6", SEC_HAS_CONTENTS, 1)
 };
 
-#else
-
-/* Sections numbered to make the order the same as other PowerPC NT
-   compilers. This also keeps funny alignment thingies from happening.  */
-#define TEXT   0
-#define PDATA  1
-#define RDATA  2
-#define IDATA5 3
-#define IDATA4 4
-#define IDATA6 5
-#define IDATA7 6
-#define DATA   7
-#define BSS    8
-
-#define NSECS 9
-
-static sinfo secdata[NSECS] =
-{
-  INIT_SEC_DATA (TEXT,   ".text",    SEC_CODE | SEC_HAS_CONTENTS, 3),
-  INIT_SEC_DATA (PDATA,  ".pdata",   SEC_HAS_CONTENTS,            2),
-  INIT_SEC_DATA (RDATA,  ".reldata", SEC_HAS_CONTENTS,            2),
-  INIT_SEC_DATA (IDATA5, ".idata$5", SEC_HAS_CONTENTS,            2),
-  INIT_SEC_DATA (IDATA4, ".idata$4", SEC_HAS_CONTENTS,            2),
-  INIT_SEC_DATA (IDATA6, ".idata$6", SEC_HAS_CONTENTS,            1),
-  INIT_SEC_DATA (IDATA7, ".idata$7", SEC_HAS_CONTENTS,            2),
-  INIT_SEC_DATA (DATA,   ".data",    SEC_DATA,                    2),
-  INIT_SEC_DATA (BSS,    ".bss",     0,                           2)
-};
-
-#endif
-
 /* This is what we're trying to make.  We generate the imp symbols with
    both single and double underscores, for compatibility.
 
@@ -2376,21 +2305,7 @@ __imp_GetFileVersionInfoSizeW@8:
 # Hint/Name table
        .section        .idata$6
 ID2:   .short  2
-       .asciz  "GetFileVersionInfoSizeW"
-
-
-   For the PowerPC, here's the variation on the above scheme:
-
-# Rather than a simple "jmp *", the code to get to the dll function
-# looks like:
-         .text
-         lwz   r11,[tocv]__imp_function_name(r2)
-#                 RELOC: 00000000 TOCREL16,TOCDEFN __imp_function_name
-         lwz   r12,0(r11)
-        stw    r2,4(r1)
-        mtctr  r12
-        lwz    r2,4(r11)
-        bctr  */
+       .asciz  "GetFileVersionInfoSizeW"  */
 
 static char *
 make_label (const char *prefix, const char *name)
@@ -2438,11 +2353,6 @@ make_one_lib_file (export_type *exp, int i, int delay)
   asymbol *  iname_lab;
   asymbol ** iname_lab_pp;
   asymbol ** iname_pp;
-#ifdef DLLTOOL_PPC
-  asymbol ** fn_pp;
-  asymbol ** toc_pp;
-#define EXTRA   2
-#endif
 #ifndef EXTRA
 #define EXTRA    0
 #endif
@@ -2503,18 +2413,7 @@ make_one_lib_file (export_type *exp, int i, int delay)
     {
       exp_label = bfd_make_empty_symbol (abfd);
       exp_label->name = make_imp_label ("", exp->name);
-
-      /* On PowerPC, the function name points to a descriptor in
-        the rdata section, the first element of which is a
-        pointer to the code (..function_name), and the second
-        points to the .toc.  */
-#ifdef DLLTOOL_PPC
-      if (machine == MPPC)
-       exp_label->section = secdata[RDATA].sec;
-      else
-#endif
-       exp_label->section = secdata[TEXT].sec;
-
+      exp_label->section = secdata[TEXT].sec;
       exp_label->flags = BSF_GLOBAL;
       exp_label->value = 0;
 
@@ -2558,36 +2457,6 @@ make_one_lib_file (export_type *exp, int i, int delay)
   iname_lab_pp = ptrs + oidx;
   ptrs[oidx++] = iname_lab;
 
-#ifdef DLLTOOL_PPC
-  /* The symbol referring to the code (.text).  */
-  {
-    asymbol *function_name;
-
-    function_name = bfd_make_empty_symbol(abfd);
-    function_name->name = make_label ("..", exp->name);
-    function_name->section = secdata[TEXT].sec;
-    function_name->flags = BSF_GLOBAL;
-    function_name->value = 0;
-
-    fn_pp = ptrs + oidx;
-    ptrs[oidx++] = function_name;
-  }
-
-  /* The .toc symbol.  */
-  {
-    asymbol *toc_symbol;
-
-    toc_symbol = bfd_make_empty_symbol (abfd);
-    toc_symbol->name = make_label (".", "toc");
-    toc_symbol->section = bfd_und_section_ptr;
-    toc_symbol->flags = BSF_GLOBAL;
-    toc_symbol->value = 0;
-
-    toc_pp = ptrs + oidx;
-    ptrs[oidx++] = toc_symbol;
-  }
-#endif
-
   ptrs[oidx] = 0;
 
   for (i = 0; i < NSECS; i++)
@@ -2629,13 +2498,7 @@ make_one_lib_file (export_type *exp, int i, int delay)
                  rpp[3] = 0;
                }
 
-             if (machine == MPPC)
-               {
-                 rel->howto = bfd_reloc_type_lookup (abfd,
-                                                     BFD_RELOC_16_GOTOFF);
-                 rel->sym_ptr_ptr = iname_pp;
-               }
-             else if (machine == MX86)
+             if (machine == MX86)
                {
                  rel->howto = bfd_reloc_type_lookup (abfd,
                                                      BFD_RELOC_32_PCREL);
@@ -2788,114 +2651,6 @@ make_one_lib_file (export_type *exp, int i, int delay)
          sec->orelocation = rpp;
          sec->reloc_count = 1;
          break;
-
-#ifdef DLLTOOL_PPC
-       case PDATA:
-         {
-           /* The .pdata section is 5 words long.
-              Think of it as:
-              struct
-              {
-              bfd_vma BeginAddress,     [0x00]
-              EndAddress,       [0x04]
-              ExceptionHandler, [0x08]
-              HandlerData,      [0x0c]
-              PrologEndAddress; [0x10]
-              };  */
-
-           /* So this pdata section setups up this as a glue linkage to
-              a dll routine. There are a number of house keeping things
-              we need to do:
-
-              1. In the name of glue trickery, the ADDR32 relocs for 0,
-              4, and 0x10 are set to point to the same place:
-              "..function_name".
-              2. There is one more reloc needed in the pdata section.
-              The actual glue instruction to restore the toc on
-              return is saved as the offset in an IMGLUE reloc.
-              So we need a total of four relocs for this section.
-
-              3. Lastly, the HandlerData field is set to 0x03, to indicate
-              that this is a glue routine.  */
-           arelent *imglue, *ba_rel, *ea_rel, *pea_rel;
-
-           /* Alignment must be set to 2**2 or you get extra stuff.  */
-           bfd_set_section_alignment (sec, 2);
-
-           si->size = 4 * 5;
-           si->data = xmalloc (si->size);
-           memset (si->data, 0, si->size);
-           rpp = xmalloc (sizeof (arelent *) * 5);
-           rpp[0] = imglue  = xmalloc (sizeof (arelent));
-           rpp[1] = ba_rel  = xmalloc (sizeof (arelent));
-           rpp[2] = ea_rel  = xmalloc (sizeof (arelent));
-           rpp[3] = pea_rel = xmalloc (sizeof (arelent));
-           rpp[4] = 0;
-
-           /* Stick the toc reload instruction in the glue reloc.  */
-           bfd_put_32(abfd, ppc_glue_insn, (char *) &imglue->address);
-
-           imglue->addend = 0;
-           imglue->howto = bfd_reloc_type_lookup (abfd,
-                                                  BFD_RELOC_32_GOTOFF);
-           imglue->sym_ptr_ptr = fn_pp;
-
-           ba_rel->address = 0;
-           ba_rel->addend = 0;
-           ba_rel->howto = bfd_reloc_type_lookup (abfd, BFD_RELOC_32);
-           ba_rel->sym_ptr_ptr = fn_pp;
-
-           bfd_put_32 (abfd, 0x18, si->data + 0x04);
-           ea_rel->address = 4;
-           ea_rel->addend = 0;
-           ea_rel->howto = bfd_reloc_type_lookup (abfd, BFD_RELOC_32);
-           ea_rel->sym_ptr_ptr = fn_pp;
-
-           /* Mark it as glue.  */
-           bfd_put_32 (abfd, 0x03, si->data + 0x0c);
-
-           /* Mark the prolog end address.  */
-           bfd_put_32 (abfd, 0x0D, si->data + 0x10);
-           pea_rel->address = 0x10;
-           pea_rel->addend = 0;
-           pea_rel->howto = bfd_reloc_type_lookup (abfd, BFD_RELOC_32);
-           pea_rel->sym_ptr_ptr = fn_pp;
-
-           sec->orelocation = rpp;
-           sec->reloc_count = 4;
-           break;
-         }
-       case RDATA:
-         /* Each external function in a PowerPC PE file has a two word
-            descriptor consisting of:
-            1. The address of the code.
-            2. The address of the appropriate .toc
-            We use relocs to build this.  */
-         si->size = 8;
-         si->data = xmalloc (8);
-         memset (si->data, 0, si->size);
-
-         rpp = xmalloc (sizeof (arelent *) * 3);
-         rpp[0] = rel = xmalloc (sizeof (arelent));
-         rpp[1] = xmalloc (sizeof (arelent));
-         rpp[2] = 0;
-
-         rel->address = 0;
-         rel->addend = 0;
-         rel->howto = bfd_reloc_type_lookup (abfd, BFD_RELOC_32);
-         rel->sym_ptr_ptr = fn_pp;
-
-         rel = rpp[1];
-
-         rel->address = 4;
-         rel->addend = 0;
-         rel->howto = bfd_reloc_type_lookup (abfd, BFD_RELOC_32);
-         rel->sym_ptr_ptr = toc_pp;
-
-         sec->orelocation = rpp;
-         sec->reloc_count = 2;
-         break;
-#endif /* DLLTOOL_PPC */
        }
     }
 
@@ -3134,30 +2889,7 @@ make_tail (void)
        fprintf (f,"\t%s\t0\n", ASM_LONG); /* NULL terminating list.  */
     }
 
-#ifdef DLLTOOL_PPC
-  /* Normally, we need to see a null descriptor built in idata$3 to
-     act as the terminator for the list. The ideal way, I suppose,
-     would be to mark this section as a comdat type 2 section, so
-     only one would appear in the final .exe (if our linker supported
-     comdat, that is) or cause it to be inserted by something else (say
-     crt0).  */
-
-  fprintf (f, "\t.section\t.idata$3\n");
-  fprintf (f, "\t%s\t0\n", ASM_LONG);
-  fprintf (f, "\t%s\t0\n", ASM_LONG);
-  fprintf (f, "\t%s\t0\n", ASM_LONG);
-  fprintf (f, "\t%s\t0\n", ASM_LONG);
-  fprintf (f, "\t%s\t0\n", ASM_LONG);
-#endif
-
-#ifdef DLLTOOL_PPC
-  /* Other PowerPC NT compilers use idata$6 for the dllname, so I
-     do too. Original, huh?  */
-  fprintf (f, "\t.section\t.idata$6\n");
-#else
   fprintf (f, "\t.section\t.idata$7\n");
-#endif
-
   fprintf (f, "\t%s\t__%s_iname\n", ASM_GLOBAL, imp_name_lab);
   fprintf (f, "__%s_iname:\t%s\t\"%s\"\n",
           imp_name_lab, ASM_TEXT, dll_name);
@@ -3463,13 +3195,13 @@ identify_member_contains_symname (bfd  * abfd,
 }
 
 /* This is the main implementation for the --identify option.
-   Given the name of an import library in identify_imp_name, first determine
-   if the import library is a GNU binutils-style one (where the DLL name is
-   stored in an .idata$7 (.idata$6 on PPC) section, or if it is a MS-style
-   one (where the DLL name, along with much other data, is stored in the
-   .idata$6 section). We determine the style of import library by searching
-   for the DLL-structure symbol inserted by MS tools:
-   __NULL_IMPORT_DESCRIPTOR.
+   Given the name of an import library in identify_imp_name, first
+   determine if the import library is a GNU binutils-style one (where
+   the DLL name is stored in an .idata$7 section), or if it is a
+   MS-style one (where the DLL name, along with much other data, is
+   stored in the .idata$6 section).  We determine the style of import
+   library by searching for the DLL-structure symbol inserted by MS
+   tools: __NULL_IMPORT_DESCRIPTOR.
 
    Once we know which section to search, evaluate each section for the
    appropriate properties that indicate it may contain the name of the
@@ -3629,19 +3361,13 @@ identify_search_member (bfd  *abfd,
 }
 
 /* This predicate returns true if section->name matches the desired value.
-   By default, this is .idata$7 (.idata$6 on PPC, or if the import
-   library is ms-style).  */
+   By default, this is .idata$7 (.idata$6 if the import library is
+   ms-style).  */
 
 static bfd_boolean
 identify_process_section_p (asection * section, bfd_boolean ms_style_implib)
 {
-  static const char * SECTION_NAME =
-#ifdef DLLTOOL_PPC
-  /* dllname is stored in idata$6 on PPC */
-  ".idata$6";
-#else
-  ".idata$7";
-#endif
+  static const char * SECTION_NAME = ".idata$7";
   static const char * MS_SECTION_NAME = ".idata$6";
 
   const char * section_name =
@@ -3652,7 +3378,7 @@ identify_process_section_p (asection * section, bfd_boolean ms_style_implib)
   return FALSE;
 }
 
-/* If *section has contents and its name is .idata$7 (.data$6 on PPC or if
+/* If *section has contents and its name is .idata$7 (.idata$6 if
    import lib ms-generated) -- and it satisfies several other constraints
    -- then add the contents of the section to obj->list.  */
 
@@ -3938,7 +3664,7 @@ usage (FILE *file, int status)
   fprintf (file, _("Usage %s <option(s)> <object-file(s)>\n"), program_name);
   /* xgetext:c-format */
   fprintf (file, _("   -m --machine <machine>    Create as DLL for <machine>.  [default: %s]\n"), mname);
-  fprintf (file, _("        possible <machine>: arm[_interwork], i386, mcore[-elf]{-le|-be}, ppc, thumb\n"));
+  fprintf (file, _("        possible <machine>: arm[_interwork], i386, mcore[-elf]{-le|-be}, thumb\n"));
   fprintf (file, _("   -e --output-exp <outname> Generate an export file.\n"));
   fprintf (file, _("   -l --output-lib <outname> Generate an interface library.\n"));
   fprintf (file, _("   -y --output-delaylib <outname> Create a delay-import library.\n"));
@@ -4372,7 +4098,7 @@ look_for_prog (const char *prog_name, const char *prefix, int end_prefix)
 /* Deduce the name of the program we are want to invoke.
    PROG_NAME is the basic name of the program we want to run,
    eg "as" or "ld".  The catch is that we might want actually
-   run "i386-pe-as" or "ppc-pe-ld".
+   run "i386-pe-as".
 
    If argv[0] contains the full path, then try to find the program
    in the same place, with and then without a target-like prefix.
index cbd4779176c25dab954c369ada9241ff7c424ab6..0b73294e4f579aae8ae30d1b434094dc64e3586d 100644 (file)
@@ -1,3 +1,13 @@
+2020-07-09  Alan Modra  <amodra@gmail.com>
+
+       * config/obj-coff.h: Remove TE_PE support.
+       * config/tc-ppc.c: Likewise.
+       * config/tc-ppc.h: Likewise.
+       * configure.tgt: Remove powerpc PE and powerpc lynxos.
+       * testsuite/gas/cfi/cfi.exp (cfi-common-6): Remove powerpc PE
+       condition.
+       * testsuite/gas/macros/macros.exp: Don't xfail powerpc PE.
+
 2020-07-08  Jan Beulich  <jbeulich@suse.com>
 
        * testsuite/gas/i386/fma4-lig.d, testsuite/gas/i386/xop-lig.d:
index 57dc8304e98a726b1f3f09721c1f3a045f1e4b5f..50da333892174390690900c59b44d1437857a67d 100644 (file)
 #endif
 
 #ifdef TC_PPC
-#ifdef TE_PE
-#include "coff/powerpc.h"
-#else
 #include "coff/rs6000.h"
 #endif
-#endif
 
 #ifdef TC_I386
 #ifdef TE_PEP
index aa989e7d1c2cad6851f7da6e35f7d8f7eb600f07..1000b618f6df62aa22bfdaffcdad11d06846724e 100644 (file)
 #include "dwarf2dbg.h"
 #endif
 
-#ifdef TE_PE
-#include "coff/pe.h"
-#endif
-
 #ifdef OBJ_XCOFF
 #include "coff/xcoff.h"
 #include "libxcoff.h"
@@ -50,12 +46,8 @@ static int set_target_endian = 0;
 
 /* Whether to use user friendly register names.  */
 #ifndef TARGET_REG_NAMES_P
-#ifdef TE_PE
-#define TARGET_REG_NAMES_P TRUE
-#else
 #define TARGET_REG_NAMES_P FALSE
 #endif
-#endif
 
 /* Macros for calculating LO, HI, HA, HIGHER, HIGHERA, HIGHEST,
    HIGHESTA.  */
@@ -135,20 +127,6 @@ static void ppc_elf_localentry (int);
 static void ppc_elf_abiversion (int);
 static void ppc_elf_gnu_attribute (int);
 #endif
-
-#ifdef TE_PE
-static void ppc_previous (int);
-static void ppc_pdata (int);
-static void ppc_ydata (int);
-static void ppc_reldata (int);
-static void ppc_rdata (int);
-static void ppc_ualong (int);
-static void ppc_znop (int);
-static void ppc_pe_comm (int);
-static void ppc_pe_section (int);
-static void ppc_pe_function (int);
-static void ppc_pe_tocd (int);
-#endif
 \f
 /* Generic assembler global variables which must be defined by all
    targets.  */
@@ -274,22 +252,6 @@ const pseudo_typeS md_pseudo_table[] =
   { "gnu_attribute", ppc_elf_gnu_attribute, 0},
 #endif
 
-#ifdef TE_PE
-  /* Pseudo-ops specific to the Windows NT PowerPC PE (coff) format.  */
-  { "previous", ppc_previous,   0 },
-  { "pdata",    ppc_pdata,      0 },
-  { "ydata",    ppc_ydata,      0 },
-  { "reldata",  ppc_reldata,    0 },
-  { "rdata",    ppc_rdata,      0 },
-  { "ualong",   ppc_ualong,     0 },
-  { "znop",     ppc_znop,       0 },
-  { "comm",    ppc_pe_comm,    0 },
-  { "lcomm",   ppc_pe_comm,    1 },
-  { "section",  ppc_pe_section, 0 },
-  { "function",        ppc_pe_function,0 },
-  { "tocd",     ppc_pe_tocd,    0 },
-#endif
-
 #if defined (OBJ_XCOFF) || defined (OBJ_ELF)
   { "tc",      ppc_tc,         0 },
   { "machine",  ppc_machine,    0 },
@@ -1095,21 +1057,6 @@ static struct dw_section {
 } dw_sections[XCOFF_DWSECT_NBR_NAMES];
 #endif /* OBJ_XCOFF */
 
-#ifdef TE_PE
-
-/* Various sections that we need for PE coff support.  */
-static segT ydata_section;
-static segT pdata_section;
-static segT reldata_section;
-static segT rdata_section;
-static segT tocdata_section;
-
-/* The current section and the previous section. See ppc_previous.  */
-static segT ppc_previous_section;
-static segT ppc_current_section;
-
-#endif /* TE_PE */
-
 #ifdef OBJ_ELF
 symbolS *GOT_symbol;           /* Pre-defined "_GLOBAL_OFFSET_TABLE" */
 unsigned long *ppc_apuinfo_list;
@@ -1552,9 +1499,7 @@ extern const char*
 ppc_target_format (void)
 {
 #ifdef OBJ_COFF
-#ifdef TE_PE
-  return target_big_endian ? "pe-powerpc" : "pe-powerpcle";
-#elif TE_POWERMAC
+#if TE_POWERMAC
   return "xcoff-powermac";
 #else
 #  ifdef TE_AIX5
@@ -1950,13 +1895,6 @@ md_begin (void)
   ppc_data_csects = symbol_make ("dummy\001");
   symbol_get_tc (ppc_data_csects)->within = ppc_data_csects;
 #endif
-
-#ifdef TE_PE
-
-  ppc_current_section = text_section;
-  ppc_previous_section = 0;
-
-#endif
 }
 
 void
@@ -2738,101 +2676,6 @@ ppc_elf_adjust_symtab (void)
 }
 #endif /* OBJ_ELF */
 \f
-#ifdef TE_PE
-
-/*
- * Summary of parse_toc_entry.
- *
- * in: Input_line_pointer points to the '[' in one of:
- *
- *        [toc] [tocv] [toc32] [toc64]
- *
- *      Anything else is an error of one kind or another.
- *
- * out:
- *   return value: success or failure
- *   toc_kind:     kind of toc reference
- *   input_line_pointer:
- *     success: first char after the ']'
- *     failure: unchanged
- *
- * settings:
- *
- *     [toc]   - rv == success, toc_kind = default_toc
- *     [tocv]  - rv == success, toc_kind = data_in_toc
- *     [toc32] - rv == success, toc_kind = must_be_32
- *     [toc64] - rv == success, toc_kind = must_be_64
- *
- */
-
-enum toc_size_qualifier
-{
-  default_toc, /* The toc cell constructed should be the system default size */
-  data_in_toc, /* This is a direct reference to a toc cell                   */
-  must_be_32,  /* The toc cell constructed must be 32 bits wide              */
-  must_be_64   /* The toc cell constructed must be 64 bits wide              */
-};
-
-static int
-parse_toc_entry (enum toc_size_qualifier *toc_kind)
-{
-  char *start;
-  char *toc_spec;
-  char c;
-  enum toc_size_qualifier t;
-
-  /* Save the input_line_pointer.  */
-  start = input_line_pointer;
-
-  /* Skip over the '[' , and whitespace.  */
-  ++input_line_pointer;
-  SKIP_WHITESPACE ();
-
-  /* Find the spelling of the operand.  */
-  c = get_symbol_name (&toc_spec);
-
-  if (strcmp (toc_spec, "toc") == 0)
-    {
-      t = default_toc;
-    }
-  else if (strcmp (toc_spec, "tocv") == 0)
-    {
-      t = data_in_toc;
-    }
-  else if (strcmp (toc_spec, "toc32") == 0)
-    {
-      t = must_be_32;
-    }
-  else if (strcmp (toc_spec, "toc64") == 0)
-    {
-      t = must_be_64;
-    }
-  else
-    {
-      as_bad (_("syntax error: invalid toc specifier `%s'"), toc_spec);
-      *input_line_pointer = c;
-      input_line_pointer = start;
-      return 0;
-    }
-
-  /* Now find the ']'.  */
-  *input_line_pointer = c;
-
-  SKIP_WHITESPACE_AFTER_NAME ();       /* leading whitespace could be there.  */
-  c = *input_line_pointer++; /* input_line_pointer->past char in c.  */
-
-  if (c != ']')
-    {
-      as_bad (_("syntax error: expected `]', found  `%c'"), c);
-      input_line_pointer = start;
-      return 0;
-    }
-
-  *toc_kind = t;
-  return 1;
-}
-#endif
-
 #if defined (OBJ_XCOFF) || defined (OBJ_ELF)
 /* See whether a symbol is in the TOC section.  */
 
@@ -2997,7 +2840,7 @@ fixup_size (bfd_reloc_code_real_type reloc, bfd_boolean *pc_relative)
       /* This switch statement must handle all BFD_RELOC values
         possible in instruction fixups.  As is, it handles all
         BFD_RELOC values used in bfd/elf64-ppc.c, bfd/elf32-ppc.c,
-        bfd/coff-ppc, bfd/coff-rs6000.c and bfd/coff64-rs6000.c.
+        bfd/coff-rs6000.c and bfd/coff64-rs6000.c.
         Overkill since data and marker relocs need not be handled
         here, but this way we can be sure a needed fixup reloc isn't
         accidentally omitted.  */
@@ -3135,9 +2978,7 @@ fixup_size (bfd_reloc_code_real_type reloc, bfd_boolean *pc_relative)
       pcrel = TRUE;
       break;
 
-    case BFD_RELOC_16_GOT_PCREL: /* coff reloc, bad name re size.  */
     case BFD_RELOC_32:
-    case BFD_RELOC_32_GOTOFF:
     case BFD_RELOC_32_PLTOFF:
 #ifdef OBJ_XCOFF
     case BFD_RELOC_CTOR:
@@ -3435,137 +3276,22 @@ md_assemble (char *str)
       hold = input_line_pointer;
       input_line_pointer = str;
 
-#ifdef TE_PE
-      if (*input_line_pointer == '[')
+      if ((reg_names_p
+          && (((operand->flags & PPC_OPERAND_CR_BIT) != 0)
+              || ((operand->flags & PPC_OPERAND_CR_REG) != 0)))
+         || !register_name (&ex))
        {
-         /* We are expecting something like the second argument here:
-          *
-          *    lwz r4,[toc].GS.0.static_int(rtoc)
-          *           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
-          * The argument following the `]' must be a symbol name, and the
-          * register must be the toc register: 'rtoc' or '2'
-          *
-          * The effect is to 0 as the displacement field
-          * in the instruction, and issue an IMAGE_REL_PPC_TOCREL16 (or
-          * the appropriate variation) reloc against it based on the symbol.
-          * The linker will build the toc, and insert the resolved toc offset.
-          *
-          * Note:
-          * o The size of the toc entry is currently assumed to be
-          *   32 bits. This should not be assumed to be a hard coded
-          *   number.
-          * o In an effort to cope with a change from 32 to 64 bits,
-          *   there are also toc entries that are specified to be
-          *   either 32 or 64 bits:
-          *     lwz r4,[toc32].GS.0.static_int(rtoc)
-          *     lwz r4,[toc64].GS.0.static_int(rtoc)
-          *   These demand toc entries of the specified size, and the
-          *   instruction probably requires it.
-          */
-
-         int valid_toc;
-         enum toc_size_qualifier toc_kind;
-         bfd_reloc_code_real_type toc_reloc;
-
-         /* Go parse off the [tocXX] part.  */
-         valid_toc = parse_toc_entry (&toc_kind);
-
-         if (!valid_toc)
-           {
-             ignore_rest_of_line ();
-             break;
-           }
-
-         /* Now get the symbol following the ']'.  */
-         expression (&ex);
+         char save_lex = lex_type['%'];
 
-         switch (toc_kind)
+         if (((operand->flags & PPC_OPERAND_CR_REG) != 0)
+             || (operand->flags & PPC_OPERAND_CR_BIT) != 0)
            {
-           case default_toc:
-             /* In this case, we may not have seen the symbol yet,
-                since  it is allowed to appear on a .extern or .globl
-                or just be a label in the .data section.  */
-             toc_reloc = BFD_RELOC_PPC_TOC16;
-             break;
-           case data_in_toc:
-             /* 1. The symbol must be defined and either in the toc
-                section, or a global.
-                2. The reloc generated must have the TOCDEFN flag set
-                in upper bit mess of the reloc type.
-                FIXME: It's a little confusing what the tocv
-                qualifier can be used for.  At the very least, I've
-                seen three uses, only one of which I'm sure I can
-                explain.  */
-             if (ex.X_op == O_symbol)
-               {
-                 gas_assert (ex.X_add_symbol != NULL);
-                 if (symbol_get_bfdsym (ex.X_add_symbol)->section
-                     != tocdata_section)
-                   {
-                     as_bad (_("[tocv] symbol is not a toc symbol"));
-                   }
-               }
-
-             toc_reloc = BFD_RELOC_PPC_TOC16;
-             break;
-           case must_be_32:
-             /* FIXME: these next two specifically specify 32/64 bit
-                toc entries.  We don't support them today.  Is this
-                the right way to say that?  */
-             toc_reloc = BFD_RELOC_NONE;
-             as_bad (_("unimplemented toc32 expression modifier"));
-             break;
-           case must_be_64:
-             /* FIXME: see above.  */
-             toc_reloc = BFD_RELOC_NONE;
-             as_bad (_("unimplemented toc64 expression modifier"));
-             break;
-           default:
-             fprintf (stderr,
-                      _("Unexpected return value [%d] from parse_toc_entry!\n"),
-                      toc_kind);
-             abort ();
-             break;
-           }
-
-         /* We need to generate a fixup for this expression.  */
-         if (fc >= MAX_INSN_FIXUPS)
-           as_fatal (_("too many fixups"));
-
-         fixups[fc].reloc = toc_reloc;
-         fixups[fc].exp = ex;
-         fixups[fc].opindex = *opindex_ptr;
-         ++fc;
-
-         /* Ok. We've set up the fixup for the instruction. Now make it
-            look like the constant 0 was found here.  */
-         ex.X_unsigned = 1;
-         ex.X_op = O_constant;
-         ex.X_add_number = 0;
-         ex.X_add_symbol = NULL;
-         ex.X_op_symbol = NULL;
-       }
-
-      else
-#endif         /* TE_PE */
-       {
-         if ((reg_names_p
-               && (((operand->flags & PPC_OPERAND_CR_BIT) != 0)
-                  || ((operand->flags & PPC_OPERAND_CR_REG) != 0)))
-             || !register_name (&ex))
-           {
-             char save_lex = lex_type['%'];
-
-             if (((operand->flags & PPC_OPERAND_CR_REG) != 0)
-                 || (operand->flags & PPC_OPERAND_CR_BIT) != 0)
-               {
-                 cr_operand = TRUE;
-                 lex_type['%'] |= LEX_BEGIN_NAME;
-               }
-             expression (&ex);
-             cr_operand = FALSE;
-             lex_type['%'] = save_lex;
+             cr_operand = TRUE;
+             lex_type['%'] |= LEX_BEGIN_NAME;
            }
+         expression (&ex);
+         cr_operand = FALSE;
+         lex_type['%'] = save_lex;
        }
 
       str = input_line_pointer;
@@ -5764,574 +5490,6 @@ ppc_machine (int ignore ATTRIBUTE_UNUSED)
 }
 #endif /* defined (OBJ_XCOFF) || defined (OBJ_ELF) */
 \f
-#ifdef TE_PE
-
-/* Pseudo-ops specific to the Windows NT PowerPC PE (coff) format.  */
-
-/* Set the current section.  */
-static void
-ppc_set_current_section (segT new)
-{
-  ppc_previous_section = ppc_current_section;
-  ppc_current_section = new;
-}
-
-/* pseudo-op: .previous
-   behaviour: toggles the current section with the previous section.
-   errors:    None
-   warnings:  "No previous section"  */
-
-static void
-ppc_previous (int ignore ATTRIBUTE_UNUSED)
-{
-  if (ppc_previous_section == NULL)
-    {
-      as_warn (_("no previous section to return to, ignored."));
-      return;
-    }
-
-  subseg_set (ppc_previous_section, 0);
-
-  ppc_set_current_section (ppc_previous_section);
-}
-
-/* pseudo-op: .pdata
-   behaviour: predefined read only data section
-             double word aligned
-   errors:    None
-   warnings:  None
-   initial:   .section .pdata "adr3"
-             a - don't know -- maybe a misprint
-             d - initialized data
-             r - readable
-             3 - double word aligned (that would be 4 byte boundary)
-
-   commentary:
-   Tag index tables (also known as the function table) for exception
-   handling, debugging, etc.  */
-
-static void
-ppc_pdata (int ignore ATTRIBUTE_UNUSED)
-{
-  if (pdata_section == 0)
-    {
-      pdata_section = subseg_new (".pdata", 0);
-
-      bfd_set_section_flags (pdata_section, (SEC_ALLOC | SEC_LOAD | SEC_RELOC
-                                            | SEC_READONLY | SEC_DATA));
-
-      bfd_set_section_alignment (pdata_section, 2);
-    }
-  else
-    {
-      pdata_section = subseg_new (".pdata", 0);
-    }
-  ppc_set_current_section (pdata_section);
-}
-
-/* pseudo-op: .ydata
-   behaviour: predefined read only data section
-             double word aligned
-   errors:    None
-   warnings:  None
-   initial:   .section .ydata "drw3"
-             a - don't know -- maybe a misprint
-             d - initialized data
-             r - readable
-             3 - double word aligned (that would be 4 byte boundary)
-   commentary:
-   Tag tables (also known as the scope table) for exception handling,
-   debugging, etc.  */
-
-static void
-ppc_ydata (int ignore ATTRIBUTE_UNUSED)
-{
-  if (ydata_section == 0)
-    {
-      ydata_section = subseg_new (".ydata", 0);
-      bfd_set_section_flags (ydata_section, (SEC_ALLOC | SEC_LOAD | SEC_RELOC
-                                            | SEC_READONLY | SEC_DATA ));
-
-      bfd_set_section_alignment (ydata_section, 3);
-    }
-  else
-    {
-      ydata_section = subseg_new (".ydata", 0);
-    }
-  ppc_set_current_section (ydata_section);
-}
-
-/* pseudo-op: .reldata
-   behaviour: predefined read write data section
-             double word aligned (4-byte)
-             FIXME: relocation is applied to it
-             FIXME: what's the difference between this and .data?
-   errors:    None
-   warnings:  None
-   initial:   .section .reldata "drw3"
-             d - initialized data
-             r - readable
-             w - writable
-             3 - double word aligned (that would be 8 byte boundary)
-
-   commentary:
-   Like .data, but intended to hold data subject to relocation, such as
-   function descriptors, etc.  */
-
-static void
-ppc_reldata (int ignore ATTRIBUTE_UNUSED)
-{
-  if (reldata_section == 0)
-    {
-      reldata_section = subseg_new (".reldata", 0);
-
-      bfd_set_section_flags (reldata_section, (SEC_ALLOC | SEC_LOAD | SEC_RELOC
-                                              | SEC_DATA));
-
-      bfd_set_section_alignment (reldata_section, 2);
-    }
-  else
-    {
-      reldata_section = subseg_new (".reldata", 0);
-    }
-  ppc_set_current_section (reldata_section);
-}
-
-/* pseudo-op: .rdata
-   behaviour: predefined read only data section
-             double word aligned
-   errors:    None
-   warnings:  None
-   initial:   .section .rdata "dr3"
-             d - initialized data
-             r - readable
-             3 - double word aligned (that would be 4 byte boundary)  */
-
-static void
-ppc_rdata (int ignore ATTRIBUTE_UNUSED)
-{
-  if (rdata_section == 0)
-    {
-      rdata_section = subseg_new (".rdata", 0);
-      bfd_set_section_flags (rdata_section, (SEC_ALLOC | SEC_LOAD | SEC_RELOC
-                                            | SEC_READONLY | SEC_DATA ));
-
-      bfd_set_section_alignment (rdata_section, 2);
-    }
-  else
-    {
-      rdata_section = subseg_new (".rdata", 0);
-    }
-  ppc_set_current_section (rdata_section);
-}
-
-/* pseudo-op: .ualong
-   behaviour: much like .int, with the exception that no alignment is
-             performed.
-             FIXME: test the alignment statement
-   errors:    None
-   warnings:  None  */
-
-static void
-ppc_ualong (int ignore ATTRIBUTE_UNUSED)
-{
-  /* Try for long.  */
-  cons (4);
-}
-
-/* pseudo-op: .znop  <symbol name>
-   behaviour: Issue a nop instruction
-             Issue a IMAGE_REL_PPC_IFGLUE relocation against it, using
-             the supplied symbol name.
-   errors:    None
-   warnings:  Missing symbol name  */
-
-static void
-ppc_znop (int ignore ATTRIBUTE_UNUSED)
-{
-  unsigned long insn;
-  const struct powerpc_opcode *opcode;
-  char *f;
-  symbolS *sym;
-  char *symbol_name;
-  char c;
-  char *name;
-
-  /* Strip out the symbol name.  */
-  c = get_symbol_name (&symbol_name);
-
-  name = xstrdup (symbol_name);
-
-  sym = symbol_find_or_make (name);
-
-  *input_line_pointer = c;
-
-  SKIP_WHITESPACE_AFTER_NAME ();
-
-  /* Look up the opcode in the hash table.  */
-  opcode = (const struct powerpc_opcode *) hash_find (ppc_hash, "nop");
-
-  /* Stick in the nop.  */
-  insn = opcode->opcode;
-
-  /* Write out the instruction.  */
-  f = frag_more (4);
-  md_number_to_chars (f, insn, 4);
-  fix_new (frag_now,
-          f - frag_now->fr_literal,
-          4,
-          sym,
-          0,
-          0,
-          BFD_RELOC_16_GOT_PCREL);
-
-}
-
-/* pseudo-op:
-   behaviour:
-   errors:
-   warnings:  */
-
-static void
-ppc_pe_comm (int lcomm)
-{
-  char *name;
-  char c;
-  char *p;
-  offsetT temp;
-  symbolS *symbolP;
-  offsetT align;
-
-  c = get_symbol_name (&name);
-
-  /* just after name is now '\0'.  */
-  p = input_line_pointer;
-  *p = c;
-  SKIP_WHITESPACE_AFTER_NAME ();
-  if (*input_line_pointer != ',')
-    {
-      as_bad (_("expected comma after symbol-name: rest of line ignored."));
-      ignore_rest_of_line ();
-      return;
-    }
-
-  input_line_pointer++;                /* skip ',' */
-  if ((temp = get_absolute_expression ()) < 0)
-    {
-      as_warn (_(".COMMon length (%ld.) <0! Ignored."), (long) temp);
-      ignore_rest_of_line ();
-      return;
-    }
-
-  if (! lcomm)
-    {
-      /* The third argument to .comm is the alignment.  */
-      if (*input_line_pointer != ',')
-       align = 3;
-      else
-       {
-         ++input_line_pointer;
-         align = get_absolute_expression ();
-         if (align <= 0)
-           {
-             as_warn (_("ignoring bad alignment"));
-             align = 3;
-           }
-       }
-    }
-
-  *p = 0;
-  symbolP = symbol_find_or_make (name);
-
-  *p = c;
-  if (S_IS_DEFINED (symbolP) && ! S_IS_COMMON (symbolP))
-    {
-      as_bad (_("ignoring attempt to re-define symbol `%s'."),
-             S_GET_NAME (symbolP));
-      ignore_rest_of_line ();
-      return;
-    }
-
-  if (S_GET_VALUE (symbolP))
-    {
-      if (S_GET_VALUE (symbolP) != (valueT) temp)
-       as_bad (_("length of .comm \"%s\" is already %ld. Not changed to %ld."),
-               S_GET_NAME (symbolP),
-               (long) S_GET_VALUE (symbolP),
-               (long) temp);
-    }
-  else
-    {
-      S_SET_VALUE (symbolP, (valueT) temp);
-      S_SET_EXTERNAL (symbolP);
-      S_SET_SEGMENT (symbolP, bfd_com_section_ptr);
-    }
-
-  demand_empty_rest_of_line ();
-}
-
-/*
- * implement the .section pseudo op:
- *     .section name {, "flags"}
- *                ^         ^
- *                |         +--- optional flags: 'b' for bss
- *                |                              'i' for info
- *                +-- section name               'l' for lib
- *                                               'n' for noload
- *                                               'o' for over
- *                                               'w' for data
- *                                              'd' (apparently m88k for data)
- *                                               'x' for text
- * But if the argument is not a quoted string, treat it as a
- * subsegment number.
- *
- * FIXME: this is a copy of the section processing from obj-coff.c, with
- * additions/changes for the moto-pas assembler support. There are three
- * categories:
- *
- * FIXME: I just noticed this. This doesn't work at all really. It it
- *        setting bits that bfd probably neither understands or uses. The
- *        correct approach (?) will have to incorporate extra fields attached
- *        to the section to hold the system specific stuff. (krk)
- *
- * Section Contents:
- * 'a' - unknown - referred to in documentation, but no definition supplied
- * 'c' - section has code
- * 'd' - section has initialized data
- * 'u' - section has uninitialized data
- * 'i' - section contains directives (info)
- * 'n' - section can be discarded
- * 'R' - remove section at link time
- *
- * Section Protection:
- * 'r' - section is readable
- * 'w' - section is writable
- * 'x' - section is executable
- * 's' - section is sharable
- *
- * Section Alignment:
- * '0' - align to byte boundary
- * '1' - align to halfword boundary
- * '2' - align to word boundary
- * '3' - align to doubleword boundary
- * '4' - align to quadword boundary
- * '5' - align to 32 byte boundary
- * '6' - align to 64 byte boundary
- *
- */
-
-void
-ppc_pe_section (int ignore ATTRIBUTE_UNUSED)
-{
-  /* Strip out the section name.  */
-  char *section_name;
-  char c;
-  char *name;
-  unsigned int exp;
-  flagword flags;
-  segT sec;
-  int align;
-
-  c = get_symbol_name (&section_name);
-
-  name = xstrdup (section_name);
-
-  *input_line_pointer = c;
-
-  SKIP_WHITESPACE_AFTER_NAME ();
-
-  exp = 0;
-  flags = SEC_NO_FLAGS;
-
-  if (strcmp (name, ".idata$2") == 0)
-    {
-      align = 0;
-    }
-  else if (strcmp (name, ".idata$3") == 0)
-    {
-      align = 0;
-    }
-  else if (strcmp (name, ".idata$4") == 0)
-    {
-      align = 2;
-    }
-  else if (strcmp (name, ".idata$5") == 0)
-    {
-      align = 2;
-    }
-  else if (strcmp (name, ".idata$6") == 0)
-    {
-      align = 1;
-    }
-  else
-    /* Default alignment to 16 byte boundary.  */
-    align = 4;
-
-  if (*input_line_pointer == ',')
-    {
-      ++input_line_pointer;
-      SKIP_WHITESPACE ();
-      if (*input_line_pointer != '"')
-       exp = get_absolute_expression ();
-      else
-       {
-         ++input_line_pointer;
-         while (*input_line_pointer != '"'
-                && ! is_end_of_line[(unsigned char) *input_line_pointer])
-           {
-             switch (*input_line_pointer)
-               {
-                 /* Section Contents */
-               case 'a': /* unknown */
-                 as_bad (_("unsupported section attribute -- 'a'"));
-                 break;
-               case 'c': /* code section */
-                 flags |= SEC_CODE;
-                 break;
-               case 'd': /* section has initialized data */
-                 flags |= SEC_DATA;
-                 break;
-               case 'u': /* section has uninitialized data */
-                 /* FIXME: This is IMAGE_SCN_CNT_UNINITIALIZED_DATA
-                    in winnt.h */
-                 flags |= SEC_ROM;
-                 break;
-               case 'i': /* section contains directives (info) */
-                 /* FIXME: This is IMAGE_SCN_LNK_INFO
-                    in winnt.h */
-                 flags |= SEC_HAS_CONTENTS;
-                 break;
-               case 'n': /* section can be discarded */
-                 flags &=~ SEC_LOAD;
-                 break;
-               case 'R': /* Remove section at link time */
-                 flags |= SEC_NEVER_LOAD;
-                 break;
-#if IFLICT_BRAIN_DAMAGE
-                 /* Section Protection */
-               case 'r': /* section is readable */
-                 flags |= IMAGE_SCN_MEM_READ;
-                 break;
-               case 'w': /* section is writable */
-                 flags |= IMAGE_SCN_MEM_WRITE;
-                 break;
-               case 'x': /* section is executable */
-                 flags |= IMAGE_SCN_MEM_EXECUTE;
-                 break;
-               case 's': /* section is sharable */
-                 flags |= IMAGE_SCN_MEM_SHARED;
-                 break;
-
-                 /* Section Alignment */
-               case '0': /* align to byte boundary */
-                 flags |= IMAGE_SCN_ALIGN_1BYTES;
-                 align = 0;
-                 break;
-               case '1':  /* align to halfword boundary */
-                 flags |= IMAGE_SCN_ALIGN_2BYTES;
-                 align = 1;
-                 break;
-               case '2':  /* align to word boundary */
-                 flags |= IMAGE_SCN_ALIGN_4BYTES;
-                 align = 2;
-                 break;
-               case '3':  /* align to doubleword boundary */
-                 flags |= IMAGE_SCN_ALIGN_8BYTES;
-                 align = 3;
-                 break;
-               case '4':  /* align to quadword boundary */
-                 flags |= IMAGE_SCN_ALIGN_16BYTES;
-                 align = 4;
-                 break;
-               case '5':  /* align to 32 byte boundary */
-                 flags |= IMAGE_SCN_ALIGN_32BYTES;
-                 align = 5;
-                 break;
-               case '6':  /* align to 64 byte boundary */
-                 flags |= IMAGE_SCN_ALIGN_64BYTES;
-                 align = 6;
-                 break;
-#endif
-               default:
-                 as_bad (_("unknown section attribute '%c'"),
-                         *input_line_pointer);
-                 break;
-               }
-             ++input_line_pointer;
-           }
-         if (*input_line_pointer == '"')
-           ++input_line_pointer;
-       }
-    }
-
-  sec = subseg_new (name, (subsegT) exp);
-
-  ppc_set_current_section (sec);
-
-  if (flags != SEC_NO_FLAGS)
-    {
-      if (!bfd_set_section_flags (sec, flags))
-       as_bad (_("error setting flags for \"%s\": %s"),
-               bfd_section_name (sec),
-               bfd_errmsg (bfd_get_error ()));
-    }
-
-  bfd_set_section_alignment (sec, align);
-}
-
-static void
-ppc_pe_function (int ignore ATTRIBUTE_UNUSED)
-{
-  char *name;
-  char endc;
-  symbolS *ext_sym;
-
-  endc = get_symbol_name (&name);
-
-  ext_sym = symbol_find_or_make (name);
-
-  (void) restore_line_pointer (endc);
-
-  S_SET_DATA_TYPE (ext_sym, DT_FCN << N_BTSHFT);
-  SF_SET_FUNCTION (ext_sym);
-  SF_SET_PROCESS (ext_sym);
-  coff_add_linesym (ext_sym);
-
-  demand_empty_rest_of_line ();
-}
-
-static void
-ppc_pe_tocd (int ignore ATTRIBUTE_UNUSED)
-{
-  if (tocdata_section == 0)
-    {
-      tocdata_section = subseg_new (".tocd", 0);
-      /* FIXME: section flags won't work.  */
-      bfd_set_section_flags (tocdata_section, (SEC_ALLOC | SEC_LOAD | SEC_RELOC
-                                              | SEC_READONLY | SEC_DATA));
-
-      bfd_set_section_alignment (tocdata_section, 2);
-    }
-  else
-    {
-      rdata_section = subseg_new (".tocd", 0);
-    }
-
-  ppc_set_current_section (tocdata_section);
-
-  demand_empty_rest_of_line ();
-}
-
-/* Don't adjust TOC relocs to use the section symbol.  */
-
-int
-ppc_pe_fix_adjustable (fixS *fix)
-{
-  return fix->fx_r_type != BFD_RELOC_PPC_TOC16;
-}
-
-#endif
-\f
 #ifdef OBJ_XCOFF
 
 /* XCOFF specific symbol and file handling.  */
@@ -7074,8 +6232,6 @@ ppc_fix_adjustable (fixS *fix)
          && fix->fx_r_type != BFD_RELOC_HI16_S_GOTOFF
          && fix->fx_r_type != BFD_RELOC_PPC64_GOT16_DS
          && fix->fx_r_type != BFD_RELOC_PPC64_GOT16_LO_DS
-         && fix->fx_r_type != BFD_RELOC_16_GOT_PCREL
-         && fix->fx_r_type != BFD_RELOC_32_GOTOFF
          && fix->fx_r_type != BFD_RELOC_PPC64_GOT_PCREL34
          && fix->fx_r_type != BFD_RELOC_24_PLT_PCREL
          && fix->fx_r_type != BFD_RELOC_32_PLTOFF
@@ -7928,16 +7084,12 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg)
     fixP->fx_addnumber = 0;
   else
     {
-#ifdef TE_PE
-      fixP->fx_addnumber = 0;
-#else
       /* We want to use the offset within the toc, not the actual VMA
         of the symbol.  */
       fixP->fx_addnumber = (- bfd_section_vma (S_GET_SEGMENT (fixP->fx_addsy))
                            - S_GET_VALUE (ppc_toc_csect));
       /* Set *valP to avoid errors.  */
       *valP = value;
-#endif
     }
 #endif
 }
index bfe61294da1d19bcc3c9d3abda5250845099cba1..d887c053ff8d277db2755bec59ec6d9d3ba45d01 100644 (file)
@@ -30,15 +30,10 @@ struct fix;
 #define TARGET_BYTES_BIG_ENDIAN 1
 #endif
 
-/* If OBJ_COFF is defined, and TE_PE is not defined, we are assembling
-   XCOFF for AIX or PowerMac.  If TE_PE is defined, we are assembling
-   COFF for Windows NT.  */
-
+/* If OBJ_COFF is defined we are assembling XCOFF for AIX or PowerMac.  */
 #ifdef OBJ_COFF
-#ifndef TE_PE
 #define OBJ_XCOFF
 #endif
-#endif
 
 /* The target BFD architecture.  */
 #define TARGET_ARCH (ppc_arch ())
@@ -107,17 +102,6 @@ extern ppc_cpu_t ppc_cpu;
 #define TC_INIT_FIX_DATA(FIXP) \
   do { (FIXP)->tc_fix_data.ppc_cpu = ppc_cpu; } while (0)
 \f
-#ifdef TE_PE
-
-/* Question marks are permitted in symbol names.  */
-#define LEX_QM 1
-
-/* Don't adjust TOC relocs.  */
-#define tc_fix_adjustable(FIX) ppc_pe_fix_adjustable (FIX)
-extern int ppc_pe_fix_adjustable (struct fix *);
-
-#endif
-
 #ifdef OBJ_XCOFF
 
 /* Declarations needed when generating XCOFF code.  XCOFF is an
index 337249597c5c41b73f675db6d3a53804d55ec712..831ca901bae0c1673e3b683a6de2b601d8209742 100644 (file)
@@ -342,8 +342,6 @@ case ${generic_target} in
 
   pj*)                                 fmt=elf ;;
 
-  ppc-*-pe | ppc-*-cygwin*)            fmt=coff em=pe ;;
-  ppc-*-winnt*)                                fmt=coff em=pe ;;
   ppc-*-aix5.[01])                     fmt=coff em=aix5 ;;
   ppc-*-aix[5-9].*)                    fmt=coff em=aix5 ;;
   ppc-*-aix*)                          fmt=coff em=aix ;;
@@ -355,7 +353,6 @@ case ${generic_target} in
   ppc-*-macos*)                                fmt=coff em=macos ;;
   ppc-*-nto*)                          fmt=elf ;;
   ppc-*-kaos*)                         fmt=elf ;;
-  ppc-*-lynxos*)                       fmt=elf em=lynx ;;
 
   pru-*-*)                             fmt=elf ;;
 
index afafd7a0de4abed62ea29f69cd7388bd9a5c8e66..8ec4ebcab3ca4c6f87c3638777eddd50107e8354 100644 (file)
@@ -127,8 +127,7 @@ if { ![istarget "hppa64*-*"] } then {
     run_dump_test "cfi-common-5"
   }
   # Some targets don't support PC relative cfi directives
-  if { ![istarget "mips*-*"] &&
-       !([istarget powerpc*-*-*] && [is_pecoff_format]) } then {
+  if { ![istarget "mips*-*"] } then {
     run_dump_test "cfi-common-6"
   }
   run_dump_test "cfi-common-7"
index 7beaf48cf716e11f73af547aa36d3197e88a95a2..e444486e214d476d27a0bdb3de0ffdecf0c09796 100644 (file)
@@ -57,7 +57,6 @@ if { ![istarget hppa*-*-*] || [istarget *-*-linux*] } {
 
     # These fail due to NO_STRING_ESCAPES
     setup_xfail "powerpc*-*-aix*" "powerpc*-*-beos*" "powerpc*-*-macos*"
-    setup_xfail "powerpc*-*-pe" "powerpc*-*-*win*"
     setup_xfail "rs6000-*-*"
     setup_xfail "z80-*-*"
 
index 000dfe5034c369ef400318aef91c6c0c86a02a03..1d7cafbe54d004830d2af4205580c9f301bb4442 100644 (file)
@@ -1,3 +1,7 @@
+2020-07-09  Alan Modra  <amodra@gmail.com>
+
+       * coff/powerpc.h: Delete.
+
 2020-07-04  Nick Clifton  <nickc@redhat.com>
 
        Binutils 2.35 branch created.
diff --git a/include/coff/powerpc.h b/include/coff/powerpc.h
deleted file mode 100644 (file)
index ecc2243..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-/* Basic coff information for the PowerPC
-   Based on coff/rs6000.h, coff/i386.h and others.
-   
-   Copyright (C) 2001-2020 Free Software Foundation, Inc.
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
-   
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   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
-   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
-   MA 02110-1301, USA.
-   Initial release: Kim Knuttila (krk@cygnus.com)  */
-#define L_LNNO_SIZE 2
-#define INCLUDE_COMDAT_FIELDS_IN_AUXENT
-#include "coff/external.h"
-
-/* Bits for f_flags:
-       F_RELFLG        relocation info stripped from file
-       F_EXEC          file is executable (no unresolved external references)
-       F_LNNO          line numbers stripped from file
-       F_LSYMS         local symbols stripped from file
-       F_AR32WR        file has byte ordering of an AR32WR machine (e.g. vax).  */
-
-#define F_RELFLG       (0x0001)
-#define F_EXEC         (0x0002)
-#define F_LNNO         (0x0004)
-#define F_LSYMS                (0x0008)
-
-/* extra NT defines */
-#define PPCMAGIC       0760         /* peeked on aa PowerPC Windows NT box */
-
-/* from winnt.h */
-#define IMAGE_NT_OPTIONAL_HDR_MAGIC        0x10b
-
-#define PPCBADMAG(x) ((x).f_magic != PPCMAGIC) 
-
-/********************** RELOCATION DIRECTIVES **********************/
-
-struct external_reloc
-{
-  char r_vaddr[4];
-  char r_symndx[4];
-  char r_type[2];
-};
-
-#define RELOC struct external_reloc
-#define RELSZ 10
-
index 195731edc357596b6d7518dc4e8054061a433021..14f31a805f5926ff93ad93caf4738997cfced90b 100644 (file)
@@ -1,3 +1,15 @@
+2020-07-09  Alan Modra  <amodra@gmail.com>
+
+       * emulparams/ppcpe.sh: Delete.
+       * scripttempl/ppcpe.sc: Delete.
+       * emulparams/ppclynx.sh: Delete.
+       * Makefile.am (ALL_EMULATION_SOURCES): Remove ppc PE and lynxos.
+       * configure.tgt: Likewise.
+       * emultempl/beos.em: Remove powerpc PE support.
+       * emultempl/pe.em: Likewise.
+       * po/BLD-POTFILES.in: Regenerate.
+       * Makefile.in: Regenerate.
+
 2020-07-09  Alan Modra  <amodra@gmail.com>
 
        * testsuite/ld-gc/gc.exp: Don't set -mminimal-toc for powerpc64,
index 02c4fc1639579dd5e58213c8d0193fbdf9bb1274..38ff2d9bc0a98554bdfe2488e0e8868394757b26 100644 (file)
@@ -342,9 +342,7 @@ ALL_EMULATION_SOURCES = \
        epdp11.c \
        epjelf.c \
        epjlelf.c \
-       eppclynx.c \
        eppcmacos.c \
-       eppcpe.c \
        epruelf.c \
        escore3_elf.c \
        escore7_elf.c \
@@ -828,9 +826,7 @@ $(ALL_EMULATION_SOURCES) $(ALL_64_EMULATION_SOURCES): $(GEN_DEPENDS)
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/epdp11.Pc@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/epjelf.Pc@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/epjlelf.Pc@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eppclynx.Pc@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eppcmacos.Pc@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eppcpe.Pc@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/epruelf.Pc@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/escore3_elf.Pc@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/escore7_elf.Pc@am__quote@
index 2fe12e14f635609e65f3dfa4d7a6cf89812fe77e..aaf322ddf38fa698028df6df1c5dfc458a57091e 100644 (file)
@@ -825,9 +825,7 @@ ALL_EMULATION_SOURCES = \
        epdp11.c \
        epjelf.c \
        epjlelf.c \
-       eppclynx.c \
        eppcmacos.c \
-       eppcpe.c \
        epruelf.c \
        escore3_elf.c \
        escore7_elf.c \
@@ -1440,9 +1438,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/epdp11.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/epjelf.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/epjlelf.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eppclynx.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eppcmacos.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eppcpe.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/epruelf.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/escore3_elf.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/escore7_elf.Po@am__quote@
@@ -2423,9 +2419,7 @@ $(ALL_EMULATION_SOURCES) $(ALL_64_EMULATION_SOURCES): $(GEN_DEPENDS)
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/epdp11.Pc@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/epjelf.Pc@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/epjlelf.Pc@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eppclynx.Pc@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eppcmacos.Pc@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eppcpe.Pc@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/epruelf.Pc@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/escore3_elf.Pc@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/escore7_elf.Pc@am__quote@
index 87c7d9a4cadd3198540919ff2a7dd49001255b80..32f17d24026b91e8a6e7b995708d7ebd9c1f7f06 100644 (file)
@@ -721,10 +721,6 @@ powerpcle-*-nto*)  targ_emul=elf32lppcnto
 powerpc-*-macos*)      targ_emul=ppcmacos
                        targ_extra_ofiles=
                        ;;
-powerpcle-*-pe | powerpcle-*-winnt* | powerpcle-*-cygwin*)
-                       targ_emul=ppcpe
-                       targ_extra_ofiles="deffilep.o pe-dll.o"
-                       ;;
 powerpc-*-aix[5-9]*)   targ_emul=aix5ppc
                        targ_extra_ofiles=
                        ;;
@@ -736,8 +732,6 @@ powerpc-*-beos*)    targ_emul=aixppc
                        ;;
 powerpc-*-windiss*)    targ_emul=elf32ppcwindiss
                        ;;
-powerpc-*-lynxos*)     targ_emul=ppclynx
-                       ;;
 pru*-*-*)              targ_emul=pruelf
                        ;;
 riscv32*-*-linux*)     targ_emul=elf32lriscv
diff --git a/ld/emulparams/ppclynx.sh b/ld/emulparams/ppclynx.sh
deleted file mode 100644 (file)
index a58b5b0..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-source_sh ${srcdir}/emulparams/elf32ppc.sh
-
-TEXT_BASE=0x00002000
-DYN_TEXT_BASE=0x00400000
-TEXT_START_ADDR="(DEFINED(_DYNAMIC) ? ${DYN_TEXT_BASE} : ${TEXT_BASE})"
-case ${LD_FLAG} in
-    n|N)       TEXT_START_ADDR=0x1000 ;;
-esac
-ELF_INTERPRETER_NAME=\"/usr/lib/ld.so.1\"
-
-# Leave room of SIZEOF_HEADERS before text.
-EMBEDDED=
diff --git a/ld/emulparams/ppcpe.sh b/ld/emulparams/ppcpe.sh
deleted file mode 100644 (file)
index ed7df88..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-ARCH=powerpc
-SCRIPT_NAME=ppcpe
-OUTPUT_FORMAT="pei-powerpcle"
-TEMPLATE_NAME=pe
-SUBSYSTEM=PE_DEF_SUBSYSTEM
-INITIAL_SYMBOL_CHAR=\"_\"
-TARGET_PAGE_SIZE=0x1000
index 4da5eeef6d2376eb93269ce243d1dbecf9382660..ace6e3a123ca1a4a0ab0f8fe86bd9b58e2e60294 100644 (file)
@@ -608,22 +608,6 @@ sort_sections (lang_statement_union_type *s)
 static void
 gld_${EMULATION_NAME}_before_allocation (void)
 {
-#ifdef TARGET_IS_ppcpe
-  /* Here we rummage through the found bfds to collect toc information */
-  {
-    LANG_FOR_EACH_INPUT_STATEMENT (is)
-    {
-      if (!ppc_process_before_allocation(is->the_bfd, &link_info))
-       {
-         einfo (_("%P: errors encountered processing file %s\n"),
-                is->filename);
-       }
-    }
-  }
-
-  /* We have seen it all. Allocate it, and carry on */
-  ppc_allocate_toc_section (&link_info);
-#else
 #ifdef TARGET_IS_armpe
   /* FIXME: we should be able to set the size of the interworking stub
      section.
@@ -645,7 +629,6 @@ gld_${EMULATION_NAME}_before_allocation (void)
   /* We have seen it all. Allocate it, and carry on */
   arm_allocate_interworking_sections (& link_info);
 #endif /* TARGET_IS_armpe */
-#endif /* TARGET_IS_ppcpe */
 
   sort_sections (stat_ptr->head);
 
@@ -698,9 +681,7 @@ gld${EMULATION_NAME}_place_orphan (asection *s,
   os = lang_output_section_statement_lookup (output_secname, constraint, TRUE);
 
   /* Find the '\$' wild statement for this section.  We currently require the
-     linker script to explicitly mention "*(.foo\$)".
-     FIXME: ppcpe.sc has .CRT\$foo in the .rdata section.  According to the
-     Microsoft docs this isn't correct so it's not (currently) handled.  */
+     linker script to explicitly mention "*(.foo\$)".  */
 
   ps[0] = '\$';
   ps[1] = 0;
index 3899c9d92c8d43ce6596adef4092628f8bd6ba6c..eb7c812470b41585f1bb26446a3528d42b6b7637 100644 (file)
@@ -1741,23 +1741,6 @@ gld_${EMULATION_NAME}_after_open (void)
 static void
 gld_${EMULATION_NAME}_before_allocation (void)
 {
-#ifdef TARGET_IS_ppcpe
-  /* Here we rummage through the found bfds to collect toc information.  */
-  {
-    LANG_FOR_EACH_INPUT_STATEMENT (is)
-      {
-       if (!ppc_process_before_allocation (is->the_bfd, &link_info))
-         {
-           /* xgettext:c-format */
-           einfo (_("%P: errors encountered processing file %s\n"), is->filename);
-         }
-      }
-  }
-
-  /* We have seen it all. Allocate it, and carry on.  */
-  ppc_allocate_toc_section (&link_info);
-#endif /* TARGET_IS_ppcpe */
-
 #if defined(TARGET_IS_armpe) || defined(TARGET_IS_arm_wince_pe)
   /* FIXME: we should be able to set the size of the interworking stub
      section.
index 4ef0987de0717267736d472eb25cb3f3fffb9c87..a954e775f69ee313720a14eb4ab86ab09a38b8c5 100644 (file)
@@ -262,9 +262,7 @@ epc532macha.c
 epdp11.c
 epjelf.c
 epjlelf.c
-eppclynx.c
 eppcmacos.c
-eppcpe.c
 epruelf.c
 escore3_elf.c
 escore7_elf.c
diff --git a/ld/scripttempl/ppcpe.sc b/ld/scripttempl/ppcpe.sc
deleted file mode 100644 (file)
index d8e734b..0000000
+++ /dev/null
@@ -1,208 +0,0 @@
-# A PE linker script for PowerPC.
-# Loosely based on Steve Chamberlain's pe.sc.
-# All new mistakes should be credited to Kim Knuttila (krk@cygnus.com)
-#
-# Copyright (C) 2014-2020 Free Software Foundation, Inc.
-#
-# Copying and distribution of this file, with or without modification,
-# are permitted in any medium without royalty provided the copyright
-# notice and this notice are preserved.
-#
-
-cat <<EOF
-/* Copyright (C) 2014-2020 Free Software Foundation, Inc.
-
-   Copying and distribution of this script, with or without modification,
-   are permitted in any medium without royalty provided the copyright
-   notice and this notice are preserved.  */
-
-OUTPUT_FORMAT(${OUTPUT_FORMAT})
-${LIB_SEARCH_DIRS}
-
-/* Much of this layout was determined by delving into .exe files for
-   the box generated by other compilers/linkers/etc. This means that
-   if a particular feature did not happen to appear in one of the
-   subject files, then it may not be yet supported.
-*/
-
-/* It's "mainCRTStartup", not "_mainCRTStartup", and it's located in
-   one of the two .lib files (libc.lib and kernel32.lib) that currently
-   must be present on the link line. This means that you must use
-   "-u mainCRTStartup" to make sure it gets included in the link.
-*/
-
-${RELOCATING+ENTRY (mainCRTStartup)}
-
-SECTIONS
-{
-
-  /* text - the usual meaning */
-  .text ${RELOCATING+ __image_base__ + __section_alignment__ } :
-       {
-           ${RELOCATING+ KEEP (*(SORT_NONE(.init)))}
-           *(.text)
-           ${RELOCATING+ *(.text.*)}
-           *(.gcc_except_table)
-           ${CONSTRUCTING+ ___CTOR_LIST__ = .; __CTOR_LIST__ = . ;
-                       LONG (-1); *(.ctors); *(.ctor); LONG (0); }
-           ${CONSTRUCTING+ ___DTOR_LIST__ = .; __DTOR_LIST__ = . ;
-                       LONG (-1); *(.dtors); *(.dtor); LONG (0); }
-           ${RELOCATING+ KEEP (*(SORT_NONE(.fini)))}
-           ${RELOCATING+ etext = .};
-       }
-
-  /* rdata - Read Only Runtime Data
-     CTR sections: All of the CRT (read only C runtime data) sections
-       appear at the start of the .rdata (read only runtime data)
-       section, in the following order. Don't know if it matters or not.
-       Not all sections are always present either.
-     .rdata: compiler generated read only data
-     .xdata: compiler generated exception handling table. (Most docs
-       seem to suggest that this section is now deprecated infavor
-       of the ydata section)
-     .edata: The exported names table.
-  */
-  .rdata BLOCK(__section_alignment__) :
-       {
-           *(.CRT\$XCA);
-           *(.CRT\$XCC);
-           *(.CRT\$XCZ);
-           *(.CRT\$XIA);
-           *(.CRT\$XIC);
-           *(.CRT\$XIZ);
-           *(.CRT\$XLA);
-           *(.CRT\$XLZ);
-           *(.CRT\$XPA);
-           *(.CRT\$XPX);
-           *(.CRT\$XPZ);
-           *(.CRT\$XTA);
-           *(.CRT\$XTZ);
-           *(.rdata);
-           *(.xdata);
-       }
-
-  .edata BLOCK(__section_alignment__) :
-       {
-           *(.edata);
-       }
-
-  /* data - initialized data
-     .ydata: exception handling information.
-     .data: the usual meaning.
-     .data2: more of the same.
-     .bss: For some reason, bss appears to be included in the data
-       section, as opposed to being given a section of it's own.
-     COMMON:
-  */
-  .data BLOCK(__section_alignment__) :
-       {
-           __data_start__ = . ;
-           *(.ydata);
-           *(.data);
-           *(.data2);
-           __bss_start__ = . ;
-           *(.bss) ;
-           *(COMMON);
-           __bss_end__ = . ;
-           ${RELOCATING+ end =  .};
-           __data_end__ = . ;
-       }
-
-  /* The exception handling table. A sequence of 5 word entries. Section
-     address and extent are placed in the DataDirectory.
-  */
-  .pdata BLOCK(__section_alignment__) :
-       {
-           *(.pdata)
-           ;
-       }
-
-  /* The idata section is chock full of magic bits.
-       1. Boundaries around various idata parts are used to initialize
-          some of the fields of the DataDirectory. In particular, the
-          magic for 2, 4 and 5 are known to be used. Some compilers
-          appear to generate magic section symbols for this purpose.
-          Where we can, we catch such symbols and use our own. This of
-          course is something less than a perfect strategy.
-       2. The table of contents is placed immediately after idata4.
-          The ".private.toc" sections are generated by the ppc bfd. The
-          .toc variable is generated by gas, and resolved here. It is
-          used to initialized function descriptors (and anyone else who
-          needs the address of the module's toc). The only thing
-          interesting about it at all? Most ppc instructions using it
-          have a 16bit displacement field. The convention for addressing
-          is to initialize the .toc value to 32K past the start of the
-          actual toc, and subtract 32K from all references, thus using
-          the entire 64K range. Naturally, the reloc code must agree
-          on this number or you get pretty stupid results.
-  */
-  .idata BLOCK(__section_alignment__) :
-       {
-           __idata2_magic__ = .;
-           *(.idata\$2);
-           __idata3_magic__ = .;
-           *(.idata\$3);
-           __idata4_magic__ = .;
-           *(.idata\$4);
-           . = ALIGN(4);
-           .toc = . + 32768;
-           *(.private.toc);
-           __idata5_magic__ = .;
-           *(.idata\$5);
-           __idata6_magic__ = .;
-           *(.idata\$6);
-           __idata7_magic__ = .;
-           *(.idata\$7);
-           ;
-       }
-
-  /* reldata -- data that requires relocation
-  */
-  .reldata BLOCK(__section_alignment__) :
-       {
-           *(.reldata)
-           ;
-       }
-
-
-  /* Resources */
-  .rsrc BLOCK(__section_alignment__) :
-       {
-           *(.rsrc\$01)
-           *(.rsrc\$02)
-           ;
-       }
-
-  .stab BLOCK(__section_alignment__)  ${RELOCATING+(NOLOAD)} :
-  {
-    [ .stab ]
-  }
-
-  .stabstr BLOCK(__section_alignment__) ${RELOCATING+(NOLOAD)} :
-  {
-    [ .stabstr ]
-  }
-
-  /* The .reloc section is currently generated by the dlltool from Steve
-     Chamberlain in a second pass of linking. Section address and extent
-     are placed in the DataDirectory.
-  */
-  .reloc BLOCK(__section_alignment__) :
-       {
-           *(.reloc)
-           ;
-       }
-
-  /* We don't do anything useful with codeview debugger support or the
-     directive section (yet). Hopefully, we junk them correctly.
-  */
-  /DISCARD/ BLOCK(__section_alignment__) :
-       {
-           *(.debug\$S)
-           *(.debug\$T)
-           *(.debug\$F)
-           *(.drectve)
-           ;
-       }
-}
-EOF