* config/tc-mn10300.c (tc_gen_reloc): Don't emit an *ABS*
authorAlexandre Oliva <aoliva@redhat.com>
Tue, 25 Sep 2001 08:51:52 +0000 (08:51 +0000)
committerAlexandre Oliva <aoliva@redhat.com>
Tue, 25 Sep 2001 08:51:52 +0000 (08:51 +0000)
relocation for differences between symbols in a section other
than the one in which the difference is to be placed; apply
the relocation instead.

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

index 31f61c4..eb9f1f8 100644 (file)
@@ -1,3 +1,10 @@
+2001-09-25  Alexandre Oliva  <aoliva@redhat.com>
+
+       * config/tc-mn10300.c (tc_gen_reloc): Don't emit an *ABS*
+       relocation for differences between symbols in a section other
+       than the one in which the difference is to be placed; apply
+       the relocation instead.
+
 2001-09-24  Nick Clifton  <nickc@cambridge.redhat.com>
 
        * config/tc-arc.c: Add missing prototype.
index 6782240..a2acc75 100644 (file)
@@ -1824,12 +1824,41 @@ tc_gen_reloc (seg, fixp)
        {
          as_bad_where (fixp->fx_file, fixp->fx_line,
                        "Difference of symbols in different sections is not supported");
-         return NULL;
        }
+      else
+       {
+         char *fixpos = fixp->fx_where + fixp->fx_frag->fr_literal;
+
+         reloc->addend = (S_GET_VALUE (fixp->fx_addsy)
+                          - S_GET_VALUE (fixp->fx_subsy) + fixp->fx_offset);
+
+         switch (fixp->fx_r_type)
+           {
+           case BFD_RELOC_8:
+             md_number_to_chars (fixpos, reloc->addend, 1);
+             break;
+             
+           case BFD_RELOC_16:
+             md_number_to_chars (fixpos, reloc->addend, 2);
+             break;
 
-      reloc->sym_ptr_ptr = (asymbol **) &bfd_abs_symbol;
-      reloc->addend = (S_GET_VALUE (fixp->fx_addsy)
-                      - S_GET_VALUE (fixp->fx_subsy) + fixp->fx_offset);
+           case BFD_RELOC_24:
+             md_number_to_chars (fixpos, reloc->addend, 3);
+             break;
+
+           case BFD_RELOC_32:
+             md_number_to_chars (fixpos, reloc->addend, 4);
+             break;
+
+           default:
+             reloc->sym_ptr_ptr = (asymbol **) &bfd_abs_symbol;
+             return reloc;
+           }
+       }
+
+      free (reloc->sym_ptr_ptr);
+      free (reloc);
+      return NULL;
     }
   else
     {