diff options
author | Andrew Waterman <andrew@sifive.com> | 2016-12-21 18:05:28 -0800 |
---|---|---|
committer | Palmer Dabbelt <palmer@dabbelt.com> | 2017-01-09 09:20:05 -0800 |
commit | a5ec5e3fe1b8fe1395c79ff29052edad91266a76 (patch) | |
tree | 88733553071df8c89c24eb6121be64d20fa30496 /gas | |
parent | e294484ee7e8dea53d091443a0f24c7939ac15ed (diff) | |
download | gdb-a5ec5e3fe1b8fe1395c79ff29052edad91266a76.zip gdb-a5ec5e3fe1b8fe1395c79ff29052edad91266a76.tar.gz gdb-a5ec5e3fe1b8fe1395c79ff29052edad91266a76.tar.bz2 |
RISC-V/GAS: Support more relocs against constant addresses
Previously, some pseudoinstructions like "call" only accepted
symbolic addresses and rejected constant addresses with an
esoteric internal error. This patch enables them by deferring
application of constant relocations to md_apply_fix, rather than
eagerly applying them during instruction assembly.
gas/ChangeLog
2017-01-09 Andrew Waterman <andrew@sifive.com>
* config/tc-riscv.c (append_insn): Don't eagerly apply relocations
against constants.
(md_apply_fix): Mark relocations against constants as "done."
Diffstat (limited to 'gas')
-rw-r--r-- | gas/ChangeLog | 6 | ||||
-rw-r--r-- | gas/config/tc-riscv.c | 5 |
2 files changed, 8 insertions, 3 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index 4de9cf7..0fab5fb 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -4,6 +4,12 @@ against constants. (md_apply_fix): Mark relocations against constants as "done." +2017-01-09 Andrew Waterman <andrew@sifive.com> + + * config/tc-riscv.c (append_insn): Don't eagerly apply relocations + against constants. + (md_apply_fix): Mark relocations against constants as "done." + 2017-01-09 Palmer Dabbelt <palmer@dabbelt.com> Kito Cheng <kito.cheng@gmail.com> diff --git a/gas/config/tc-riscv.c b/gas/config/tc-riscv.c index 3f09101..6bbaa4b 100644 --- a/gas/config/tc-riscv.c +++ b/gas/config/tc-riscv.c @@ -688,9 +688,6 @@ append_insn (struct riscv_cl_insn *ip, expressionS *address_expr, address_expr->X_add_number); return; } - else if (address_expr->X_op == O_constant) - ip->insn_opcode |= riscv_apply_const_reloc (reloc_type, - address_expr->X_add_number); else { howto = bfd_reloc_type_lookup (stdoutput, reloc_type); @@ -1861,6 +1858,8 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED) case BFD_RELOC_RISCV_LO12_S: bfd_putl32 (riscv_apply_const_reloc (fixP->fx_r_type, *valP) | bfd_getl32 (buf), buf); + if (fixP->fx_addsy == NULL) + fixP->fx_done = TRUE; relaxable = TRUE; break; |