aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIndu Bhagat <indu.bhagat@oracle.com>2024-06-29 15:25:52 -0700
committerIndu Bhagat <indu.bhagat@oracle.com>2024-06-30 11:39:27 -0700
commite6a1116265d1fc6e9eeeb029c2854a11620a45b4 (patch)
tree4cb5be7532457c5500ac85ac54bf6338891565d1
parent365af3534d7c18e4de1956f6055749ecbc289231 (diff)
downloadgdb-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.h3
-rw-r--r--opcodes/aarch64-gen.c19
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);