Remove powerpc PE support

Plus some leftover powerpc lynxos support.

bfd/
	* coff-ppc.c: Delete.
	* pe-ppc.c: Delete.
	* pei-ppc.c: Delete.
	* Makefile.am (BFD32_BACKENDS, BFD32_BACKENDS_CFILES): Remove PE PPC.
	* coffcode.h (coff_set_arch_mach_hook, coff_set_flags): Remove
	PPCMAGIC code.
	(coff_write_object_contents): Remove PPC_PE code.
	* config.bfd: Move powerpcle-pe to removed targets.
	* configure.ac: Remove powerpc PE entries.
	* libcoff-in.h (ppc_allocate_toc_section): Delete.
	(ppc_process_before_allocation): Delete.
	* peXXigen.c: Remove POWERPC_LE_PE code and comments.
	* targets.c: Remove powerpc PE vectors.
	* po/SRC-POTFILES.in: Regenerate.
	* libcoff.h: Regenerate.
	* Makefile.in: Regenerate.
	* configure: Regenerate.
binutils/
	* dlltool.c: Remove powerpc PE support and comments.
	* configure.ac: Remove powerpc PE dlltool config.
	* configure: Regenerate.
gas/
	* config/obj-coff.h: Remove TE_PE support.
	* config/tc-ppc.c: Likewise.
	* config/tc-ppc.h: Likewise.
	* configure.tgt: Remove powerpc PE and powerpc lynxos.
	* testsuite/gas/cfi/cfi.exp (cfi-common-6): Remove powerpc PE
	condition.
	* testsuite/gas/macros/macros.exp: Don't xfail powerpc PE.
include/
	* coff/powerpc.h: Delete.
ld/
	* emulparams/ppcpe.sh: Delete.
	* scripttempl/ppcpe.sc: Delete.
	* emulparams/ppclynx.sh: Delete.
	* Makefile.am (ALL_EMULATION_SOURCES): Remove ppc PE and lynxos.
	* configure.tgt: Likewise.
	* emultempl/beos.em: Remove powerpc PE support.
	* emultempl/pe.em: Likewise.
	* po/BLD-POTFILES.in: Regenerate.
	* Makefile.in: Regenerate.
This commit is contained in:
Alan Modra
2020-07-08 21:21:32 +09:30
parent c560184eb2
commit fe49679d51
38 changed files with 95 additions and 4420 deletions

View File

@ -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.