* config/tc-ppc.c (md_apply_fix3): Replace haphazard code for
authorAlan Modra <amodra@gmail.com>
Wed, 8 Aug 2001 13:23:07 +0000 (13:23 +0000)
committerAlan Modra <amodra@gmail.com>
Wed, 8 Aug 2001 13:23:07 +0000 (13:23 +0000)
determining reloc type with code reading operands->reloc field.

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

index 424a69b0e31e076f3dc39cf162947d65006cae86..8edf0f4b06bb5e93c47fb5f70979d2fbc46c61a6 100644 (file)
@@ -1,3 +1,9 @@
+2001-08-08  Alan Modra  <amodra@bigpond.net.au>
+
+       From 1999-10-25  Torbjorn Granlund  <tege@swox.com>
+       * config/tc-ppc.c (md_apply_fix3): Replace haphazard code for
+       determining reloc type with code reading operands->reloc field.
+
 2001-08-08  Alan Modra  <amodra@bigpond.net.au>
 
        * config/obj-elf.c (elf_copy_symbol_attributes): Make it a global
index 0710a67a147a08bd673e63d2e530fdd164c60c6c..115920ffdb1f86d09b1aad77518fd64345cc3816 100644 (file)
@@ -4945,43 +4945,14 @@ md_apply_fix3 (fixp, valuep, seg)
       /* Determine a BFD reloc value based on the operand information.
         We are only prepared to turn a few of the operands into
         relocs.
-        FIXME: We need to handle the DS field at the very least.
-        FIXME: Selecting the reloc type is a bit haphazard; perhaps
-        there should be a new field in the operand table.  */
-      if ((operand->flags & PPC_OPERAND_RELATIVE) != 0
-         && operand->bits == 26
-         && operand->shift == 0)
-       fixp->fx_r_type = BFD_RELOC_PPC_B26;
-      else if ((operand->flags & PPC_OPERAND_RELATIVE) != 0
-         && operand->bits == 16
-         && operand->shift == 0)
-       fixp->fx_r_type = BFD_RELOC_PPC_B16;
-      else if ((operand->flags & PPC_OPERAND_ABSOLUTE) != 0
-              && operand->bits == 26
-              && operand->shift == 0)
-       fixp->fx_r_type = BFD_RELOC_PPC_BA26;
-      else if ((operand->flags & PPC_OPERAND_ABSOLUTE) != 0
-              && operand->bits == 16
-              && operand->shift == 0)
-       fixp->fx_r_type = BFD_RELOC_PPC_BA16;
-      else if ((operand->flags & PPC_OPERAND_PARENS) != 0
-              && operand->bits == 16
-              && operand->shift == 0
-              && fixp->fx_addsy != NULL
-              && ppc_is_toc_sym (fixp->fx_addsy))
-       {
-         fixp->fx_size = 2;
-         if (target_big_endian)
-           fixp->fx_where += 2;
-         fixp->fx_r_type = BFD_RELOC_PPC_TOC16;
-       }
-      else
+        For other operand types, give an error.  */
+      if (operand->reloc == 0)
        {
          char *sfile;
          unsigned int sline;
 
          /* Use expr_symbol_where to see if this is an expression
-             symbol.  */
+            symbol.  */
          if (expr_symbol_where (fixp->fx_addsy, &sfile, &sline))
            as_bad_where (fixp->fx_file, fixp->fx_line,
                          _("unresolved expression that must be resolved"));
@@ -4991,6 +4962,28 @@ md_apply_fix3 (fixp, valuep, seg)
          fixp->fx_done = 1;
          return 1;
        }
+
+      fixp->fx_r_type = operand->reloc;
+
+      if ((operand->flags & PPC_OPERAND_PARENS) != 0 && fixp->fx_addsy != NULL)
+       {
+         /* For ld/st/la reloc types (`la' == load address).
+            Instruction with D or DS field.  */
+         if (ppc_is_toc_sym (fixp->fx_addsy))
+           {
+             fixp->fx_size = 2;
+             if (target_big_endian)
+               fixp->fx_where += 2;
+           }
+         else
+           {
+             as_bad_where (fixp->fx_file, fixp->fx_line,
+                           _("unsupported relocation against %s"),
+                           S_GET_NAME (fixp->fx_addsy));
+             fixp->fx_done = 1;
+             return 1;
+           }
+       }
     }
   else
     {
@@ -5017,10 +5010,12 @@ md_apply_fix3 (fixp, valuep, seg)
          if (fixp->fx_pcrel)
            fixp->fx_r_type = BFD_RELOC_64_PCREL;
          /* fall through */
+
        case BFD_RELOC_64_PCREL:
          md_number_to_chars (fixp->fx_frag->fr_literal + fixp->fx_where,
                              value, 8);
          break;
+
        case BFD_RELOC_LO16:
        case BFD_RELOC_16:
        case BFD_RELOC_GPREL16:
@@ -5071,6 +5066,7 @@ md_apply_fix3 (fixp, valuep, seg)
          md_number_to_chars (fixp->fx_frag->fr_literal + fixp->fx_where,
                              value >> 16, 2);
          break;
+
        case BFD_RELOC_HI16_S:
          if (fixp->fx_pcrel)
            abort ();