diff options
author | Indu Bhagat <indu.bhagat@oracle.com> | 2024-06-29 15:25:52 -0700 |
---|---|---|
committer | Indu Bhagat <indu.bhagat@oracle.com> | 2024-06-30 11:39:27 -0700 |
commit | e6a1116265d1fc6e9eeeb029c2854a11620a45b4 (patch) | |
tree | 4cb5be7532457c5500ac85ac54bf6338891565d1 | |
parent | 365af3534d7c18e4de1956f6055749ecbc289231 (diff) | |
download | gdb-e6a1116265d1fc6e9eeeb029c2854a11620a45b4.zip gdb-e6a1116265d1fc6e9eeeb029c2854a11620a45b4.tar.gz gdb-e6a1116265d1fc6e9eeeb029c2854a11620a45b4.tar.bz2 |
opcodes: aarch64: enforce checks on subclass flags in aarch64-gen.c
[New in V4]
Enforce some checks on the newly added subclass flags:
- If a subclass is set of one insn of an iclass, every insn of that
iclass must have non-zero subclass field.
- For all other iclasses, the subclass bits are zero for all insns.
include/
* opcode/aarch64.h (enum aarch64_insn_class): Identify the
maximum iclass enum value.
opcodes/
* aarch64-gen.c (iclass_has_subclasses_p): New array of bool.
(read_table): Enforce checks on subclass flags.
-rw-r--r-- | include/opcode/aarch64.h | 3 | ||||
-rw-r--r-- | opcodes/aarch64-gen.c | 19 |
2 files changed, 21 insertions, 1 deletions
diff --git a/include/opcode/aarch64.h b/include/opcode/aarch64.h index 56ded7c..03b23c4 100644 --- a/include/opcode/aarch64.h +++ b/include/opcode/aarch64.h @@ -1090,7 +1090,8 @@ enum aarch64_insn_class sve2_urqvs, sve_index1, rcpc3, - lut + lut, + last_iclass = lut }; /* Opcode enumerators. */ diff --git a/opcodes/aarch64-gen.c b/opcodes/aarch64-gen.c index 02dcde1..2473f67 100644 --- a/opcodes/aarch64-gen.c +++ b/opcodes/aarch64-gen.c @@ -123,6 +123,8 @@ get_aarch64_opcode (const opcode_node *opcode_node) return &index2table (opcode_node->index)[real_index (opcode_node->index)]; } +static bool iclass_has_subclasses_p[last_iclass]; + static void read_table (const struct aarch64_opcode* table) { @@ -181,6 +183,9 @@ read_table (const struct aarch64_opcode* table) ++errors; } + if (ent->flags & F_SUBCLASS) + iclass_has_subclasses_p[ent->iclass] = true; + *new_ent = new_opcode_node (); (*new_ent)->opcode = ent->opcode; (*new_ent)->mask = ent->mask; @@ -188,6 +193,20 @@ read_table (const struct aarch64_opcode* table) new_ent = &((*new_ent)->next); } while ((++ent)->name); + ent = table; + do + { + /* If a subclass is set for one insn of an iclass, every insn of that + iclass must have non-zero subclass field. */ + if ((iclass_has_subclasses_p[ent->iclass] && !(ent->flags & F_SUBCLASS)) + || (!iclass_has_subclasses_p[ent->iclass] && (ent->flags & F_SUBCLASS))) + { + fprintf (stderr, "%s: unexpected subclass\n", ent->name); + ++errors; + } + ent++; + } while (ent->name); + if (errors) { fprintf (stderr, "%u errors, exiting\n", errors); |