if 'enumerants' not in operand_kind:
return '', ''
+ # Returns a symbol for the given case in the given kind. This function
+ # handles Dim specially to avoid having numbers as the start of symbols,
+ # which does not play well with C++ and the MLIR parser.
+ def get_case_symbol(kind_name, case_name):
+ if kind_name == 'Dim':
+ if case_name == '1D' or case_name == '2D' or case_name == '3D':
+ return 'Dim{}'.format(case_name)
+ return case_name
+
kind_name = operand_kind['kind']
is_bit_enum = operand_kind['category'] == 'BitEnum'
kind_category = 'Bit' if is_bit_enum else 'I32'
max_len = max([len(symbol) for (symbol, _) in kind_cases])
# Generate the definition for each enum case
- fmt_str = 'def SPV_{acronym}_{symbol} {colon:>{offset}} '\
+ fmt_str = 'def SPV_{acronym}_{case} {colon:>{offset}} '\
'{category}EnumAttrCase<"{symbol}", {value}>;'
case_defs = [
fmt_str.format(
category=kind_category,
acronym=kind_acronym,
- symbol=case[0],
+ case=case[0],
+ symbol=get_case_symbol(kind_name, case[0]),
value=case[1],
colon=':',
offset=(max_len + 1 - len(case[0]))) for case in kind_cases