diff options
author | Jim Wilson <jimw@sifive.com> | 2020-09-24 15:08:52 -0700 |
---|---|---|
committer | Jim Wilson <jimw@sifive.com> | 2020-09-24 15:16:54 -0700 |
commit | 743f5cfc006375655a20f255d25f6b8e1452b30b (patch) | |
tree | 52077e2ffb5526aaa4b3831554c98a69797309b1 /gas | |
parent | debd1a62c4d250a6257e9018d9f9c7355edcdf8b (diff) | |
download | gdb-743f5cfc006375655a20f255d25f6b8e1452b30b.zip gdb-743f5cfc006375655a20f255d25f6b8e1452b30b.tar.gz gdb-743f5cfc006375655a20f255d25f6b8e1452b30b.tar.bz2 |
RISC-V: Error for relaxable branch in absolute section.
Emit an error instead of crashing in frag_new, handling this same as the
i386 port.
gas/
PR 26400
* config/tc-riscv.c (append_insn): If in absolute section, emit
error before add_relaxed_insn call.
* testsuite/gas/riscv/absolute-sec.d: New.
* testsuite/gas/riscv/absolute-sec.l: New.
* testsuite/gas/riscv/absolute-sec.s: New.
Diffstat (limited to 'gas')
-rw-r--r-- | gas/ChangeLog | 9 | ||||
-rw-r--r-- | gas/config/tc-riscv.c | 7 | ||||
-rw-r--r-- | gas/testsuite/gas/riscv/absolute-sec.d | 3 | ||||
-rw-r--r-- | gas/testsuite/gas/riscv/absolute-sec.l | 2 | ||||
-rw-r--r-- | gas/testsuite/gas/riscv/absolute-sec.s | 2 |
5 files changed, 23 insertions, 0 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index 113a7cf..1c692dd 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,12 @@ +2020-09-24 Jim Wilson <jimw@sifive.com> + + PR 26400 + * config/tc-riscv.c (append_insn): If in absolute section, emit + error before add_relaxed_insn call. + * testsuite/gas/riscv/absolute-sec.d: New. + * testsuite/gas/riscv/absolute-sec.l: New. + * testsuite/gas/riscv/absolute-sec.s: New. + 2020-09-23 Mark Wielaard <mark@klomp.org> * testsuite/gas/elf/dwarf-5-cu.d: Adjust expected output. diff --git a/gas/config/tc-riscv.c b/gas/config/tc-riscv.c index eb31e42..7c22843 100644 --- a/gas/config/tc-riscv.c +++ b/gas/config/tc-riscv.c @@ -1106,6 +1106,13 @@ append_insn (struct riscv_cl_insn *ip, expressionS *address_expr, int j = reloc_type == BFD_RELOC_RISCV_JMP; int best_case = riscv_insn_length (ip->insn_opcode); unsigned worst_case = relaxed_branch_length (NULL, NULL, 0); + + if (now_seg == absolute_section) + { + as_bad (_("relaxable branches not supported in absolute section")); + return; + } + add_relaxed_insn (ip, worst_case, best_case, RELAX_BRANCH_ENCODE (j, best_case == 2, worst_case), address_expr->X_add_symbol, diff --git a/gas/testsuite/gas/riscv/absolute-sec.d b/gas/testsuite/gas/riscv/absolute-sec.d new file mode 100644 index 0000000..c32e94e --- /dev/null +++ b/gas/testsuite/gas/riscv/absolute-sec.d @@ -0,0 +1,3 @@ +#as: +#source absolute-sec.s +#error_output: absolute-sec.l diff --git a/gas/testsuite/gas/riscv/absolute-sec.l b/gas/testsuite/gas/riscv/absolute-sec.l new file mode 100644 index 0000000..f5d32c4 --- /dev/null +++ b/gas/testsuite/gas/riscv/absolute-sec.l @@ -0,0 +1,2 @@ +.*: Assembler messages: +.*: Error: relaxable branches not supported in absolute section diff --git a/gas/testsuite/gas/riscv/absolute-sec.s b/gas/testsuite/gas/riscv/absolute-sec.s new file mode 100644 index 0000000..d7d6799 --- /dev/null +++ b/gas/testsuite/gas/riscv/absolute-sec.s @@ -0,0 +1,2 @@ + .offset 0 + jal x0, 100 |