aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/elfxx-riscv.c46
-rw-r--r--bfd/elfxx-riscv.h3
-rw-r--r--gas/config/tc-riscv.c6
-rw-r--r--gas/testsuite/gas/riscv/march-help.l119
-rw-r--r--gas/testsuite/gas/riscv/riscv.exp1
5 files changed, 175 insertions, 0 deletions
diff --git a/bfd/elfxx-riscv.c b/bfd/elfxx-riscv.c
index 7313666..28be665 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 ae4cbee..49be717 100644
--- a/bfd/elfxx-riscv.h
+++ b/bfd/elfxx-riscv.h
@@ -122,6 +122,9 @@ 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
bfd_elf64_riscv_set_data_segment_info (struct bfd_link_info *, int *);
diff --git a/gas/config/tc-riscv.c b/gas/config/tc-riscv.c
index 0966b7b..2a2948f 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 0000000..7f92194
--- /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 2c7e950..069e9a6 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"
}