diff --git a/meta/cretonne/__init__.py b/meta/cretonne/__init__.py index a5fe761bce..825b30a8dc 100644 --- a/meta/cretonne/__init__.py +++ b/meta/cretonne/__init__.py @@ -293,6 +293,7 @@ class OperandKind(object): def __init__(self, name, doc): self.name = name self.__doc__ = doc + self.default_member = None # The camel-cased name of an operand kind is also the Rust type used to # represent it. self.camel_name = camel_case(name) @@ -347,8 +348,7 @@ class ImmediateKind(OperandKind): """ def __init__(self, name, doc, default_member='imm'): - self.name = name - self.__doc__ = doc + super(ImmediateKind, self).__init__(name, doc) self.default_member = default_member def __repr__(self): @@ -362,9 +362,9 @@ class EntityRefKind(OperandKind): The kind of an entity reference instruction operand. """ - def __init__(self, name, doc): - self.name = name - self.__doc__ = doc + def __init__(self, name, doc, default_member=None): + super(EntityRefKind, self).__init__(name, doc) + self.default_member = default_member or name def __repr__(self): return 'EntityRefKind({})'.format(self.name) @@ -686,17 +686,17 @@ class InstructionFormat(object): Yields the operand kinds. """ + self.members = list() for i, k in enumerate(kinds): if isinstance(k, tuple): member, k = k else: - member = None + member = k.default_member yield k + self.members.append(member) # Create `FormatField` instances for the immediates. if isinstance(k, ImmediateKind): - if not member: - member = k.default_member assert not hasattr(self, member), "Duplicate member name" field = FormatField(self, i, member) setattr(self, member, field) diff --git a/meta/cretonne/entities.py b/meta/cretonne/entities.py index bd55fa6eed..907fb64359 100644 --- a/meta/cretonne/entities.py +++ b/meta/cretonne/entities.py @@ -9,7 +9,9 @@ from . import EntityRefKind #: A reference to an extended basic block in the same function. #: 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. stack_slot = EntityRefKind('stack_slot', 'A stack slot.') @@ -23,4 +25,5 @@ signature = EntityRefKind('signature', 'A function signature.') function = EntityRefKind('function', 'An external function.') #: 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')