public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
* [PATCH] RISC-V: Add --march=help
@ 2024-01-18  7:35 Hau Hsu
  0 siblings, 0 replies; only message in thread
From: Hau Hsu @ 2024-01-18  7:35 UTC (permalink / raw)
  To: binutils, kito.cheng, hau.hsu

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

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..f6ffcdc6581 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()
+{
+  /* 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.31.1


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2024-01-18  7:35 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-01-18  7:35 [PATCH] RISC-V: Add --march=help Hau Hsu

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