diff --git a/bfd/elfxx-riscv.c b/bfd/elfxx-riscv.c index 731366625ec..28be6651945 100644 --- a/bfd/elfxx-riscv.c +++ b/bfd/elfxx-riscv.c @@ -2941,3 +2941,49 @@ riscv_multi_subset_supports_ext (riscv_parse_subset_t *rps, return NULL; } } + +/* Print supported extensions with versions if -march=help. */ + +void +riscv_print_extensions (void) +{ + /* Record the previous printed extension. + Print the current one if they are not the same. */ + const struct riscv_supported_ext *cur = NULL, *prev = NULL; + int i, j; + + printf ("All available -march extensions for RISC-V:"); + + for (i = 0; riscv_all_supported_ext[i] != NULL; i++) + { + const struct riscv_supported_ext *exts = riscv_all_supported_ext[i]; + prev = NULL; + for (j = 0; exts[j].name != NULL; j++) + { + cur = &exts[j]; + /* Unclear version information, skip. */ + if (cur->isa_spec_class == ISA_SPEC_CLASS_NONE + || cur->major_version == RISCV_UNKNOWN_VERSION + || cur->minor_version == RISCV_UNKNOWN_VERSION) + continue; + + /* Same extension. */ + if (prev && strcmp (prev->name, cur->name) == 0) + { + /* Same version, skip. */ + if (prev->major_version == cur->major_version + && prev->minor_version == cur->minor_version) + continue; + /* Different version, print version with comma. */ + else + printf (", %d.%d", cur->major_version, cur->minor_version); + } + /* Different extension, print extension and version with newline. */ + else + printf ("\n\t%-40s%d.%d", cur->name, cur->major_version, + cur->minor_version); + prev = &exts[j]; + } + } + printf ("\n"); +} diff --git a/bfd/elfxx-riscv.h b/bfd/elfxx-riscv.h index ae4cbee7bc3..49be71746b9 100644 --- a/bfd/elfxx-riscv.h +++ b/bfd/elfxx-riscv.h @@ -121,6 +121,9 @@ riscv_multi_subset_supports (riscv_parse_subset_t *, enum riscv_insn_class); extern const char * riscv_multi_subset_supports_ext (riscv_parse_subset_t *, enum riscv_insn_class); +extern void +riscv_print_extensions (void); + extern void bfd_elf32_riscv_set_data_segment_info (struct bfd_link_info *, int *); extern void diff --git a/gas/config/tc-riscv.c b/gas/config/tc-riscv.c index 0966b7bf235..2a2948fde17 100644 --- a/gas/config/tc-riscv.c +++ b/gas/config/tc-riscv.c @@ -4038,6 +4038,12 @@ md_parse_option (int c, const char *arg) switch (c) { case OPTION_MARCH: + /* List all avaiable extensions. */ + if (strcmp (arg, "help") == 0) + { + riscv_print_extensions (); + exit (EXIT_SUCCESS); + } default_arch_with_ext = arg; break; diff --git a/gas/testsuite/gas/riscv/march-help.l b/gas/testsuite/gas/riscv/march-help.l new file mode 100644 index 00000000000..7f92194d10d --- /dev/null +++ b/gas/testsuite/gas/riscv/march-help.l @@ -0,0 +1,119 @@ +All available -march extensions for RISC-V: + e 1.9 + i 2.1, 2.0 + m 2.0 + a 2.1, 2.0 + f 2.2, 2.0 + d 2.2, 2.0 + q 2.2, 2.0 + c 2.0 + v 1.0 + h 1.0 + zicbom 1.0 + zicbop 1.0 + zicboz 1.0 + zicond 1.0 + zicntr 2.0 + zicsr 2.0 + zifencei 2.0 + zihintntl 1.0 + zihintpause 2.0 + zihpm 2.0 + zmmul 1.0 + zabha 1.0 + zawrs 1.0 + zfa 1.0 + zfh 1.0 + zfhmin 1.0 + zfinx 1.0 + zdinx 1.0 + zqinx 1.0 + zhinx 1.0 + zhinxmin 1.0 + zbb 1.0 + zba 1.0 + zbc 1.0 + zbs 1.0 + zbkb 1.0 + zbkc 1.0 + zbkx 1.0 + zk 1.0 + zkn 1.0 + zknd 1.0 + zkne 1.0 + zknh 1.0 + zkr 1.0 + zks 1.0 + zksed 1.0 + zksh 1.0 + zkt 1.0 + zve32x 1.0 + zve32f 1.0 + zve64x 1.0 + zve64f 1.0 + zve64d 1.0 + zvbb 1.0 + zvbc 1.0 + zvfh 1.0 + zvfhmin 1.0 + zvkb 1.0 + zvkg 1.0 + zvkn 1.0 + zvkng 1.0 + zvknc 1.0 + zvkned 1.0 + zvknha 1.0 + zvknhb 1.0 + zvksed 1.0 + zvksh 1.0 + zvks 1.0 + zvksg 1.0 + zvksc 1.0 + zvkt 1.0 + zvl32b 1.0 + zvl64b 1.0 + zvl128b 1.0 + zvl256b 1.0 + zvl512b 1.0 + zvl1024b 1.0 + zvl2048b 1.0 + zvl4096b 1.0 + zvl8192b 1.0 + zvl16384b 1.0 + zvl32768b 1.0 + zvl65536b 1.0 + ztso 1.0 + zca 1.0 + zcb 1.0 + zcf 1.0 + zcd 1.0 + smaia 1.0 + smcntrpmf 1.0 + smepmp 1.0 + smstateen 1.0 + ssaia 1.0 + sscofpmf 1.0 + ssstateen 1.0 + sstc 1.0 + svadu 1.0 + svinval 1.0 + svnapot 1.0 + svpbmt 1.0 + xcvmac 1.0 + xcvalu 1.0 + xtheadba 1.0 + xtheadbb 1.0 + xtheadbs 1.0 + xtheadcmo 1.0 + xtheadcondmov 1.0 + xtheadfmemidx 1.0 + xtheadfmv 1.0 + xtheadint 1.0 + xtheadmac 1.0 + xtheadmemidx 1.0 + xtheadmempair 1.0 + xtheadsync 1.0 + xtheadvector 1.0 + xtheadzvamo 1.0 + xventanacondops 1.0 + xsfvcp 1.0 diff --git a/gas/testsuite/gas/riscv/riscv.exp b/gas/testsuite/gas/riscv/riscv.exp index 2c7e950c0ff..069e9a6945a 100644 --- a/gas/testsuite/gas/riscv/riscv.exp +++ b/gas/testsuite/gas/riscv/riscv.exp @@ -21,4 +21,5 @@ if [istarget riscv*-*-*] { run_dump_tests [lsort [glob -nocomplain $srcdir/$subdir/*.d]] run_list_test "align-1" + run_list_test "march-help" "-march=help" }