aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Huckleberry <nhuck@google.com>2023-06-30 22:44:17 +0200
committerJeff Law <jlaw@ventanamicro>2023-07-01 07:29:34 -0600
commit48558a5e5471a5b6d084dbb836af333b85b4123c (patch)
treed600d0f0eee2062d6a504cce17104fbdfcdd8447
parentc62d5acf8478b0cb3c93130cb15fa76aecd93a02 (diff)
downloadgdb-48558a5e5471a5b6d084dbb836af333b85b4123c.zip
gdb-48558a5e5471a5b6d084dbb836af333b85b4123c.tar.gz
gdb-48558a5e5471a5b6d084dbb836af333b85b4123c.tar.bz2
RISC-V: Allow nested implications for extensions
Certain extensions require two levels of implications. For example, zvkng implies zvkn and zvkn implies zvkned. Enabling zvkng should also enable zvkned. This patch fixes this behavior. bfd/ChangeLog: * elfxx-riscv.c (riscv_parse_add_implicit_subsets): Allow nested implications for extensions. Signed-off-by: Nathan Huckleberry <nhuck@google.com> Signed-off-by: Christoph Müllner <christoph.muellner@vrull.eu>
-rw-r--r--bfd/elfxx-riscv.c29
1 files changed, 22 insertions, 7 deletions
diff --git a/bfd/elfxx-riscv.c b/bfd/elfxx-riscv.c
index 426139d..f7fb7d8 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 = riscv_implicit_subsets;
- for (; t->subset_name; t++)
+ bool finished = false;
+ while (!finished)
{
- riscv_subset_t *subset = 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 = true;
+ for (; t->subset_name; t++)
+ {
+ riscv_subset_t *subset = NULL;
+ riscv_subset_t *implicit_subset = 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 = false;
+ t = riscv_implicit_subsets;
+ break;
+ }
+ }
}
}