forked from Imagelibrary/binutils-gdb
opcodes: aarch64: enforce checks on subclass flags in aarch64-gen.c
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.
This commit is contained in:
@@ -1110,7 +1110,8 @@ enum aarch64_insn_class
|
||||
sve2_urqvs,
|
||||
sve_index1,
|
||||
rcpc3,
|
||||
lut
|
||||
lut,
|
||||
last_iclass = lut
|
||||
};
|
||||
|
||||
/* Opcode enumerators. */
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user