mirror of
https://github.com/RRZE-HPC/OSACA.git
synced 2026-01-05 10:40:06 +01:00
minor functionality enhancements
This commit is contained in:
@@ -277,23 +277,23 @@ class ParserAArch64v81(BaseParser):
|
||||
def process_operand(self, operand):
|
||||
# structure memory addresses
|
||||
if self.MEMORY_ID in operand:
|
||||
return self.substitute_memory_address(operand[self.MEMORY_ID])
|
||||
return self.process_memory_address(operand[self.MEMORY_ID])
|
||||
# structure register lists
|
||||
if self.REGISTER_ID in operand and (
|
||||
'list' in operand[self.REGISTER_ID] or 'range' in operand[self.REGISTER_ID]
|
||||
):
|
||||
# TODO: discuss if ranges should be converted to lists
|
||||
return self.substitute_register_list(operand[self.REGISTER_ID])
|
||||
return self.process_register_list(operand[self.REGISTER_ID])
|
||||
if self.REGISTER_ID in operand and operand[self.REGISTER_ID]['name'] == 'sp':
|
||||
return self.substitute_sp_register(operand[self.REGISTER_ID])
|
||||
return self.process_sp_register(operand[self.REGISTER_ID])
|
||||
# add value attribute to floating point immediates without exponent
|
||||
if self.IMMEDIATE_ID in operand:
|
||||
return self.substitute_immediate(operand[self.IMMEDIATE_ID])
|
||||
return self.process_immediate(operand[self.IMMEDIATE_ID])
|
||||
if self.LABEL_ID in operand:
|
||||
return self.substitute_label(operand[self.LABEL_ID])
|
||||
return self.process_label(operand[self.LABEL_ID])
|
||||
return operand
|
||||
|
||||
def substitute_memory_address(self, memory_address):
|
||||
def process_memory_address(self, memory_address):
|
||||
# Remove unnecessarily created dictionary entries during parsing
|
||||
offset = None if 'offset' not in memory_address else memory_address['offset']
|
||||
base = None if 'base' not in memory_address else memory_address['base']
|
||||
@@ -315,12 +315,12 @@ class ParserAArch64v81(BaseParser):
|
||||
new_dict['post_indexed'] = memory_address['post_indexed']
|
||||
return AttrDict({self.MEMORY_ID: new_dict})
|
||||
|
||||
def substitute_sp_register(self, register):
|
||||
def process_sp_register(self, register):
|
||||
reg = register
|
||||
reg['prefix'] = 'x'
|
||||
return AttrDict({self.REGISTER_ID: reg})
|
||||
|
||||
def substitute_register_list(self, register_list):
|
||||
def process_register_list(self, register_list):
|
||||
# Remove unnecessarily created dictionary entries during parsing
|
||||
vlist = []
|
||||
dict_name = ''
|
||||
@@ -336,7 +336,7 @@ class ParserAArch64v81(BaseParser):
|
||||
new_dict = AttrDict({dict_name: vlist, 'index': index})
|
||||
return AttrDict({self.REGISTER_ID: new_dict})
|
||||
|
||||
def substitute_immediate(self, immediate):
|
||||
def process_immediate(self, immediate):
|
||||
dict_name = ''
|
||||
if 'identifier' in immediate:
|
||||
# actually an identifier, change declaration
|
||||
@@ -360,7 +360,7 @@ class ParserAArch64v81(BaseParser):
|
||||
{self.IMMEDIATE_ID: AttrDict({'value': immediate[dict_name]['mantissa']})}
|
||||
)
|
||||
|
||||
def substitute_label(self, label):
|
||||
def process_label(self, label):
|
||||
# remove duplicated 'name' level due to identifier
|
||||
label['name'] = label['name']['name']
|
||||
return AttrDict({self.LABEL_ID: label})
|
||||
|
||||
@@ -15,9 +15,8 @@ class ParserX86ATT(BaseParser):
|
||||
pp.Optional(pp.Literal('-')) + pp.Word(pp.nums)
|
||||
).setResultsName('value')
|
||||
hex_number = pp.Combine(pp.Literal('0x') + pp.Word(pp.hexnums)).setResultsName('value')
|
||||
# Comment
|
||||
symbol_comment = '#'
|
||||
self.comment = pp.Literal(symbol_comment) + pp.Group(
|
||||
# Comment - either '#' or '//' (icc)
|
||||
self.comment = (pp.Literal('#') | pp.Literal('//')) + pp.Group(
|
||||
pp.ZeroOrMore(pp.Word(pp.printables))
|
||||
).setResultsName(self.COMMENT_ID)
|
||||
# Define x86 assembly identifier
|
||||
@@ -51,7 +50,8 @@ class ParserX86ATT(BaseParser):
|
||||
immediate = pp.Group(
|
||||
pp.Literal(symbol_immediate) + (hex_number | decimal_number | identifier)
|
||||
).setResultsName(self.IMMEDIATE_ID)
|
||||
# Memory: offset(base, index, scale)
|
||||
|
||||
# Memory preparations
|
||||
offset = pp.Group(identifier | hex_number | decimal_number).setResultsName(
|
||||
self.IMMEDIATE_ID
|
||||
)
|
||||
@@ -76,7 +76,7 @@ class ParserX86ATT(BaseParser):
|
||||
+ pp.Literal(':')
|
||||
+ segment_extension.setResultsName(self.SEGMENT_EXT_ID)
|
||||
)
|
||||
|
||||
# Memory: offset | seg:seg_ext | offset(base, index, scale){mask}
|
||||
memory = pp.Group(
|
||||
(
|
||||
pp.Optional(pp.Suppress(pp.Literal('*')))
|
||||
@@ -88,6 +88,12 @@ class ParserX86ATT(BaseParser):
|
||||
+ pp.Optional(pp.Suppress(pp.Literal(',')))
|
||||
+ pp.Optional(scale.setResultsName('scale'))
|
||||
+ pp.Literal(')')
|
||||
+ pp.Optional(
|
||||
pp.Literal('{')
|
||||
+ pp.Literal('%')
|
||||
+ pp.Word(pp.alphanums).setResultsName('mask')
|
||||
+ pp.Literal('}')
|
||||
)
|
||||
)
|
||||
| memory_segmentation
|
||||
| (hex_number | pp.Word(pp.nums)).setResultsName('offset')
|
||||
@@ -249,14 +255,14 @@ class ParserX86ATT(BaseParser):
|
||||
def process_operand(self, operand):
|
||||
# For the moment, only used to structure memory addresses
|
||||
if self.MEMORY_ID in operand:
|
||||
return self.substitute_memory_address(operand[self.MEMORY_ID])
|
||||
return self.process_memory_address(operand[self.MEMORY_ID])
|
||||
if self.IMMEDIATE_ID in operand:
|
||||
return self.substitue_immediate(operand[self.IMMEDIATE_ID])
|
||||
return self.process_immediate(operand[self.IMMEDIATE_ID])
|
||||
if self.LABEL_ID in operand:
|
||||
return self.substitute_label(operand[self.LABEL_ID])
|
||||
return self.process_label(operand[self.LABEL_ID])
|
||||
return operand
|
||||
|
||||
def substitute_memory_address(self, memory_address):
|
||||
def process_memory_address(self, memory_address):
|
||||
# Remove unecessarily created dictionary entries during memory address parsing
|
||||
offset = None if 'offset' not in memory_address else memory_address['offset']
|
||||
base = None if 'base' not in memory_address else memory_address['base']
|
||||
@@ -270,12 +276,12 @@ class ParserX86ATT(BaseParser):
|
||||
new_dict[self.SEGMENT_EXT_ID] = memory_address[self.SEGMENT_EXT_ID]
|
||||
return AttrDict({self.MEMORY_ID: new_dict})
|
||||
|
||||
def substitute_label(self, label):
|
||||
def process_label(self, label):
|
||||
# remove duplicated 'name' level due to identifier
|
||||
label['name'] = label['name']['name']
|
||||
return AttrDict({self.LABEL_ID: label})
|
||||
|
||||
def substitue_immediate(self, immediate):
|
||||
def process_immediate(self, immediate):
|
||||
if 'identifier' in immediate:
|
||||
# actually an identifier, change declaration
|
||||
return immediate
|
||||
|
||||
Reference in New Issue
Block a user