aboutsummaryrefslogtreecommitdiff
path: root/gas
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
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')
-rw-r--r--gas/ChangeLog6
-rw-r--r--gas/config/tc-riscv.c5
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;