From a5ec5e3fe1b8fe1395c79ff29052edad91266a76 Mon Sep 17 00:00:00 2001 From: Andrew Waterman Date: Wed, 21 Dec 2016 18:05:28 -0800 Subject: [PATCH] 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 * config/tc-riscv.c (append_insn): Don't eagerly apply relocations against constants. (md_apply_fix): Mark relocations against constants as "done." --- gas/ChangeLog | 6 ++++++ gas/config/tc-riscv.c | 5 ++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index 4de9cf7eff4..0fab5fba774 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 + + * 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 Kito Cheng diff --git a/gas/config/tc-riscv.c b/gas/config/tc-riscv.c index 3f09101108e..6bbaa4b1010 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; -- 2.30.2