RISC-V: Support to parse the multi-letter prefix in the architecture string.
authorNelson Chu <nelson.chu@sifive.com>
Wed, 7 Apr 2021 04:50:19 +0000 (12:50 +0800)
committerNelson Chu <nelson.chu@sifive.com>
Mon, 12 Apr 2021 02:05:37 +0000 (10:05 +0800)
commite601909a3287bf541c6a7d82214bb387d2c76d82
treeb007c2468451cb6e85531e60b22bc9aa1cb5e94d
parent6803e1cb210ea0662afe8e783a9e8dd08a7dca9d
RISC-V: Support to parse the multi-letter prefix in the architecture string.

The original discussion is as follows,
https://github.com/riscv/riscv-isa-manual/issues/637

I never considered the prefixes may have multiple letters, like zxm.
But the ISA spec has been updated for a long time that I haven't noticed.
This patch rewrites the part of architecture parser to support parsing
the multi-letter prefixes.  Besides, I also improve the parser to report
errors in details.  One of the most obvious improvement is - Do not parse
the prefixed extensions according to the orders in the parse_config.
If we do so, then we used to get "unexpected ISA string at end" errors,
but the message is a little bit  hard to know what is happening.  I Remove
the confused message, and let riscv_parse_prefixed_ext to report the details.

bfd/
    * elfxx-riscv.c (riscv_std_z_ext_strtab): Moved forward.
    (riscv_std_s_ext_strtab): Likewise.
    (riscv_std_h_ext_strtab): Likewise.
    (riscv_std_zxm_ext_strtab): Added for the zxm prefix.
    (enum riscv_prefix_ext_class): Moved forward and renamed from
    riscv_isa_ext_class.  Reorder them according to the parsing order,
    since the enum values are used to check the orders in the
    riscv_compare_subsets.
    (struct riscv_parse_prefix_config): Moved forward and renamed from
    riscv_parse_config_t.  Also removed the ext_valid_p field, the
    related functions are replaced by riscv_valid_prefixed_ext.
    (parse_config): Moved forward and updated.  The more letters of the
    prefix string, the more forward it must be defined.  Otherwise, we
    will get the wrong mapping when using strncmp in riscv_get_prefix_class.
    (riscv_get_prefix_class): Moved forward.  Support to parse the
    multi-letter prefix, like zxm.
    (riscv_known_prefixed_ext): New function, check if the prefixed
    extension is supported according to the right riscv_std_*_ext_strtab.
    (riscv_valid_prefixed_ext): New function, used to replace the
    riscv_ext_*_valid_p functions.
    (riscv_init_ext_order): Do not set the values for prefix keywords
    since they may have multiple letters for now.
    (riscv_compare_subsets): Set the order values of prefix keywords
    to negative numbers according to the riscv_prefix_ext_class.
    (riscv_parse_std_ext): Call riscv_get_prefix_class to see if we
    have parsed the prefixed extensions.
    (riscv_parse_prefixed_ext): Updated and removed the parameter config.
    Report error when the prefix is unknown.
    (riscv_parse_subset): Do not parse the prefixed extensions according
    to the orders in the parse_config.  Remove the confused message and
    let riscv_parse_prefixed_ext to report the details.
    * elfxx-riscv.h (enum riscv_isa_ext_class): Moved to elfxx-riscv.c.
    (riscv_get_prefix_class): Removed to static.
gas/
    * testsuite/gas/riscv/march-fail-order-x-std.d: Renamed from
    march-fail-porder-x-std.d.
    * testsuite/gas/riscv/march-fail-order-z-std.d: Renamed from
    march-fail-porder-z-std.d.
    * testsuite/gas/riscv/march-fail-order-x-z.d: Renamed from
    march-fail-porder-x-z.d.
    * testsuite/gas/riscv/march-fail-order-zx-std.l: Added to replace
    march-fail-porder.l.
    * testsuite/gas/riscv/march-fail-order-x-z.l: Likewise.
    * testsuite/gas/riscv/march-fail-order-x.l: Updated.
    * testsuite/gas/riscv/march-fail-order-z.l: Likewise.
    * testsuite/gas/riscv/march-fail-single-prefix-h.d: Renamed from
    march-fail-single-char-h.d.
    * testsuite/gas/riscv/march-fail-single-prefix-s.d: Renamed from
    march-fail-single-char-s.d.
    * testsuite/gas/riscv/march-fail-single-prefix-x.d: Renamed from
    march-fail-single-char-x.d.
    * testsuite/gas/riscv/march-fail-single-prefix-z.d: Renamed from
    march-fail-single-char-z.d.
    * testsuite/gas/riscv/march-fail-single-prefix-zmx.d: Added.
    * testsuite/gas/riscv/march-fail-single-prefix.l: Added to replace
    march-fail-single-prefix.l.
    * testsuite/gas/riscv/march-fail-unknown-zxm.d: Added.
    * testsuite/gas/riscv/march-fail-unknown-std.l: Updated.
    * testsuite/gas/riscv/march-fail-unknown.l: Likewise.
29 files changed:
bfd/ChangeLog
bfd/elfxx-riscv.c
bfd/elfxx-riscv.h
gas/ChangeLog
gas/testsuite/gas/riscv/march-fail-order-x-std.d [new file with mode: 0644]
gas/testsuite/gas/riscv/march-fail-order-x-z.d [new file with mode: 0644]
gas/testsuite/gas/riscv/march-fail-order-x-z.l [new file with mode: 0644]
gas/testsuite/gas/riscv/march-fail-order-x.l
gas/testsuite/gas/riscv/march-fail-order-z-std.d [new file with mode: 0644]
gas/testsuite/gas/riscv/march-fail-order-z.l
gas/testsuite/gas/riscv/march-fail-order-zx-std.l [new file with mode: 0644]
gas/testsuite/gas/riscv/march-fail-porder-x-std.d [deleted file]
gas/testsuite/gas/riscv/march-fail-porder-x-z.d [deleted file]
gas/testsuite/gas/riscv/march-fail-porder-z-std.d [deleted file]
gas/testsuite/gas/riscv/march-fail-porder.l [deleted file]
gas/testsuite/gas/riscv/march-fail-single-char-h.d [deleted file]
gas/testsuite/gas/riscv/march-fail-single-char-s.d [deleted file]
gas/testsuite/gas/riscv/march-fail-single-char-x.d [deleted file]
gas/testsuite/gas/riscv/march-fail-single-char-z.d [deleted file]
gas/testsuite/gas/riscv/march-fail-single-char.l [deleted file]
gas/testsuite/gas/riscv/march-fail-single-prefix-h.d [new file with mode: 0644]
gas/testsuite/gas/riscv/march-fail-single-prefix-s.d [new file with mode: 0644]
gas/testsuite/gas/riscv/march-fail-single-prefix-x.d [new file with mode: 0644]
gas/testsuite/gas/riscv/march-fail-single-prefix-z.d [new file with mode: 0644]
gas/testsuite/gas/riscv/march-fail-single-prefix-zxm.d [new file with mode: 0644]
gas/testsuite/gas/riscv/march-fail-single-prefix.l [new file with mode: 0644]
gas/testsuite/gas/riscv/march-fail-unknown-std.l
gas/testsuite/gas/riscv/march-fail-unknown-zxm.d [new file with mode: 0644]
gas/testsuite/gas/riscv/march-fail-unknown.l