RISC-V: Support new .option arch directive.
authorNelson Chu <nelson.chu@sifive.com>
Fri, 19 Nov 2021 09:11:06 +0000 (17:11 +0800)
committerNelson Chu <nelson.chu@sifive.com>
Fri, 19 Nov 2021 10:50:27 +0000 (18:50 +0800)
commitd3ffd7f77654adafe5f1989bdfdbe4a337ff2e8b
tree4175e17a9569dcc539f92e32ed3ec098328217ee
parentfd0ff19bf435b267caae6a1ae04e7b4a4ba64f5b
RISC-V: Support new .option arch directive.

https://github.com/riscv/riscv-asm-manual/pull/67

Format:
.option arch, +<extension><version>, ...
.option arch, -<extension>
.option arch, =<ISA string>

The new direcitve is used to enable/disable extensions for the specific
code region.  For example,

.attribute arch, "rv64ic"   # arch = rv64i2p0_c2p0
.option push
.option arch, +d2p0, -c     # arch = rv64i2p0_f2p0_d2p0, f is added implied
.option arch, =rv32gc       # arch = rv32i2p0_m2p0_a2p0_f2p0_d2p0_c2p0
.option pop                 # arch = rv64i2p0_c2p0

Note that,
1. ".option rvc/norvc" have the same behavior as ".option arch +c/-c".
2. ".option arch -i" is illegal, since we cannot remove base i extension.
3. If arch=rv64i2p0, then ".option arch, +i3p0" will update the i's version
   from 2.0 to 3.0.
4. If arch=rv64i3p0, then ".option arch, +i" will update the i's version
   from 2.0 to the default one according to the chosen isa spec.

bfd/
* elfxx-riscv.c (riscv_add_subset): If the subset is already added,
and the new versions are not RISCV_UNKNOWN_VERSION, then update the
versions to the subset list.
(riscv_copy_subset): New function.  Copy the subset from list.
(riscv_copy_subset_list): New function.  Return the new copyed list.
(riscv_update_subset): Updated to make .option arch directives workable.
* elfxx-riscv.h: Updated.
gas/
* config/tc-riscv.c (riscv_subsets): Defined as a pointer.
(riscv_rps_as): Init the subset_list to NULL, we will set it later
once riscv_opts_stack is created or updated.
(struct riscv_option_stack, riscv_opts_stack): Moved forward.
(riscv_set_arch): Updated.
(s_riscv_option): Support new .option arch directive, to add, remove
or update subsets for the specific code region.
(riscv_write_out_attrs): Updated.
* doc/c-riscv.texi: Added document for new .option arch directive.
* testsuite/gas/riscv/option-arch-01a.d: New testcase.
* testsuite/gas/riscv/option-arch-01b.d: Likewise.
* testsuite/gas/riscv/option-arch-01.s: Likewise..
* testsuite/gas/riscv/option-arch-02.d: Likewise.
* testsuite/gas/riscv/option-arch-02.s: Likewise.
* testsuite/gas/riscv/option-arch-fail.d: Likewise.
* testsuite/gas/riscv/option-arch-fail.l: Likewise.
* testsuite/gas/riscv/option-arch-fail.s: Likewise.
14 files changed:
bfd/elfxx-riscv.c
bfd/elfxx-riscv.h
gas/config/tc-riscv.c
gas/doc/c-riscv.texi
gas/testsuite/gas/riscv/option-arch-01.s [new file with mode: 0644]
gas/testsuite/gas/riscv/option-arch-01a.d [new file with mode: 0644]
gas/testsuite/gas/riscv/option-arch-01b.d [new file with mode: 0644]
gas/testsuite/gas/riscv/option-arch-02.d [new file with mode: 0644]
gas/testsuite/gas/riscv/option-arch-02.s [new file with mode: 0644]
gas/testsuite/gas/riscv/option-arch-03.d [new file with mode: 0644]
gas/testsuite/gas/riscv/option-arch-03.s [new file with mode: 0644]
gas/testsuite/gas/riscv/option-arch-fail.d [new file with mode: 0644]
gas/testsuite/gas/riscv/option-arch-fail.l [new file with mode: 0644]
gas/testsuite/gas/riscv/option-arch-fail.s [new file with mode: 0644]