Track InstructionData member names.

Entity references in instruction format operands also have member names
in the InstructionData struct. Track them the same way we track immediate operand member names.

Value operands still go in the arg / args members.
This commit is contained in:
Jakob Stoklund Olesen
2016-10-12 09:48:52 -07:00
parent 6158b7449a
commit eeb6fe0983
2 changed files with 13 additions and 10 deletions

View File

@@ -293,6 +293,7 @@ class OperandKind(object):
def __init__(self, name, doc): def __init__(self, name, doc):
self.name = name self.name = name
self.__doc__ = doc self.__doc__ = doc
self.default_member = None
# The camel-cased name of an operand kind is also the Rust type used to # The camel-cased name of an operand kind is also the Rust type used to
# represent it. # represent it.
self.camel_name = camel_case(name) self.camel_name = camel_case(name)
@@ -347,8 +348,7 @@ class ImmediateKind(OperandKind):
""" """
def __init__(self, name, doc, default_member='imm'): def __init__(self, name, doc, default_member='imm'):
self.name = name super(ImmediateKind, self).__init__(name, doc)
self.__doc__ = doc
self.default_member = default_member self.default_member = default_member
def __repr__(self): def __repr__(self):
@@ -362,9 +362,9 @@ class EntityRefKind(OperandKind):
The kind of an entity reference instruction operand. The kind of an entity reference instruction operand.
""" """
def __init__(self, name, doc): def __init__(self, name, doc, default_member=None):
self.name = name super(EntityRefKind, self).__init__(name, doc)
self.__doc__ = doc self.default_member = default_member or name
def __repr__(self): def __repr__(self):
return 'EntityRefKind({})'.format(self.name) return 'EntityRefKind({})'.format(self.name)
@@ -686,17 +686,17 @@ class InstructionFormat(object):
Yields the operand kinds. Yields the operand kinds.
""" """
self.members = list()
for i, k in enumerate(kinds): for i, k in enumerate(kinds):
if isinstance(k, tuple): if isinstance(k, tuple):
member, k = k member, k = k
else: else:
member = None member = k.default_member
yield k yield k
self.members.append(member)
# Create `FormatField` instances for the immediates. # Create `FormatField` instances for the immediates.
if isinstance(k, ImmediateKind): if isinstance(k, ImmediateKind):
if not member:
member = k.default_member
assert not hasattr(self, member), "Duplicate member name" assert not hasattr(self, member), "Duplicate member name"
field = FormatField(self, i, member) field = FormatField(self, i, member)
setattr(self, member, field) setattr(self, member, field)

View File

@@ -9,7 +9,9 @@ from . import EntityRefKind
#: A reference to an extended basic block in the same function. #: A reference to an extended basic block in the same function.
#: This is primarliy used in control flow instructions. #: This is primarliy used in control flow instructions.
ebb = EntityRefKind('ebb', 'An extended basic block in the same function.') ebb = EntityRefKind(
'ebb', 'An extended basic block in the same function.',
default_member='destination')
#: A reference to a stack slot declared in the function preamble. #: A reference to a stack slot declared in the function preamble.
stack_slot = EntityRefKind('stack_slot', 'A stack slot.') stack_slot = EntityRefKind('stack_slot', 'A stack slot.')
@@ -23,4 +25,5 @@ signature = EntityRefKind('signature', 'A function signature.')
function = EntityRefKind('function', 'An external function.') function = EntityRefKind('function', 'An external function.')
#: A reference to a jump table declared in the function preamble. #: A reference to a jump table declared in the function preamble.
jump_table = EntityRefKind('jump_table', 'A jump table.') jump_table = EntityRefKind(
'jump_table', 'A jump table.', default_member='table')