public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
From: Hau Hsu <hau.hsu@sifive.com>
To: binutils@sourceware.org, kito.cheng@gmail.com, hau.hsu@sifive.com
Subject: [PATCH v2] RISC-V: Add --march=help
Date: Tue, 30 Jan 2024 14:36:30 +0800	[thread overview]
Message-ID: <20240130063630.2931301-1-hau.hsu@sifive.com> (raw)

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

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 "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.

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

Signed-off-by: Hau Hsu <hau.hsu@sifive.com>
---
 bfd/ChangeLog     |  9 ++++++
 bfd/elfxx-riscv.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 81 insertions(+)

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 97d0c585a56..0807a2e0bcb 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,12 @@
+2024-01-17 Hau Hsu  <hau.hsu@sifive.com>
+
+	* elfxx-riscv.c (riscv_parse_subset): Parse 'help' keyword to print
+	  available extension and versions.
+	(riscv_print_extensions): New function.
+	(riscv_same_extension_version): New function.
+	(riscv_same_extension_diff_version): New function.
+	(riscv_valid_ext): New function.
+
 2024-01-15  Nick Clifton  <nickc@redhat.com>
 
 	* 2.42 branch point.
diff --git a/bfd/elfxx-riscv.c b/bfd/elfxx-riscv.c
index 9a121b47121..bb394a589b1 100644
--- a/bfd/elfxx-riscv.c
+++ b/bfd/elfxx-riscv.c
@@ -2051,6 +2051,71 @@ riscv_set_default_arch (riscv_parse_subset_t *rps)
     }
 }
 
+static
+bool riscv_same_extension_version(
+  const struct riscv_supported_ext* ext1,
+  const struct riscv_supported_ext* ext2)
+{
+  return (strcmp(ext1->name, ext2->name) == 0
+          && ext1->major_version == ext2->major_version
+          && ext1->minor_version == ext2->minor_version);
+}
+
+static
+bool riscv_same_extension_diff_version(
+  const struct riscv_supported_ext* ext1,
+  const struct riscv_supported_ext* ext2)
+{
+  return (strcmp(ext1->name, ext2->name) == 0
+          && !(ext1->major_version == ext2->major_version
+               && ext1->minor_version == ext2->minor_version));
+}
+
+static
+bool riscv_valid_ext(const struct riscv_supported_ext *ext)
+{
+  return (ext->isa_spec_class != ISA_SPEC_CLASS_NONE
+          && ext->major_version != RISCV_UNKNOWN_VERSION
+          && ext->minor_version != RISCV_UNKNOWN_VERSION);
+}
+
+static
+void riscv_print_extensions(void)
+{
+  /* Record the previous pritned 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];
+          if (!riscv_valid_ext (cur))
+            continue;
+
+          if (prev && riscv_same_extension_version (prev, cur))
+            continue;
+
+          if (!prev || !riscv_same_extension_diff_version (prev, cur))
+            {
+              printf("\n\t%-40s%d.%d", cur->name, cur->major_version, cur->minor_version);
+              prev = &exts[j];
+            }
+          else
+            {
+              printf(", %d.%d", cur->major_version, cur->minor_version);
+              prev = &exts[j];
+            }
+        }
+    }
+  printf ("\n");
+}
+
 /* Function for parsing ISA string.
 
    Return Value:
@@ -2089,6 +2154,13 @@ riscv_parse_subset (riscv_parse_subset_t *rps,
     }
 
   p = arch;
+  /* List all avaiable archs. */
+  if (strcmp (p, "help") == 0)
+    {
+      riscv_print_extensions();
+      exit (EXIT_SUCCESS);
+    }
+
   if (startswith (p, "rv32"))
     {
       *rps->xlen = 32;
-- 
2.37.1


             reply	other threads:[~2024-01-30  6:36 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-01-30  6:36 Hau Hsu [this message]
2024-01-30  8:43 ` Tsukasa OI
2024-01-30 12:32   ` Hau Hsu

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20240130063630.2931301-1-hau.hsu@sifive.com \
    --to=hau.hsu@sifive.com \
    --cc=binutils@sourceware.org \
    --cc=kito.cheng@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).