@@ -70,6 +70,39 @@ def convert_max_required_version(version):
7070 return '0xffffffffu'
7171 return 'SPV_SPIRV_VERSION_WORD({})' .format (version .replace ('.' , ',' ))
7272
73+ def get_alias_array_name (aliases ):
74+ """Returns the name of the array containing all the given aliases.
75+
76+ Arguments:
77+ - aliases: a sequence of alias names
78+ """
79+ if not aliases :
80+ return 'nullptr' ;
81+ return '{}_aliases_{}' .format (PYGEN_VARIABLE_PREFIX , '' .join (aliases ))
82+
83+ def compose_alias_list (aliases ):
84+ """Returns a string containing a braced list of aliases.
85+
86+ Arguments:
87+ - aliases: a sequence of alias names
88+
89+ Returns:
90+ a string containing the braced list of char* named by aliases.
91+ """
92+ return '{' + ', ' .join ([('"{}"' ).format (a ) for a in aliases ]) + '}'
93+
94+ def generate_aliases_arrays (aliases ):
95+ """Returns the arrays of aliases
96+
97+ Arguments:
98+ - aliases: a sequence of sequence of alias names
99+ """
100+ aliases = sorted (set ([tuple (a ) for a in aliases if a ]))
101+ arrays = [
102+ 'static const char* {}[] = {};' .format (
103+ get_alias_array_name (a ), compose_alias_list (a ))
104+ for a in aliases ]
105+ return '\n ' .join (arrays )
73106
74107def compose_capability_list (caps ):
75108 """Returns a string containing a braced list of capabilities as enums.
@@ -224,11 +257,12 @@ class InstInitializer(object):
224257 """Instances holds a SPIR-V instruction suitable for printing as the
225258 initializer for spv_opcode_desc_t."""
226259
227- def __init__ (self , opname , caps , exts , operands , version , lastVersion ):
260+ def __init__ (self , opname , aliases , caps , exts , operands , version , lastVersion ):
228261 """Initialization.
229262
230263 Arguments:
231264 - opname: opcode name (with the 'Op' prefix)
265+ - aliases: a sequence of aliases for the name of this opcode
232266 - caps: a sequence of capability names required by this opcode
233267 - exts: a sequence of names of extensions enabling this enumerant
234268 - operands: a sequence of (operand-kind, operand-quantifier) tuples
@@ -238,6 +272,8 @@ def __init__(self, opname, caps, exts, operands, version, lastVersion):
238272
239273 assert opname .startswith ('Op' )
240274 self .opname = opname [2 :] # Remove the "Op" prefix.
275+ self .num_aliases = len (aliases );
276+ self .aliases_mask = get_alias_array_name (aliases )
241277 self .num_caps = len (caps )
242278 self .caps_mask = get_capability_array_name (caps )
243279 self .num_exts = len (exts )
@@ -272,13 +308,16 @@ def __str__(self):
272308 base_str = 'spv::Op::Op'
273309
274310 template = ['{{"{opname}"' , base_str + '{opname}' ,
311+ '{num_aliases}' , '{aliases_mask}' ,
275312 '{num_caps}' , '{caps_mask}' ,
276313 '{num_operands}' , '{{{operands}}}' ,
277314 '{def_result_id}' , '{ref_type_id}' ,
278315 '{num_exts}' , '{exts}' ,
279316 '{min_version}' , '{max_version}}}' ]
280317 return ', ' .join (template ).format (
281318 opname = self .opname ,
319+ num_aliases = self .num_aliases ,
320+ aliases_mask = self .aliases_mask ,
282321 num_caps = self .num_caps ,
283322 caps_mask = self .caps_mask ,
284323 num_operands = len (self .operands ),
@@ -336,6 +375,7 @@ def generate_instruction(inst, is_ext_inst):
336375 """
337376 opname = inst .get ('opname' )
338377 opcode = inst .get ('opcode' )
378+ aliases = inst .get ('aliases' , [])
339379 caps = inst .get ('capabilities' , [])
340380 exts = inst .get ('extensions' , [])
341381 operands = inst .get ('operands' , {})
@@ -348,7 +388,7 @@ def generate_instruction(inst, is_ext_inst):
348388 if is_ext_inst :
349389 return str (ExtInstInitializer (opname , opcode , caps , operands ))
350390 else :
351- return str (InstInitializer (opname , caps , exts , operands , min_version , max_version ))
391+ return str (InstInitializer (opname , aliases , caps , exts , operands , min_version , max_version ))
352392
353393
354394def generate_instruction_table (inst_table ):
@@ -364,6 +404,8 @@ def generate_instruction_table(inst_table):
364404 """
365405 inst_table = sorted (inst_table , key = lambda k : (k ['opcode' ], k ['opname' ]))
366406
407+ aliases_arrays = generate_aliases_arrays (
408+ [inst .get ('aliases' , []) for inst in inst_table ])
367409 caps_arrays = generate_capability_arrays (
368410 [inst .get ('capabilities' , []) for inst in inst_table ])
369411 exts_arrays = generate_extension_arrays (
@@ -373,7 +415,7 @@ def generate_instruction_table(inst_table):
373415 insts = ['static const spv_opcode_desc_t kOpcodeTableEntries[] = {{\n '
374416 ' {}\n }};' .format (',\n ' .join (insts ))]
375417
376- return '{}\n \n {}\n \n {}' .format (caps_arrays , exts_arrays , '\n ' .join (insts ))
418+ return '{}\n \n {}\n \n {}\n \n {} ' .format (aliases_arrays , caps_arrays , exts_arrays , '\n ' .join (insts ))
377419
378420
379421def generate_extended_instruction_table (json_grammar , set_name , operand_kind_prefix = "" ):
@@ -405,12 +447,13 @@ def generate_extended_instruction_table(json_grammar, set_name, operand_kind_pre
405447class EnumerantInitializer (object ):
406448 """Prints an enumerant as the initializer for spv_operand_desc_t."""
407449
408- def __init__ (self , enumerant , value , caps , exts , parameters , version , lastVersion ):
450+ def __init__ (self , enumerant , value , aliases , caps , exts , parameters , version , lastVersion ):
409451 """Initialization.
410452
411453 Arguments:
412454 - enumerant: enumerant name
413455 - value: enumerant value
456+ - aliases: a sequence of aliased capability names
414457 - caps: a sequence of capability names required by this enumerant
415458 - exts: a sequence of names of extensions enabling this enumerant
416459 - parameters: a sequence of (operand-kind, operand-quantifier) tuples
@@ -419,6 +462,8 @@ def __init__(self, enumerant, value, caps, exts, parameters, version, lastVersio
419462 """
420463 self .enumerant = enumerant
421464 self .value = value
465+ self .num_aliases = len (aliases )
466+ self .aliases = get_alias_array_name (aliases )
422467 self .num_caps = len (caps )
423468 self .caps = get_capability_array_name (caps )
424469 self .num_exts = len (exts )
@@ -428,13 +473,17 @@ def __init__(self, enumerant, value, caps, exts, parameters, version, lastVersio
428473 self .lastVersion = convert_max_required_version (lastVersion )
429474
430475 def __str__ (self ):
431- template = ['{{"{enumerant}"' , '{value}' , '{num_caps}' ,
432- '{caps}' , '{num_exts}' , '{exts}' ,
476+ template = ['{{"{enumerant}"' , '{value}' ,
477+ '{num_aliases}' , '{aliases}' ,
478+ '{num_caps}' , '{caps}' ,
479+ '{num_exts}' , '{exts}' ,
433480 '{{{parameters}}}' , '{min_version}' ,
434481 '{max_version}}}' ]
435482 return ', ' .join (template ).format (
436483 enumerant = self .enumerant ,
437484 value = self .value ,
485+ num_aliases = self .num_aliases ,
486+ aliases = self .aliases ,
438487 num_caps = self .num_caps ,
439488 caps = self .caps ,
440489 num_exts = self .num_exts ,
@@ -456,6 +505,7 @@ def generate_enum_operand_kind_entry(entry, extension_map):
456505 """
457506 enumerant = entry .get ('enumerant' )
458507 value = entry .get ('value' )
508+ aliases = entry .get ('aliases' , [])
459509 caps = entry .get ('capabilities' , [])
460510 if value in extension_map :
461511 exts = extension_map [value ]
@@ -471,7 +521,7 @@ def generate_enum_operand_kind_entry(entry, extension_map):
471521 assert value is not None
472522
473523 return str (EnumerantInitializer (
474- enumerant , value , caps , exts , params , version , max_version ))
524+ enumerant , value , aliases , caps , exts , params , version , max_version ))
475525
476526
477527def generate_enum_operand_kind (enum , synthetic_exts_list ):
@@ -516,7 +566,7 @@ def functor(k): return (int(k['value'], 16))
516566 if len (entries ) == 0 :
517567 # Insert a dummy entry. Otherwise the array is empty and compilation
518568 # will fail in MSVC.
519- entries = [' {"place holder", 0, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(999,0), 0}' ]
569+ entries = [' {"place holder", 0, 0, nullptr, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(999,0), 0}' ]
520570
521571 template = ['static const spv_operand_desc_t {name}[] = {{' ,
522572 '{entries}' , '}};' ]
@@ -532,6 +582,11 @@ def generate_operand_kind_table(enums):
532582 # We only need to output info tables for those operand kinds that are enums.
533583 enums = [e for e in enums if e .get ('category' ) in ['ValueEnum' , 'BitEnum' ]]
534584
585+ aliases = [entry .get ('aliases' , [])
586+ for enum in enums
587+ for entry in enum .get ('enumerants' , [])]
588+ aliases_arrays = generate_aliases_arrays (aliases )
589+
535590 caps = [entry .get ('capabilities' , [])
536591 for enum in enums
537592 for entry in enum .get ('enumerants' , [])]
@@ -566,7 +621,7 @@ def generate_operand_kind_table(enums):
566621 table = '\n ' .join (template ).format (
567622 p = PYGEN_VARIABLE_PREFIX , enums = ',\n ' .join (table_entries ))
568623
569- return '\n \n ' .join ((caps_arrays ,) + (exts_arrays ,) + enum_entries + (table ,))
624+ return '\n \n ' .join ((aliases_arrays ,) + ( caps_arrays ,) + (exts_arrays ,) + enum_entries + (table ,))
570625
571626
572627def get_extension_list (instructions , operand_kinds ):
0 commit comments