start at handling branch taken/branch not taken hints.
This commit is contained in:
parent
02f85cda33
commit
25b1cdd0f3
2 changed files with 47 additions and 32 deletions
|
@ -1,3 +1,10 @@
|
|||
Fri Sep 22 16:34:46 1995 Michael Meissner <meissner@tiktok.cygnus.com>
|
||||
|
||||
* config/tc-ppc.c (ppc_elf_suffix): Rewrite to use a table of
|
||||
strings and relocations they represent. Add @br{,n}taken for
|
||||
branch taken/not taken support.
|
||||
(md_apply_fix3): Add BFD_RELOC_PPC_B16_BR{,N}TAKEN support.
|
||||
|
||||
Thu Sep 21 21:10:17 1995 Michael Meissner <meissner@cygnus.com>
|
||||
|
||||
* config/tc-ppc.c (md_parse_option): -mrelocatable-lib now only
|
||||
|
|
|
@ -554,41 +554,46 @@ static bfd_reloc_code_real_type
|
|||
ppc_elf_suffix (str_p)
|
||||
char **str_p;
|
||||
{
|
||||
char *str = *str_p;
|
||||
struct map_bfd {
|
||||
char *string;
|
||||
int length;
|
||||
bfd_reloc_code_real_type reloc;
|
||||
};
|
||||
|
||||
if (*str != '@')
|
||||
char *str = *str_p;
|
||||
int ch;
|
||||
struct map_bfd *ptr;
|
||||
|
||||
static struct map_bfd mapping[] = {
|
||||
{ "GOT", 3, BFD_RELOC_PPC_TOC16 },
|
||||
{ "got", 3, BFD_RELOC_PPC_TOC16 },
|
||||
{ "L", 1, BFD_RELOC_LO16 },
|
||||
{ "l", 1, BFD_RELOC_LO16 },
|
||||
{ "HA", 2, BFD_RELOC_HI16_S },
|
||||
{ "ha", 2, BFD_RELOC_HI16_S },
|
||||
{ "H", 1, BFD_RELOC_HI16 },
|
||||
{ "h", 1, BFD_RELOC_HI16 },
|
||||
{ "SDAREL", 6, BFD_RELOC_GPREL16 },
|
||||
{ "sdarel", 6, BFD_RELOC_GPREL16 },
|
||||
{ "FIXUP", 5, BFD_RELOC_CTOR }, /* synonym for BFD_RELOC_32 that doesn't get */
|
||||
{ "fixup", 5, BFD_RELOC_CTOR }, /* warnings with -mrelocatable */
|
||||
{ "BRTAKEN", 7, BFD_RELOC_PPC_B16_BRTAKEN },
|
||||
{ "brtaken", 7, BFD_RELOC_PPC_B16_BRTAKEN },
|
||||
{ "BRNTAKEN", 8, BFD_RELOC_PPC_B16_BRNTAKEN },
|
||||
{ "brntaken", 8, BFD_RELOC_PPC_B16_BRNTAKEN },
|
||||
{ (char *)0, 0, BFD_RELOC_UNUSED }
|
||||
};
|
||||
|
||||
if (*str++ != '@')
|
||||
return BFD_RELOC_UNUSED;
|
||||
|
||||
if (strncmp (str, "@GOT", 4) == 0 || strncmp (str, "@got", 4) == 0)
|
||||
{
|
||||
*str_p += 4;
|
||||
return BFD_RELOC_PPC_TOC16;
|
||||
}
|
||||
else if (strncmp (str, "@L", 2) == 0 || strncmp (str, "@l", 2) == 0)
|
||||
{
|
||||
*str_p += 2;
|
||||
return BFD_RELOC_LO16;
|
||||
}
|
||||
else if (strncmp (str, "@HA", 3) == 0 || strncmp (str, "@ha", 3) == 0)
|
||||
{
|
||||
*str_p += 3;
|
||||
return BFD_RELOC_HI16_S;
|
||||
}
|
||||
else if (strncmp (str, "@H", 2) == 0 || strncmp (str, "@h", 2) == 0)
|
||||
{
|
||||
*str_p += 2;
|
||||
return BFD_RELOC_HI16;
|
||||
}
|
||||
else if (strncmp (str, "@sdarel", 7) == 0 || strncmp (str, "@sdarel", 7) == 0)
|
||||
{
|
||||
*str_p += 7;
|
||||
return BFD_RELOC_GPREL16;
|
||||
}
|
||||
else if (strncmp (str, "@FIXUP", 6) == 0 || strncmp (str, "@fixup", 6) == 0)
|
||||
{
|
||||
*str_p += 6;
|
||||
return BFD_RELOC_CTOR; /* synonym for BFD_RELOC_32 that doesn't get */
|
||||
} /* warnings with -mrelocatable */
|
||||
ch = *str;
|
||||
for (ptr = &mapping[0]; ptr->length > 0; ptr++)
|
||||
if (ch == ptr->string[0] && strncmp (str, ptr->string, ptr->length) == 0)
|
||||
{
|
||||
*str_p = str + ptr->length;
|
||||
return ptr->reloc;
|
||||
}
|
||||
|
||||
return BFD_RELOC_UNUSED;
|
||||
}
|
||||
|
@ -2790,6 +2795,9 @@ md_apply_fix3 (fixp, valuep, seg)
|
|||
if (fixp->fx_pcrel)
|
||||
abort ();
|
||||
|
||||
case BFD_RELOC_PPC_B16_BRTAKEN:
|
||||
case BFD_RELOC_PPC_B16_BRNTAKEN:
|
||||
value <<= 2;
|
||||
md_number_to_chars (fixp->fx_frag->fr_literal + fixp->fx_where,
|
||||
value, 2);
|
||||
break;
|
||||
|
|
Loading…
Reference in a new issue