aboutsummaryrefslogtreecommitdiff
path: root/gas/config
diff options
context:
space:
mode:
authorAndrew Waterman <andrew@sifive.com>2016-12-21 18:05:28 -0800
committerPalmer Dabbelt <palmer@dabbelt.com>2017-01-09 09:20:05 -0800
commita5ec5e3fe1b8fe1395c79ff29052edad91266a76 (patch)
tree88733553071df8c89c24eb6121be64d20fa30496 /gas/config
parente294484ee7e8dea53d091443a0f24c7939ac15ed (diff)
downloadgdb-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/config')
-rw-r--r--gas/config/tc-riscv.c5
1 files changed, 2 insertions, 3 deletions
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;