Remove magic treatment of toc symbols for powerpc ELF

The XCOFF assembler does some wierd things with instructions like
`lwz 9,sym(30'.  See the comment in md_apply_fix.  From an ELF
perspective, it's weird even to magically select a TOC16 reloc
when a symbol is in the TOC/GOT.  ELF assemblers generally use
modifiers like @toc to select relocs, so remove this "feature"
for ELF.  I believe this was to support gcc -m32 -mcall-aixdesc
but that combination of gcc options has been broken for a long
time.

	* config/tc-ppc.c (ppc_is_toc_sym): Remove OBJ_ELF support.
	(md_assemble): Don't call ppc_is_toc_sym for ELF.
This commit is contained in:
Alan Modra 2014-03-05 19:27:57 +10:30
parent b2b255bdf3
commit f50c47f118
2 changed files with 15 additions and 27 deletions

View File

@ -1,3 +1,8 @@
2014-03-05 Alan Modra <amodra@gmail.com>
* config/tc-ppc.c (ppc_is_toc_sym): Remove OBJ_ELF support.
(md_assemble): Don't call ppc_is_toc_sym for ELF.
2014-03-04 Heiher <r@hev.cc>
* config/tc-mips.c (mips_cpu_info_table): Use ISA_MIPS64R2 for

View File

@ -2531,25 +2531,16 @@ parse_toc_entry (enum toc_size_qualifier *toc_kind)
}
#endif
#if defined (OBJ_XCOFF) || defined (OBJ_ELF)
#ifdef OBJ_XCOFF
/* See whether a symbol is in the TOC section. */
static int
ppc_is_toc_sym (symbolS *sym)
{
#ifdef OBJ_XCOFF
return (symbol_get_tc (sym)->symbol_class == XMC_TC
|| symbol_get_tc (sym)->symbol_class == XMC_TC0);
#endif
#ifdef OBJ_ELF
const char *sname = segment_name (S_GET_SEGMENT (sym));
if (ppc_obj64)
return strcmp (sname, ".toc") == 0;
else
return strcmp (sname, ".got") == 0;
#endif
}
#endif /* defined (OBJ_XCOFF) || defined (OBJ_ELF) */
#endif
#ifdef OBJ_ELF
@ -3280,25 +3271,17 @@ md_assemble (char *str)
&& (operand->bitm & 0xfff0) == 0xfff0
&& operand->shift == 0)
{
reloc = BFD_RELOC_16;
#ifdef OBJ_ELF
if (ppc_obj64
&& (operand->flags & PPC_OPERAND_DS) != 0)
reloc = BFD_RELOC_PPC64_ADDR16_DS;
#endif
#ifdef OBJ_XCOFF
/* Note: the symbol may be not yet defined. */
if (ppc_is_toc_sym (ex.X_add_symbol))
{
reloc = BFD_RELOC_PPC_TOC16;
#ifdef OBJ_ELF
if (ppc_obj64
&& (operand->flags & PPC_OPERAND_DS) != 0)
reloc = BFD_RELOC_PPC64_TOC16_DS;
reloc = BFD_RELOC_PPC_TOC16;
#endif
}
else
{
reloc = BFD_RELOC_16;
#ifdef OBJ_ELF
if (ppc_obj64
&& (operand->flags & PPC_OPERAND_DS) != 0)
reloc = BFD_RELOC_PPC64_ADDR16_DS;
#endif
}
}
#endif /* defined (OBJ_XCOFF) || defined (OBJ_ELF) */