* 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> 2004-04-01 Asgari Jinia <asgarij@kpitcummins.com>
Dhananjay Deshpande <dhananjayd@kpitcummins.com> Dhananjay Deshpande <dhananjayd@kpitcummins.com>

View File

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