gas: Fix mmix fixups and TC_FX_SIZE_SLACK, PR25331
Finally; sorry for the delay. There were a few false starts, where I misinterpreted the error-messages and the comment that Alan added: it's not the fix size that's too large (and the frag too small), it's stating the wrong size of what will be "fixed up" - that of the actual target value, not the size of the field that needs to be adjusted. Comments added for clarity. Test-suite committed separately. gas: PR gas/25331 * config/tc-mmix.c (md_assemble) <fixup for BFD_RELOC_MMIX_BASE_PLUS_OFFSET>: This fixup affects 1 byte, not 8. Also, set its fx_no_overflow. (md_convert_frag) <case ENCODE_RELAX (STATE_PUSHJSTUB, STATE_ZERO)>: Similarly this fixup affects 4 bytes, not 8 and needs its fx_no_overflow set. * config/tc-mmix.h (TC_FX_SIZE_SLACK): Don't define.
This commit is contained in:
parent
9f27c36482
commit
b20e7614da
|
@ -1,3 +1,14 @@
|
||||||
|
2020-06-29 Hans-Peter Nilsson <hp@bitrange.com>
|
||||||
|
|
||||||
|
PR gas/25331
|
||||||
|
* config/tc-mmix.c (md_assemble) <fixup for
|
||||||
|
BFD_RELOC_MMIX_BASE_PLUS_OFFSET>: This fixup affects 1 byte, not 8.
|
||||||
|
Also, set its fx_no_overflow.
|
||||||
|
(md_convert_frag) <case ENCODE_RELAX (STATE_PUSHJSTUB, STATE_ZERO)>:
|
||||||
|
Similarly this fixup affects 4 bytes, not 8 and needs its
|
||||||
|
fx_no_overflow set.
|
||||||
|
* config/tc-mmix.h (TC_FX_SIZE_SLACK): Don't define.
|
||||||
|
|
||||||
2020-06-29 Alan Modra <amodra@gmail.com>
|
2020-06-29 Alan Modra <amodra@gmail.com>
|
||||||
|
|
||||||
* config/tc-s12z.c: Use C style comments.
|
* config/tc-s12z.c: Use C style comments.
|
||||||
|
|
|
@ -1332,6 +1332,7 @@ md_assemble (char *str)
|
||||||
if (n_operands == 2)
|
if (n_operands == 2)
|
||||||
{
|
{
|
||||||
symbolS *sym;
|
symbolS *sym;
|
||||||
|
fixS *tmpfixP;
|
||||||
|
|
||||||
/* The last operand is immediate whenever we see just two
|
/* The last operand is immediate whenever we see just two
|
||||||
operands. */
|
operands. */
|
||||||
|
@ -1380,8 +1381,13 @@ md_assemble (char *str)
|
||||||
/* Now we know it can be a "base address plus offset". Add
|
/* Now we know it can be a "base address plus offset". Add
|
||||||
proper fixup types so we can handle this later, when we've
|
proper fixup types so we can handle this later, when we've
|
||||||
parsed everything. */
|
parsed everything. */
|
||||||
fix_new (opc_fragP, opcodep - opc_fragP->fr_literal + 2,
|
tmpfixP
|
||||||
8, sym, 0, 0, BFD_RELOC_MMIX_BASE_PLUS_OFFSET);
|
= fix_new (opc_fragP, opcodep - opc_fragP->fr_literal + 2,
|
||||||
|
1, sym, 0, 0, BFD_RELOC_MMIX_BASE_PLUS_OFFSET);
|
||||||
|
/* This is a non-trivial fixup: the ->fx_offset will not
|
||||||
|
reflect the stored value, so the generic overflow test
|
||||||
|
doesn't apply. */
|
||||||
|
tmpfixP->fx_no_overflow = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2332,11 +2338,18 @@ md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT sec ATTRIBUTE_UNUSED,
|
||||||
case ENCODE_RELAX (STATE_PUSHJSTUB, STATE_ZERO):
|
case ENCODE_RELAX (STATE_PUSHJSTUB, STATE_ZERO):
|
||||||
/* Setting the unknown bits to 0 seems the most appropriate. */
|
/* Setting the unknown bits to 0 seems the most appropriate. */
|
||||||
mmix_set_geta_branch_offset (opcodep, 0);
|
mmix_set_geta_branch_offset (opcodep, 0);
|
||||||
tmpfixP = fix_new (opc_fragP, opcodep - opc_fragP->fr_literal, 8,
|
tmpfixP = fix_new (opc_fragP, opcodep - opc_fragP->fr_literal, 4,
|
||||||
fragP->fr_symbol, fragP->fr_offset, 1,
|
fragP->fr_symbol, fragP->fr_offset, 1,
|
||||||
BFD_RELOC_MMIX_PUSHJ_STUBBABLE);
|
BFD_RELOC_MMIX_PUSHJ_STUBBABLE);
|
||||||
COPY_FR_WHERE_TO_FX (fragP, tmpfixP);
|
COPY_FR_WHERE_TO_FX (fragP, tmpfixP);
|
||||||
var_part_size = 0;
|
var_part_size = 0;
|
||||||
|
|
||||||
|
/* This is a non-trivial fixup; we'll be calling a generated
|
||||||
|
stub, whose address fits into the fixup. The actual target,
|
||||||
|
as reflected by the fixup value, is further away than fits
|
||||||
|
into the fixup, so the generic overflow test doesn't
|
||||||
|
apply. */
|
||||||
|
tmpfixP->fx_no_overflow = 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ENCODE_RELAX (STATE_GETA, STATE_ZERO):
|
case ENCODE_RELAX (STATE_GETA, STATE_ZERO):
|
||||||
|
|
|
@ -226,8 +226,5 @@ extern void mmix_md_do_align (int, char *, int, int);
|
||||||
explicitly say one byte. */
|
explicitly say one byte. */
|
||||||
#define DWARF2_LINE_MIN_INSN_LENGTH 1
|
#define DWARF2_LINE_MIN_INSN_LENGTH 1
|
||||||
|
|
||||||
/* This target is buggy, and sets fix size too large. */
|
|
||||||
#define TC_FX_SIZE_SLACK(FIX) 6
|
|
||||||
|
|
||||||
/* MMIX has global register symbols. */
|
/* MMIX has global register symbols. */
|
||||||
#define TC_GLOBAL_REGISTER_SYMBOL_OK
|
#define TC_GLOBAL_REGISTER_SYMBOL_OK
|
||||||
|
|
Loading…
Reference in New Issue