From 7553c869a9a9af813abd8cb4d445765d1a8a1cac Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Wed, 20 Mar 2019 09:20:55 +1030 Subject: [PATCH] Teach a few targets to resolve BFD_RELOC_8 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 | 11 +++++++++++ gas/config/tc-d10v.c | 3 +++ gas/config/tc-d30v.c | 34 +++++++-------------------------- gas/config/tc-pdp11.c | 4 ++++ gas/testsuite/gas/all/forward.d | 14 ++++++++++++-- gas/testsuite/gas/all/gas.exp | 18 +---------------- 6 files changed, 38 insertions(+), 46 deletions(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index 27db914ad38..46a54f78ddd 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,14 @@ +2019-03-21 Alan Modra + + * 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 * config/tc-i386.c (optimize_encoding): Don't check AVX for diff --git a/gas/config/tc-d10v.c b/gas/config/tc-d10v.c index c2e3a190fef..9f6c82e1f94 100644 --- a/gas/config/tc-d10v.c +++ b/gas/config/tc-d10v.c @@ -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: diff --git a/gas/config/tc-d30v.c b/gas/config/tc-d30v.c index f11cc958bae..086215e306e 100644 --- a/gas/config/tc-d30v.c +++ b/gas/config/tc-d30v.c @@ -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: diff --git a/gas/config/tc-pdp11.c b/gas/config/tc-pdp11.c index f00fa0b03e8..1be07eaf593 100644 --- a/gas/config/tc-pdp11.c +++ b/gas/config/tc-pdp11.c @@ -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; diff --git a/gas/testsuite/gas/all/forward.d b/gas/testsuite/gas/all/forward.d index 5a7f370a17e..d921ec517be 100644 --- a/gas/testsuite/gas/all/forward.d +++ b/gas/testsuite/gas/all/forward.d @@ -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-*-* .*: .* diff --git a/gas/testsuite/gas/all/gas.exp b/gas/testsuite/gas/all/gas.exp index e771184c45d..9ea95c62a9e 100644 --- a/gas/testsuite/gas/all/gas.exp +++ b/gas/testsuite/gas/all/gas.exp @@ -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 -- 2.30.2