RISC-V: Add -march=help for gas

Use -march=help for gas to print all supported extensions and versions.

Here is part of the output of `as -march=help`:
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
        ...

This patch assumes that the supported extensions with the same versions
are listed together. For example:
static struct riscv_supported_ext riscv_supported_std_ext[] =
{
  ...
  {"i",         ISA_SPEC_CLASS_20191213,        2, 1, 0 },
  {"i",         ISA_SPEC_CLASS_20190608,        2, 1, 0 },
  {"i",         ISA_SPEC_CLASS_2P2,             2, 0, 0 },
  ...
};

For the "i" extension, 2.1.0 with different spec class are listed together.
This patch records the previous printed extension and version.  If the
current extension and version are the same as the previous one, skip
printing.

bfd/
	* elfxx-riscv.c (riscv_print_extensions): New function.  Print
	available extensions and versions.
	* elfxx-riscv.h (riscv_print_extensions): New declaration.
gas/
	* gas/config/tc-riscv.c (md_parse_option): Parse 'help' keyword in
	-march option to print available extensions and versions.
	* testsuite/gas/riscv/march-help.l: New testcase for -march=help.
	* testsuite/gas/riscv/riscv.exp: Updated.
This commit is contained in:
Hau Hsu 2024-02-23 14:17:28 +08:00 committed by Nelson Chu
parent ef11c1eaff
commit 90840a8656
5 changed files with 175 additions and 0 deletions

View File

@ -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");
}

View File

@ -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

View File

@ -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;

View File

@ -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

View File

@ -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"
}