[qfcc] Add a silent spirv enum lookup function

Or mostly silent, since the core and enumeration symbols are expected to
be value, but the enumerant itself does not cause a diagnostic if not
found (needed for checking image dimension and format).
This commit is contained in:
Bill Currie 2025-02-11 17:59:03 +09:00
parent 1c20316c9a
commit 28604add29
2 changed files with 18 additions and 4 deletions

View file

@ -100,6 +100,8 @@ const plitem_t *spirv_operand_kind (const char *set, const char *kind);
uint32_t spirv_instruction_opcode (const char *set, const expr_t *opcode);
bool spirv_setup_intrinsic_symtab (symtab_t *symtab);
bool spirv_enum_val_silent (const char *enum_name, const char *enumerant,
uint32_t *val);
uint32_t spirv_enum_val (const char *enum_name, const char *enumerant);
#endif//__spirv_grammar_h

View file

@ -538,8 +538,9 @@ spirv_setup_intrinsic_symtab (symtab_t *symtab)
return true;
}
uint32_t
spirv_enum_val (const char *enum_name, const char *enumerant)
bool
spirv_enum_val_silent (const char *enum_name, const char *enumerant,
uint32_t *val)
{
const char *set = "core";
auto grammar = find_grammar (set);
@ -555,8 +556,19 @@ spirv_enum_val (const char *enum_name, const char *enumerant)
}
auto enum_val = symtab_lookup (enum_enum->namespace, enumerant);
if (!enum_val) {
error (0, "Builtin %s not found", enumerant);
return false;
}
*val = enum_val->value->uint_val;
return true;
}
uint32_t
spirv_enum_val (const char *enum_name, const char *enumerant)
{
uint32_t val = 0;
if (!spirv_enum_val_silent (enum_name, enumerant, &val)) {
error (0, "%s not found", enumerant);
return 0;
}
return enum_val->value->uint_val;
return val;
}