Remove powerpc PE support

Message ID 20200709133508.GD25751@bubble.grove.modra.org
State New
Headers show
Series
  • Remove powerpc PE support
Related show

Commit Message

David Faust via Binutils July 9, 2020, 1:35 p.m.
Plus some leftover powerpc lynxos support.

powerpc-pe was obsoleted for 2.35.  Normally we'd leave the code in
the tree until 2.36 in case someone wanted to work on it.  I don't
think that's going to happen since the target support has been quite
bad for some time without anyone showing interest.  If support for
powerpc-pe were to be reinstated it would probably be better to
rewrite rather than patch.  So delete it now.

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.


-- 
Alan Modra
Australia Development Lab, IBM

Comments

Alexander von Gluck IV July 9, 2020, 7:21 p.m. | #1
July 9, 2020 8:35 AM, "Alan Modra via Binutils" <binutils@sourceware.org> wrote:

> Plus some leftover powerpc lynxos support.
> 
> powerpc-pe was obsoleted for 2.35. Normally we'd leave the code in
> the tree until 2.36 in case someone wanted to work on it. I don't
> think that's going to happen since the target support has been quite

A quick reminder that EFI extensively uses Pe for its loaders,
so there is a potential "modern" use for Pe + (insert arch here)

This isn't a volunteer to maintain it, but just pointing out
that ld.lld / llvm maintains Pe support for most architectures for
this reason.

There is some work around PPC64 + EFI, so it could "become a thing"
in the future.

 -- Alex
David Faust via Binutils July 10, 2020, 12:24 p.m. | #2
On Thu, Jul 09, 2020 at 07:21:01PM +0000, Alexander von Gluck IV wrote:
> July 9, 2020 8:35 AM, "Alan Modra via Binutils" <binutils@sourceware.org> wrote:

> 

> > Plus some leftover powerpc lynxos support.

> > 

> > powerpc-pe was obsoleted for 2.35. Normally we'd leave the code in

> > the tree until 2.36 in case someone wanted to work on it. I don't

> > think that's going to happen since the target support has been quite

> 

> A quick reminder that EFI extensively uses Pe for its loaders,

> so there is a potential "modern" use for Pe + (insert arch here)

> 

> This isn't a volunteer to maintain it, but just pointing out

> that ld.lld / llvm maintains Pe support for most architectures for

> this reason.

> 

> There is some work around PPC64 + EFI, so it could "become a thing"

> in the future.


Point taken, but what we had there in binutils has been broken for
over 20 years with no one stepping up to fix the problems.  I won't
stand in the way of anyone that wants to contribute working pe-coff
support back into binutils..

-- 
Alan Modra
Australia Development Lab, IBM

Patch

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index e11c77c071..afbccc3fa5 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -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.
diff --git a/bfd/Makefile.am b/bfd/Makefile.am
index c88c448000..f48a8e708e 100644
--- a/bfd/Makefile.am
+++ b/bfd/Makefile.am
@@ -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 \
diff --git a/bfd/Makefile.in b/bfd/Makefile.in
index d0d14c6ab3..e2dce2501e 100644
--- a/bfd/Makefile.in
+++ b/bfd/Makefile.in
@@ -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
index a3ad1ef8e6..0000000000
--- a/bfd/coff-ppc.c
+++ /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
-
-/* 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))
-
-/* 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 */
-
-};
-
-/* 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
-
-/* 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 */
-
-/* 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;
-}
-
-#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;
-}
-
-/* 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"
-
-#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
-
-/* 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
diff --git a/bfd/coffcode.h b/bfd/coffcode.h
index 0910f918d1..4b934b9b2b 100644
--- a/bfd/coffcode.h
+++ b/bfd/coffcode.h
@@ -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.  */
diff --git a/bfd/config.bfd b/bfd/config.bfd
index 14523caf0c..4586a89d0f 100644
--- a/bfd/config.bfd
+++ b/bfd/config.bfd
@@ -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
diff --git a/bfd/configure b/bfd/configure
index 47fd4576ca..ca255aaa55 100755
--- a/bfd/configure
+++ b/bfd/configure
@@ -14883,10 +14883,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" ;;
diff --git a/bfd/configure.ac b/bfd/configure.ac
index 8e86f8399c..ee3075aca3 100644
--- a/bfd/configure.ac
+++ b/bfd/configure.ac
@@ -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" ;;
diff --git a/bfd/libcoff-in.h b/bfd/libcoff-in.h
index b7fcea30bb..aa5edc2e96 100644
--- a/bfd/libcoff-in.h
+++ b/bfd/libcoff-in.h
@@ -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 *);
diff --git a/bfd/libcoff.h b/bfd/libcoff.h
index df32c8604e..514cec1149 100644
--- a/bfd/libcoff.h
+++ b/bfd/libcoff.h
@@ -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
index 1832576187..0000000000
--- a/bfd/pe-ppc.c
+++ /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"
diff --git a/bfd/peXXigen.c b/bfd/peXXigen.c
index 5149ef582b..3c3fa27e02 100644
--- a/bfd/peXXigen.c
+++ b/bfd/peXXigen.c
@@ -105,12 +105,6 @@ 
 #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.  */
 
 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
index b39c11e5f8..0000000000
--- a/bfd/pei-ppc.c
+++ /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"
diff --git a/bfd/po/SRC-POTFILES.in b/bfd/po/SRC-POTFILES.in
index 1e12399903..83530b27f2 100644
--- a/bfd/po/SRC-POTFILES.in
+++ b/bfd/po/SRC-POTFILES.in
@@ -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
diff --git a/bfd/targets.c b/bfd/targets.c
index 0732c5e429..35492b92bb 100644
--- a/bfd/targets.c
+++ b/bfd/targets.c
@@ -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,
diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index 9f6be43f0c..9bb68e6991 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -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.
diff --git a/binutils/configure b/binutils/configure
index 834527995c..da7da53f1d 100755
--- a/binutils/configure
+++ b/binutils/configure
@@ -15146,15 +15146,6 @@  do
 	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*) ;;
diff --git a/binutils/configure.ac b/binutils/configure.ac
index 4ac1f34a6d..883f3187e7 100644
--- a/binutils/configure.ac
+++ b/binutils/configure.ac
@@ -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*) ;;
diff --git a/binutils/dlltool.c b/binutils/dlltool.c
index d22ff54e09..ed016b97dc 100644
--- a/binutils/dlltool.c
+++ b/binutils/dlltool.c
@@ -229,7 +229,7 @@ 
    = 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.
diff --git a/gas/ChangeLog b/gas/ChangeLog
index cbd4779176..0b73294e4f 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -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:
diff --git a/gas/config/obj-coff.h b/gas/config/obj-coff.h
index 57dc8304e9..50da333892 100644
--- a/gas/config/obj-coff.h
+++ b/gas/config/obj-coff.h
@@ -41,12 +41,8 @@ 
 #endif
 
 #ifdef TC_PPC
-#ifdef TE_PE
-#include "coff/powerpc.h"
-#else
 #include "coff/rs6000.h"
 #endif
-#endif
 
 #ifdef TC_I386
 #ifdef TE_PEP
diff --git a/gas/config/tc-ppc.c b/gas/config/tc-ppc.c
index aa989e7d1c..1000b618f6 100644
--- a/gas/config/tc-ppc.c
+++ b/gas/config/tc-ppc.c
@@ -31,10 +31,6 @@ 
 #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
 
 /* 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 */
 
-#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) */
 
-#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
-
 #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
 }
diff --git a/gas/config/tc-ppc.h b/gas/config/tc-ppc.h
index bfe61294da..d887c053ff 100644
--- a/gas/config/tc-ppc.h
+++ b/gas/config/tc-ppc.h
@@ -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)
 
-#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
diff --git a/gas/configure.tgt b/gas/configure.tgt
index 337249597c..831ca901ba 100644
--- a/gas/configure.tgt
+++ b/gas/configure.tgt
@@ -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 ;;
 
diff --git a/gas/testsuite/gas/cfi/cfi.exp b/gas/testsuite/gas/cfi/cfi.exp
index afafd7a0de..8ec4ebcab3 100644
--- a/gas/testsuite/gas/cfi/cfi.exp
+++ b/gas/testsuite/gas/cfi/cfi.exp
@@ -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"
diff --git a/gas/testsuite/gas/macros/macros.exp b/gas/testsuite/gas/macros/macros.exp
index 7beaf48cf7..e444486e21 100644
--- a/gas/testsuite/gas/macros/macros.exp
+++ b/gas/testsuite/gas/macros/macros.exp
@@ -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-*-*"
 
diff --git a/include/ChangeLog b/include/ChangeLog
index 000dfe5034..1d7cafbe54 100644
--- a/include/ChangeLog
+++ b/include/ChangeLog
@@ -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
index ecc224369b..0000000000
--- a/include/coff/powerpc.h
+++ /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
-
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 195731edc3..14f31a805f 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -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,
diff --git a/ld/Makefile.am b/ld/Makefile.am
index 02c4fc1639..38ff2d9bc0 100644
--- a/ld/Makefile.am
+++ b/ld/Makefile.am
@@ -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@
diff --git a/ld/Makefile.in b/ld/Makefile.in
index 2fe12e14f6..aaf322ddf3 100644
--- a/ld/Makefile.in
+++ b/ld/Makefile.in
@@ -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@
diff --git a/ld/configure.tgt b/ld/configure.tgt
index 87c7d9a4ca..32f17d2402 100644
--- a/ld/configure.tgt
+++ b/ld/configure.tgt
@@ -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
index a58b5b047f..0000000000
--- a/ld/emulparams/ppclynx.sh
+++ /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
index ed7df88dcd..0000000000
--- a/ld/emulparams/ppcpe.sh
+++ /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
diff --git a/ld/emultempl/beos.em b/ld/emultempl/beos.em
index 4da5eeef6d..ace6e3a123 100644
--- a/ld/emultempl/beos.em
+++ b/ld/emultempl/beos.em
@@ -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;
diff --git a/ld/emultempl/pe.em b/ld/emultempl/pe.em
index 3899c9d92c..eb7c812470 100644
--- a/ld/emultempl/pe.em
+++ b/ld/emultempl/pe.em
@@ -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.
diff --git a/ld/po/BLD-POTFILES.in b/ld/po/BLD-POTFILES.in
index 4ef0987de0..a954e775f6 100644
--- a/ld/po/BLD-POTFILES.in
+++ b/ld/po/BLD-POTFILES.in
@@ -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
index d8e734b4df..0000000000
--- a/ld/scripttempl/ppcpe.sc
+++ /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