RISC-V: Error for relaxable branch in absolute section.
authorJim Wilson <jimw@sifive.com>
Thu, 24 Sep 2020 22:08:52 +0000 (15:08 -0700)
committerJim Wilson <jimw@sifive.com>
Thu, 24 Sep 2020 22:16:54 +0000 (15:16 -0700)
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.

gas/ChangeLog
gas/config/tc-riscv.c
gas/testsuite/gas/riscv/absolute-sec.d [new file with mode: 0644]
gas/testsuite/gas/riscv/absolute-sec.l [new file with mode: 0644]
gas/testsuite/gas/riscv/absolute-sec.s [new file with mode: 0644]

index 113a7cfc25047877fb636c4b82215c8cb9650e3e..1c692dd93146cbdc404cf1519d72c3d0d0a1aabd 100644 (file)
@@ -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.
index eb31e42a2e7ce92bd6dc00bc7e5230dbf1793674..7c228430adb9dfcaee737350a9ed3bae56f37cff 100644 (file)
@@ -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 (file)
index 0000000..c32e94e
--- /dev/null
@@ -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 (file)
index 0000000..f5d32c4
--- /dev/null
@@ -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 (file)
index 0000000..d7d6799
--- /dev/null
@@ -0,0 +1,2 @@
+       .offset 0
+       jal x0, 100