Teach a few targets to resolve BFD_RELOC_8
authorAlan Modra <amodra@gmail.com>
Tue, 19 Mar 2019 22:50:55 +0000 (09:20 +1030)
committerAlan Modra <amodra@gmail.com>
Wed, 20 Mar 2019 22:16:42 +0000 (08:46 +1030)
and tidy "forward" test.  I've removed some checks in d30v
md_apply_fix that have no business being there.  Any symbol problems
will be caught later in tc_gen_reloc, and overflow checking is done in
gas/write.c.

* config/tc-d10v.c (md_apply_fix): Apply BFD_RELOC_8.
* config/tc-pdp11.c (md_apply_fix): Likewise.
* config/tc-d30v.c (md_apply_fix): Don't emit errors for BFD_RELOC_8,
BFD_RELOC_16, and BFD_RELOC_64.
* testsuite/gas/all/gas.exp: Move target exclusions for forward
test, but not cr16, to..
* testsuite/gas/all/forward.d: ..here, with explanation.  Remove
d10v, d30v, and pdp11 xfails.

gas/ChangeLog
gas/config/tc-d10v.c
gas/config/tc-d30v.c
gas/config/tc-pdp11.c
gas/testsuite/gas/all/forward.d
gas/testsuite/gas/all/gas.exp

index 27db914..46a54f7 100644 (file)
@@ -1,3 +1,14 @@
+2019-03-21  Alan Modra  <amodra@gmail.com>
+
+       * config/tc-d10v.c (md_apply_fix): Apply BFD_RELOC_8.
+       * config/tc-pdp11.c (md_apply_fix): Likewise.
+       * config/tc-d30v.c (md_apply_fix): Don't emit errors for BFD_RELOC_8,
+       BFD_RELOC_16, and BFD_RELOC_64.
+       * testsuite/gas/all/gas.exp: Move target exclusions for forward
+       test, but not cr16, to..
+       * testsuite/gas/all/forward.d: ..here, with explanation.  Remove
+       d10v, d30v, and pdp11 xfails.
+
 2019-03-19  H.J. Lu  <hongjiu.lu@intel.com>
 
        * config/tc-i386.c (optimize_encoding): Don't check AVX for
index c2e3a19..9f6c82e 100644 (file)
@@ -1580,6 +1580,9 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
     case BFD_RELOC_16:
       bfd_putb16 ((bfd_vma) value, (unsigned char *) where);
       break;
+    case BFD_RELOC_8:
+      *where = value;
+      break;
 
     case BFD_RELOC_VTABLE_INHERIT:
     case BFD_RELOC_VTABLE_ENTRY:
index f11cc95..086215e 100644 (file)
@@ -1918,37 +1918,17 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
 
   switch (fixP->fx_r_type)
     {
-    case BFD_RELOC_8:  /* Check for a bad .byte directive.  */
-      if (fixP->fx_addsy != NULL)
-       as_bad (_("line %d: unable to place address of symbol '%s' into a byte"),
-               fixP->fx_line, S_GET_NAME (fixP->fx_addsy));
-      else if (((unsigned)value) > 0xff)
-       as_bad (_("line %d: unable to place value %lx into a byte"),
-               fixP->fx_line, value);
-      else
-       *(unsigned char *) where = value;
+    case BFD_RELOC_8:
+      *(unsigned char *) where = value;
       break;
 
-    case BFD_RELOC_16:  /* Check for a bad .short directive.  */
-      if (fixP->fx_addsy != NULL)
-       as_bad (_("line %d: unable to place address of symbol '%s' into a short"),
-               fixP->fx_line, S_GET_NAME (fixP->fx_addsy));
-      else if (((unsigned)value) > 0xffff)
-       as_bad (_("line %d: unable to place value %lx into a short"),
-               fixP->fx_line, value);
-      else
-       bfd_putb16 ((bfd_vma) value, (unsigned char *) where);
+    case BFD_RELOC_16:
+      bfd_putb16 ((bfd_vma) value, (unsigned char *) where);
       break;
 
-    case BFD_RELOC_64:  /* Check for a bad .quad directive.  */
-      if (fixP->fx_addsy != NULL)
-       as_bad (_("line %d: unable to place address of symbol '%s' into a quad"),
-               fixP->fx_line, S_GET_NAME (fixP->fx_addsy));
-      else
-       {
-         bfd_putb32 ((bfd_vma) value, (unsigned char *) where);
-         bfd_putb32 (0, ((unsigned char *) where) + 4);
-       }
+    case BFD_RELOC_64:
+      bfd_putb32 ((bfd_vma) value, (unsigned char *) where);
+      bfd_putb32 (0, ((unsigned char *) where) + 4);
       break;
 
     case BFD_RELOC_D30V_6:
index f00fa0b..1be07ea 100644 (file)
@@ -248,6 +248,10 @@ md_apply_fix (fixS *fixP,
 
   switch (fixP->fx_r_type)
     {
+    case BFD_RELOC_8:
+      mask = 0xff;
+      shift = 0;
+      break;
     case BFD_RELOC_16:
     case BFD_RELOC_16_PCREL:
       mask = 0xffff;
index 5a7f370..d921ec5 100644 (file)
@@ -1,7 +1,17 @@
 #objdump: -s -j .data
 #name: forward references
-# Some targets don't manage to resolve BFD_RELOC_8 for constants.
-#xfail: *c30-*-* *c4x-*-* d10v-*-* d30v-*-* pdp11-*-*
+# tic30 and tic4x have 4 octets per byte, tic54x has 2 octets per byte
+#notarget: *c30-*-* *c4x-*-* *c54x-*-*
+# hppa uses non-standard .equ syntax
+#notarget: hppa*-*-*
+# linkrelax targets should really resolve the relocs in this test but some
+# choose to emit them even though the relocs are in .data, leading to
+# "redefined symbol cannot be used on reloc".
+#xfail: am33*-*-* crx*-*-* h8300*-*-* mn10200*-*-* mn10300*-*-*
+# mep and microblaze use complex relocs and don't resolve the relocs.
+# one of the relocs references minus_one, which is a bug, but no one
+# seems bothered enough to fix this.
+#xfail: mep-*-* microblaze-*-*
 
 .*: .*
 
index e771184..9ea95c6 100644 (file)
@@ -99,23 +99,7 @@ if { ![istarget "bfin-*-*"] } then {
 gas_test_error "assign-bad.s" "" "== assignment for symbol already set"
 
 run_dump_test simple-forward
-
-# .equ works differently on some targets.
-# linkrelax-ing prevents most forward references from working.
-case $target_triplet in {
-    { am3*-*-* } { }
-    { *c54x*-*-* } { }
-    { cr16*-*-* } { }
-    { crx*-*-* } { }
-    { h8300*-*-* } { }
-    { hppa*-*-* } { }
-    { mep-*-* } { }
-    { microblaze-*-* } { }
-    { mn10\[23\]00*-*-* } { }
-    default {
-       run_dump_test forward
-    }
-}
+run_dump_test forward
 
 # aout relocs are often weird, so is mep. don't bother testing
 # som doesn't use a .text section