diff options
author | Nathan Huckleberry <nhuck@google.com> | 2023-06-30 22:44:17 +0200 |
---|---|---|
committer | Jeff Law <jlaw@ventanamicro> | 2023-07-01 07:29:34 -0600 |
commit | 48558a5e5471a5b6d084dbb836af333b85b4123c (patch) | |
tree | d600d0f0eee2062d6a504cce17104fbdfcdd8447 | |
parent | c62d5acf8478b0cb3c93130cb15fa76aecd93a02 (diff) | |
download | gdb-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.c | 29 |
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; + } + } } } |