Remove magic treatment of toc symbols for powerpc ELF
authorAlan Modra <amodra@gmail.com>
Wed, 5 Mar 2014 08:57:57 +0000 (19:27 +1030)
committerAlan Modra <amodra@gmail.com>
Wed, 5 Mar 2014 08:57:57 +0000 (19:27 +1030)
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.

gas/ChangeLog
gas/config/tc-ppc.c

index 88e9d81451c30412a639db5a709abdce751329a5..e3ebd6706cf062abdad68a2a799d12a4d99c7a7d 100644 (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
index 7c99e438ef83bbf75f14f980d1f080bc0a3876d4..176b13c71c6a336223353b5ff6433ab8fd9cb0a6 100644 (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
 \f
 
 #ifdef OBJ_ELF
@@ -3280,25 +3271,17 @@ md_assemble (char *str)
                   && (operand->bitm & 0xfff0) == 0xfff0
                   && operand->shift == 0)
            {
-             /* Note: the symbol may be not yet defined.  */
-             if (ppc_is_toc_sym (ex.X_add_symbol))
-               {
-                 reloc = BFD_RELOC_PPC_TOC16;
+             reloc = BFD_RELOC_16;
 #ifdef OBJ_ELF
-                 if (ppc_obj64
-                     && (operand->flags & PPC_OPERAND_DS) != 0)
-                   reloc = BFD_RELOC_PPC64_TOC16_DS;
+             if (ppc_obj64
+                 && (operand->flags & PPC_OPERAND_DS) != 0)
+               reloc = BFD_RELOC_PPC64_ADDR16_DS;
 #endif
-               }
-             else
-               {
-                 reloc = BFD_RELOC_16;
-#ifdef OBJ_ELF
-                 if (ppc_obj64
-                     && (operand->flags & PPC_OPERAND_DS) != 0)
-                   reloc = BFD_RELOC_PPC64_ADDR16_DS;
+#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;
 #endif
-               }
            }
 #endif /* defined (OBJ_XCOFF) || defined (OBJ_ELF) */