From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2119) id 842333858C74; Sat, 1 Jul 2023 13:33:11 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 842333858C74 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable From: Jeff Law To: bfd-cvs@sourceware.org Subject: [binutils-gdb] RISC-V: Allow nested implications for extensions X-Act-Checkin: binutils-gdb X-Git-Author: Nathan Huckleberry X-Git-Refname: refs/heads/master X-Git-Oldrev: c62d5acf8478b0cb3c93130cb15fa76aecd93a02 X-Git-Newrev: 48558a5e5471a5b6d084dbb836af333b85b4123c Message-Id: <20230701133311.842333858C74@sourceware.org> Date: Sat, 1 Jul 2023 13:33:11 +0000 (GMT) X-BeenThere: binutils-cvs@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Binutils-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 01 Jul 2023 13:33:11 -0000 https://sourceware.org/git/gitweb.cgi?p=3Dbinutils-gdb.git;h=3D48558a5e5471= a5b6d084dbb836af333b85b4123c commit 48558a5e5471a5b6d084dbb836af333b85b4123c Author: Nathan Huckleberry Date: Fri Jun 30 22:44:17 2023 +0200 RISC-V: Allow nested implications for extensions =20 Certain extensions require two levels of implications. For example, zvkng implies zvkn and zvkn implies zvkned. Enabling zvkng should also enable zvkned. =20 This patch fixes this behavior. =20 bfd/ChangeLog: =20 * elfxx-riscv.c (riscv_parse_add_implicit_subsets): Allow nested implications for extensions. =20 Signed-off-by: Nathan Huckleberry Signed-off-by: Christoph M=C3=BCllner Diff: --- bfd/elfxx-riscv.c | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/bfd/elfxx-riscv.c b/bfd/elfxx-riscv.c index 426139d4960..f7fb7d88d76 100644 --- a/bfd/elfxx-riscv.c +++ b/bfd/elfxx-riscv.c @@ -1873,14 +1873,29 @@ static void riscv_parse_add_implicit_subsets (riscv_parse_subset_t *rps) { struct riscv_implicit_subset *t =3D riscv_implicit_subsets; - for (; t->subset_name; t++) + bool finished =3D false; + while (!finished) { - riscv_subset_t *subset =3D NULL; - if (riscv_lookup_subset (rps->subset_list, t->subset_name, &subset) - && t->check_func (t->implicit_name, subset)) - riscv_parse_add_subset (rps, t->implicit_name, - RISCV_UNKNOWN_VERSION, - RISCV_UNKNOWN_VERSION, true); + finished =3D true; + for (; t->subset_name; t++) + { + riscv_subset_t *subset =3D NULL; + riscv_subset_t *implicit_subset =3D NULL; + if (riscv_lookup_subset (rps->subset_list, t->subset_name, &subset) + && !riscv_lookup_subset (rps->subset_list, t->implicit_name, + &implicit_subset) + && t->check_func (t->implicit_name, subset)) + { + riscv_parse_add_subset (rps, t->implicit_name, + RISCV_UNKNOWN_VERSION, + RISCV_UNKNOWN_VERSION, true); + + /* Restart the loop and pick up any new implications. */ + finished =3D false; + t =3D riscv_implicit_subsets; + break; + } + } } }