From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-sender-0.a4lg.com (mail-sender.a4lg.com [153.120.152.154]) by sourceware.org (Postfix) with ESMTPS id 575643858413 for ; Tue, 30 Jan 2024 08:43:48 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 575643858413 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=irq.a4lg.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=irq.a4lg.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 575643858413 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=153.120.152.154 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1706604237; cv=none; b=Urzqyttjmx6/3nlItajyeH57Tykl1eTVgvOpJ4W00fad81+l0unfrMsUKPrGCm4nsl2o+jP+NAkswUftv+HMokaYsvjI7AoCLrTyD7sHxvffhU2sYS9dzSbB56H3RjtQPPtZmHi91ddq8EOkAjYAL9c+OMKpA+Wew9+Ql8AZgX0= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1706604237; c=relaxed/simple; bh=OawVpgG8tC0/wbhZQIhE9GbygydSxXZFvfjTLkAaRKA=; h=DKIM-Signature:Message-ID:Date:Mime-Version:Subject:To:From; b=gKJEfzz2F0LKNgy641aRJ4pIydF6IQcYt/0mvZR+C6iPt4+bNOeB6wi5Ui9Z7MBSyOdhkt8OuRvS16S3t+hyAMZvR0Talu2Aa95rw6KQQWU02xhY/H5xv+YFulAcdzVjQfUEz1op0ZmCSNq7TVWowxmq3onkeeJBFteWWuOrH+o= ARC-Authentication-Results: i=1; server2.sourceware.org Received: from [127.0.0.1] (localhost [127.0.0.1]) by mail-sender-0.a4lg.com (Postfix) with ESMTPSA id 84C8C300089; Tue, 30 Jan 2024 08:43:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=irq.a4lg.com; s=2017s01; t=1706604225; bh=1R5PUctwPVFEWQVLMUOhPQh0GFlziGlJKCinB3Sru1Q=; h=Message-ID:Date:Mime-Version:Subject:To:References:From: In-Reply-To:Content-Type:Content-Transfer-Encoding; b=HiznhjcowgjhJqENDQr/+E/RBpqAIdapETylDRwNLfNs9DopIUGB5XoI3hWOPY5Lu hHQP4aHlUhpwj5zmyUXmEp9090POv+fyen/iH7TZBzHCJ5JjH4vRrgBTi2fIMU2DK6 oPqOQiRCbZPVG5qOiYIUWDwsNEcJJaPlatMlCgMI= Message-ID: Date: Tue, 30 Jan 2024 17:43:43 +0900 Mime-Version: 1.0 Subject: Re: [PATCH v2] RISC-V: Add --march=help To: Hau Hsu , Binutils References: <20240130063630.2931301-1-hau.hsu@sifive.com> Content-Language: en-US From: Tsukasa OI In-Reply-To: <20240130063630.2931301-1-hau.hsu@sifive.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-12.0 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,GIT_PATCH_0,SPF_HELO_NONE,SPF_PASS,TXREP,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: Hi Hau, I'm not yet ready to come back to Binutils development (because I haven't finished writing my research paper) but I'd like to comment. While your idea seems great at first glance, I would never like to see "help" handling in the riscv_parse_subset function because many other functions call it (some calls this function with an argument retrieved from an assembly / object file and your design seems vulnerable from adversarial files e.g. when disassembling files with unknown origin). Besides that, I think that's not a bad idea (quite rare to see in the GNU toolchain, though). IMHO, the right place to put "help" handling (at least, its entry point) is the md_parse_option function in gas/config/tc-riscv.c. Exiting successfully from here is rare but at least cris and kvx does so for help-like options. Thanks, Tsukasa On 2024/01/30 15:36, Hau Hsu wrote: > 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 > --- > 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 > + > + * 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 > > * 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;