* config/tc-ppc.c (ppc_elf_suffix): Add valid32 and valid64 fields
	to struct map_bfd.  Adjust MAP macro, and define MAP32, MAP64.
	Update "mapping".  Restrict some @ modifiers to 32 bit.
This commit is contained in:
Alan Modra
2004-04-07 04:50:15 +00:00
parent 11d5789c7f
commit b7d7dc6302
2 changed files with 109 additions and 106 deletions

View File

@ -1,3 +1,10 @@
2004-04-07 Alan Modra <amodra@bigpond.net.au>
PR 96
* config/tc-ppc.c (ppc_elf_suffix): Add valid32 and valid64 fields
to struct map_bfd. Adjust MAP macro, and define MAP32, MAP64.
Update "mapping". Restrict some @ modifiers to 32 bit.
2004-04-01 Asgari Jinia <asgarij@kpitcummins.com>
Dhananjay Deshpande <dhananjayd@kpitcummins.com>

View File

@ -1,6 +1,6 @@
/* tc-ppc.c -- Assemble for the PowerPC or POWER (RS/6000)
Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
Free Software Foundation, Inc.
Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
2004 Free Software Foundation, Inc.
Written by Ian Lance Taylor, Cygnus Support.
This file is part of GAS, the GNU Assembler.
@ -1493,8 +1493,10 @@ ppc_elf_suffix (str_p, exp_p)
{
struct map_bfd {
char *string;
int length;
int reloc;
unsigned int length : 8;
unsigned int valid32 : 1;
unsigned int valid64 : 1;
unsigned int reloc;
};
char ident[20];
@ -1504,97 +1506,97 @@ ppc_elf_suffix (str_p, exp_p)
int len;
const struct map_bfd *ptr;
#define MAP(str,reloc) { str, sizeof (str)-1, reloc }
#define MAP(str, reloc) { str, sizeof (str) - 1, 1, 1, reloc }
#define MAP32(str, reloc) { str, sizeof (str) - 1, 1, 0, reloc }
#define MAP64(str, reloc) { str, sizeof (str) - 1, 0, 1, reloc }
static const struct map_bfd mapping[] = {
MAP ("l", (int) BFD_RELOC_LO16),
MAP ("h", (int) BFD_RELOC_HI16),
MAP ("ha", (int) BFD_RELOC_HI16_S),
MAP ("brtaken", (int) BFD_RELOC_PPC_B16_BRTAKEN),
MAP ("brntaken", (int) BFD_RELOC_PPC_B16_BRNTAKEN),
MAP ("got", (int) BFD_RELOC_16_GOTOFF),
MAP ("got@l", (int) BFD_RELOC_LO16_GOTOFF),
MAP ("got@h", (int) BFD_RELOC_HI16_GOTOFF),
MAP ("got@ha", (int) BFD_RELOC_HI16_S_GOTOFF),
MAP ("fixup", (int) BFD_RELOC_CTOR),
MAP ("plt", (int) BFD_RELOC_24_PLT_PCREL),
MAP ("pltrel24", (int) BFD_RELOC_24_PLT_PCREL),
MAP ("copy", (int) BFD_RELOC_PPC_COPY),
MAP ("globdat", (int) BFD_RELOC_PPC_GLOB_DAT),
MAP ("local24pc", (int) BFD_RELOC_PPC_LOCAL24PC),
MAP ("local", (int) BFD_RELOC_PPC_LOCAL24PC),
MAP ("pltrel", (int) BFD_RELOC_32_PLT_PCREL),
MAP ("plt@l", (int) BFD_RELOC_LO16_PLTOFF),
MAP ("plt@h", (int) BFD_RELOC_HI16_PLTOFF),
MAP ("plt@ha", (int) BFD_RELOC_HI16_S_PLTOFF),
MAP ("sdarel", (int) BFD_RELOC_GPREL16),
MAP ("sectoff", (int) BFD_RELOC_16_BASEREL),
MAP ("sectoff@l", (int) BFD_RELOC_LO16_BASEREL),
MAP ("sectoff@h", (int) BFD_RELOC_HI16_BASEREL),
MAP ("sectoff@ha", (int) BFD_RELOC_HI16_S_BASEREL),
MAP ("naddr", (int) BFD_RELOC_PPC_EMB_NADDR32),
MAP ("naddr16", (int) BFD_RELOC_PPC_EMB_NADDR16),
MAP ("naddr@l", (int) BFD_RELOC_PPC_EMB_NADDR16_LO),
MAP ("naddr@h", (int) BFD_RELOC_PPC_EMB_NADDR16_HI),
MAP ("naddr@ha", (int) BFD_RELOC_PPC_EMB_NADDR16_HA),
MAP ("sdai16", (int) BFD_RELOC_PPC_EMB_SDAI16),
MAP ("sda2rel", (int) BFD_RELOC_PPC_EMB_SDA2REL),
MAP ("sda2i16", (int) BFD_RELOC_PPC_EMB_SDA2I16),
MAP ("sda21", (int) BFD_RELOC_PPC_EMB_SDA21),
MAP ("mrkref", (int) BFD_RELOC_PPC_EMB_MRKREF),
MAP ("relsect", (int) BFD_RELOC_PPC_EMB_RELSEC16),
MAP ("relsect@l", (int) BFD_RELOC_PPC_EMB_RELST_LO),
MAP ("relsect@h", (int) BFD_RELOC_PPC_EMB_RELST_HI),
MAP ("relsect@ha", (int) BFD_RELOC_PPC_EMB_RELST_HA),
MAP ("bitfld", (int) BFD_RELOC_PPC_EMB_BIT_FLD),
MAP ("relsda", (int) BFD_RELOC_PPC_EMB_RELSDA),
MAP ("xgot", (int) BFD_RELOC_PPC_TOC16),
MAP ("tls", (int) BFD_RELOC_PPC_TLS),
MAP ("dtpmod", (int) BFD_RELOC_PPC_DTPMOD),
MAP ("dtprel", (int) BFD_RELOC_PPC_DTPREL),
MAP ("dtprel@l", (int) BFD_RELOC_PPC_DTPREL16_LO),
MAP ("dtprel@h", (int) BFD_RELOC_PPC_DTPREL16_HI),
MAP ("dtprel@ha", (int) BFD_RELOC_PPC_DTPREL16_HA),
MAP ("tprel", (int) BFD_RELOC_PPC_TPREL),
MAP ("tprel@l", (int) BFD_RELOC_PPC_TPREL16_LO),
MAP ("tprel@h", (int) BFD_RELOC_PPC_TPREL16_HI),
MAP ("tprel@ha", (int) BFD_RELOC_PPC_TPREL16_HA),
MAP ("got@tlsgd", (int) BFD_RELOC_PPC_GOT_TLSGD16),
MAP ("got@tlsgd@l", (int) BFD_RELOC_PPC_GOT_TLSGD16_LO),
MAP ("got@tlsgd@h", (int) BFD_RELOC_PPC_GOT_TLSGD16_HI),
MAP ("got@tlsgd@ha", (int) BFD_RELOC_PPC_GOT_TLSGD16_HA),
MAP ("got@tlsld", (int) BFD_RELOC_PPC_GOT_TLSLD16),
MAP ("got@tlsld@l", (int) BFD_RELOC_PPC_GOT_TLSLD16_LO),
MAP ("got@tlsld@h", (int) BFD_RELOC_PPC_GOT_TLSLD16_HI),
MAP ("got@tlsld@ha", (int) BFD_RELOC_PPC_GOT_TLSLD16_HA),
MAP ("got@dtprel", (int) BFD_RELOC_PPC_GOT_DTPREL16),
MAP ("got@dtprel@l", (int) BFD_RELOC_PPC_GOT_DTPREL16_LO),
MAP ("got@dtprel@h", (int) BFD_RELOC_PPC_GOT_DTPREL16_HI),
MAP ("got@dtprel@ha", (int) BFD_RELOC_PPC_GOT_DTPREL16_HA),
MAP ("got@tprel", (int) BFD_RELOC_PPC_GOT_TPREL16),
MAP ("got@tprel@l", (int) BFD_RELOC_PPC_GOT_TPREL16_LO),
MAP ("got@tprel@h", (int) BFD_RELOC_PPC_GOT_TPREL16_HI),
MAP ("got@tprel@ha", (int) BFD_RELOC_PPC_GOT_TPREL16_HA),
/* The following are only valid for ppc64. Negative values are
used instead of a flag. */
MAP ("higher", - (int) BFD_RELOC_PPC64_HIGHER),
MAP ("highera", - (int) BFD_RELOC_PPC64_HIGHER_S),
MAP ("highest", - (int) BFD_RELOC_PPC64_HIGHEST),
MAP ("highesta", - (int) BFD_RELOC_PPC64_HIGHEST_S),
MAP ("tocbase", - (int) BFD_RELOC_PPC64_TOC),
MAP ("toc", - (int) BFD_RELOC_PPC_TOC16),
MAP ("toc@l", - (int) BFD_RELOC_PPC64_TOC16_LO),
MAP ("toc@h", - (int) BFD_RELOC_PPC64_TOC16_HI),
MAP ("toc@ha", - (int) BFD_RELOC_PPC64_TOC16_HA),
MAP ("dtprel@higher", - (int) BFD_RELOC_PPC64_DTPREL16_HIGHER),
MAP ("dtprel@highera", - (int) BFD_RELOC_PPC64_DTPREL16_HIGHERA),
MAP ("dtprel@highest", - (int) BFD_RELOC_PPC64_DTPREL16_HIGHEST),
MAP ("dtprel@highesta", - (int) BFD_RELOC_PPC64_DTPREL16_HIGHESTA),
MAP ("tprel@higher", - (int) BFD_RELOC_PPC64_TPREL16_HIGHER),
MAP ("tprel@highera", - (int) BFD_RELOC_PPC64_TPREL16_HIGHERA),
MAP ("tprel@highest", - (int) BFD_RELOC_PPC64_TPREL16_HIGHEST),
MAP ("tprel@highesta", - (int) BFD_RELOC_PPC64_TPREL16_HIGHESTA),
{ (char *) 0, 0, (int) BFD_RELOC_UNUSED }
MAP ("l", BFD_RELOC_LO16),
MAP ("h", BFD_RELOC_HI16),
MAP ("ha", BFD_RELOC_HI16_S),
MAP ("brtaken", BFD_RELOC_PPC_B16_BRTAKEN),
MAP ("brntaken", BFD_RELOC_PPC_B16_BRNTAKEN),
MAP ("got", BFD_RELOC_16_GOTOFF),
MAP ("got@l", BFD_RELOC_LO16_GOTOFF),
MAP ("got@h", BFD_RELOC_HI16_GOTOFF),
MAP ("got@ha", BFD_RELOC_HI16_S_GOTOFF),
MAP ("plt@l", BFD_RELOC_LO16_PLTOFF),
MAP ("plt@h", BFD_RELOC_HI16_PLTOFF),
MAP ("plt@ha", BFD_RELOC_HI16_S_PLTOFF),
MAP ("copy", BFD_RELOC_PPC_COPY),
MAP ("globdat", BFD_RELOC_PPC_GLOB_DAT),
MAP ("sectoff", BFD_RELOC_16_BASEREL),
MAP ("sectoff@l", BFD_RELOC_LO16_BASEREL),
MAP ("sectoff@h", BFD_RELOC_HI16_BASEREL),
MAP ("sectoff@ha", BFD_RELOC_HI16_S_BASEREL),
MAP ("tls", BFD_RELOC_PPC_TLS),
MAP ("dtpmod", BFD_RELOC_PPC_DTPMOD),
MAP ("dtprel", BFD_RELOC_PPC_DTPREL),
MAP ("dtprel@l", BFD_RELOC_PPC_DTPREL16_LO),
MAP ("dtprel@h", BFD_RELOC_PPC_DTPREL16_HI),
MAP ("dtprel@ha", BFD_RELOC_PPC_DTPREL16_HA),
MAP ("tprel", BFD_RELOC_PPC_TPREL),
MAP ("tprel@l", BFD_RELOC_PPC_TPREL16_LO),
MAP ("tprel@h", BFD_RELOC_PPC_TPREL16_HI),
MAP ("tprel@ha", BFD_RELOC_PPC_TPREL16_HA),
MAP ("got@tlsgd", BFD_RELOC_PPC_GOT_TLSGD16),
MAP ("got@tlsgd@l", BFD_RELOC_PPC_GOT_TLSGD16_LO),
MAP ("got@tlsgd@h", BFD_RELOC_PPC_GOT_TLSGD16_HI),
MAP ("got@tlsgd@ha", BFD_RELOC_PPC_GOT_TLSGD16_HA),
MAP ("got@tlsld", BFD_RELOC_PPC_GOT_TLSLD16),
MAP ("got@tlsld@l", BFD_RELOC_PPC_GOT_TLSLD16_LO),
MAP ("got@tlsld@h", BFD_RELOC_PPC_GOT_TLSLD16_HI),
MAP ("got@tlsld@ha", BFD_RELOC_PPC_GOT_TLSLD16_HA),
MAP ("got@dtprel", BFD_RELOC_PPC_GOT_DTPREL16),
MAP ("got@dtprel@l", BFD_RELOC_PPC_GOT_DTPREL16_LO),
MAP ("got@dtprel@h", BFD_RELOC_PPC_GOT_DTPREL16_HI),
MAP ("got@dtprel@ha", BFD_RELOC_PPC_GOT_DTPREL16_HA),
MAP ("got@tprel", BFD_RELOC_PPC_GOT_TPREL16),
MAP ("got@tprel@l", BFD_RELOC_PPC_GOT_TPREL16_LO),
MAP ("got@tprel@h", BFD_RELOC_PPC_GOT_TPREL16_HI),
MAP ("got@tprel@ha", BFD_RELOC_PPC_GOT_TPREL16_HA),
MAP32 ("fixup", BFD_RELOC_CTOR),
MAP32 ("plt", BFD_RELOC_24_PLT_PCREL),
MAP32 ("pltrel24", BFD_RELOC_24_PLT_PCREL),
MAP32 ("local24pc", BFD_RELOC_PPC_LOCAL24PC),
MAP32 ("local", BFD_RELOC_PPC_LOCAL24PC),
MAP32 ("pltrel", BFD_RELOC_32_PLT_PCREL),
MAP32 ("sdarel", BFD_RELOC_GPREL16),
MAP32 ("naddr", BFD_RELOC_PPC_EMB_NADDR32),
MAP32 ("naddr16", BFD_RELOC_PPC_EMB_NADDR16),
MAP32 ("naddr@l", BFD_RELOC_PPC_EMB_NADDR16_LO),
MAP32 ("naddr@h", BFD_RELOC_PPC_EMB_NADDR16_HI),
MAP32 ("naddr@ha", BFD_RELOC_PPC_EMB_NADDR16_HA),
MAP32 ("sdai16", BFD_RELOC_PPC_EMB_SDAI16),
MAP32 ("sda2rel", BFD_RELOC_PPC_EMB_SDA2REL),
MAP32 ("sda2i16", BFD_RELOC_PPC_EMB_SDA2I16),
MAP32 ("sda21", BFD_RELOC_PPC_EMB_SDA21),
MAP32 ("mrkref", BFD_RELOC_PPC_EMB_MRKREF),
MAP32 ("relsect", BFD_RELOC_PPC_EMB_RELSEC16),
MAP32 ("relsect@l", BFD_RELOC_PPC_EMB_RELST_LO),
MAP32 ("relsect@h", BFD_RELOC_PPC_EMB_RELST_HI),
MAP32 ("relsect@ha", BFD_RELOC_PPC_EMB_RELST_HA),
MAP32 ("bitfld", BFD_RELOC_PPC_EMB_BIT_FLD),
MAP32 ("relsda", BFD_RELOC_PPC_EMB_RELSDA),
MAP32 ("xgot", BFD_RELOC_PPC_TOC16),
MAP64 ("higher", BFD_RELOC_PPC64_HIGHER),
MAP64 ("highera", BFD_RELOC_PPC64_HIGHER_S),
MAP64 ("highest", BFD_RELOC_PPC64_HIGHEST),
MAP64 ("highesta", BFD_RELOC_PPC64_HIGHEST_S),
MAP64 ("tocbase", BFD_RELOC_PPC64_TOC),
MAP64 ("toc", BFD_RELOC_PPC_TOC16),
MAP64 ("toc@l", BFD_RELOC_PPC64_TOC16_LO),
MAP64 ("toc@h", BFD_RELOC_PPC64_TOC16_HI),
MAP64 ("toc@ha", BFD_RELOC_PPC64_TOC16_HA),
MAP64 ("dtprel@higher", BFD_RELOC_PPC64_DTPREL16_HIGHER),
MAP64 ("dtprel@highera", BFD_RELOC_PPC64_DTPREL16_HIGHERA),
MAP64 ("dtprel@highest", BFD_RELOC_PPC64_DTPREL16_HIGHEST),
MAP64 ("dtprel@highesta", BFD_RELOC_PPC64_DTPREL16_HIGHESTA),
MAP64 ("tprel@higher", BFD_RELOC_PPC64_TPREL16_HIGHER),
MAP64 ("tprel@highera", BFD_RELOC_PPC64_TPREL16_HIGHERA),
MAP64 ("tprel@highest", BFD_RELOC_PPC64_TPREL16_HIGHEST),
MAP64 ("tprel@highesta", BFD_RELOC_PPC64_TPREL16_HIGHESTA),
{ (char *) 0, 0, 0, 0, BFD_RELOC_UNUSED }
};
if (*str++ != '@')
@ -1615,17 +1617,11 @@ ppc_elf_suffix (str_p, exp_p)
for (ptr = &mapping[0]; ptr->length > 0; ptr++)
if (ch == ptr->string[0]
&& len == ptr->length
&& memcmp (ident, ptr->string, ptr->length) == 0)
&& memcmp (ident, ptr->string, ptr->length) == 0
&& (ppc_obj64 ? ptr->valid64 : ptr->valid32))
{
int reloc = ptr->reloc;
if (reloc < 0)
{
if (!ppc_obj64)
return BFD_RELOC_UNUSED;
reloc = -reloc;
}
if (!ppc_obj64)
if (exp_p->X_add_number != 0
&& (reloc == (int) BFD_RELOC_16_GOTOFF