bpf: gas: support relaxation of V4 jump instructions
authorJose E. Marchesi <jose.marchesi@oracle.com>
Thu, 27 Jul 2023 16:17:35 +0000 (18:17 +0200)
committerJose E. Marchesi <jose.marchesi@oracle.com>
Fri, 28 Jul 2023 16:19:44 +0000 (18:19 +0200)
commit249d4715e41061b6bd2d26df20ae274e6478f972
treeed3caa4b4c19c83c780084958869fadf6eb1a576
parent07d8d4bd2ad213281be502d6e56c19e0269b8967
bpf: gas: support relaxation of V4 jump instructions

The BPF jump-always instruction (JA), like all other jump instructions
in the ISA, get a signed 16-bit displacement target argument denoted
in number of 64-bit words minus one.  This can sometimes be overflown.

The BPF V4 ISA thus introduced support for a jump-always
instruction (JAL) that gets a signed 32-bit displacement instead.

This patch makes the BPF assembler to perform the following
relaxations when the disp16 field gets overflown, unless the option
-mno-relax is specified:

  JA disp16  -> JAL disp32
  Jxx disp16 -> Jxx +1; JA +1; JAL disp32

Documentation and tests added.
Tested in bpf-unknown-none.

gas/ChangeLog:

2023-07-28  Jose E. Marchesi  <jose.marchesi@oracle.com>

PR gas/30690
* config/tc-bpf.c (struct bpf_insn): Add fields is_relaxable and
relaxed_exp.
(enum options): Add OPTION_NO_RELAX.
(md_longopts): Likewise for -mno-relax.
(do_relax): New global.
(md_parse_option): Handle OPTION_NO_RELAX.
(RELAX_BRANCH_ENCODE): Define.
(RELAX_BRANCH_P): Likewise.
(RELAX_BRANCH_LENGTH): Likewise.
(RELAX_BRANCH_CONST): Likewise.
(RELAX_BRANCH_UNCOND): Likewise.
(relaxed_branch_length): New function.
(md_estimate_size_before_relax): Likewise.
(read_insn_word): Likewise.
(encode_int16): Likewise.
(encode_int32): Likewise.
(write_insn_bytes): Likewise.
(md_convert_frag): Likewise.
(encode_insn): Likewise.
(install_insn_fixups): Likewise.
(add_fixed_insn): Likewise.
(add_relaxed_insn): Likewise.
(md_assemble): Move instruction encoding logic to the above
new functions.
* testsuite/gas/bpf/jump-relax-ja.d: New test.
* testsuite/gas/bpf/jump-relax-ja-be.d: Likewise.
* testsuite/gas/bpf/jump-relax-ja.s: And corresponding source.
* testsuite/gas/bpf/jump-relax-jump.d: New test.
* testsuite/gas/bpf/jump-relax-jump-be.d: Likewise.
* testsuite/gas/bpf/jump-relax-jump.s: And corresponding source.
* testsuite/gas/bpf/bpf.exp: Run new tests.
* doc/c-bpf.texi (BPF Options): Document -mno-relax.
gas/ChangeLog
gas/config/tc-bpf.c
gas/doc/c-bpf.texi
gas/testsuite/gas/bpf/bpf.exp
gas/testsuite/gas/bpf/jump-relax-ja-be.d [new file with mode: 0644]
gas/testsuite/gas/bpf/jump-relax-ja.d [new file with mode: 0644]
gas/testsuite/gas/bpf/jump-relax-ja.s [new file with mode: 0644]
gas/testsuite/gas/bpf/jump-relax-jump.d [new file with mode: 0644]
gas/testsuite/gas/bpf/jump-relax-jump.s [new file with mode: 0644]