enhanced x86 parser for directives

This commit is contained in:
JanLJL
2020-03-26 10:02:39 +01:00
parent d6f2ba12ed
commit 49592f77fd
3 changed files with 39 additions and 26 deletions

View File

@@ -188,9 +188,9 @@ def insert_byte_marker(args):
from kerncraft.incore_model import asm_instrumentation from kerncraft.incore_model import asm_instrumentation
except ImportError: except ImportError:
print( print(
"Module kerncraft not installed. Use 'pip install --user " 'Module kerncraft not installed. Use \'pip install --user '
"kerncraft' for installation.\nFor more information see " 'kerncraft\' for installation.\nFor more information see '
"https://github.com/RRZE-HPC/kerncraft", 'https://github.com/RRZE-HPC/kerncraft',
file=sys.stderr, file=sys.stderr,
) )
sys.exit(1) sys.exit(1)

View File

@@ -1,5 +1,6 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
import re
import string import string
import pyparsing as pp import pyparsing as pp
@@ -108,23 +109,19 @@ class ParserX86ATT(BaseParser):
).setResultsName(self.MEMORY_ID) ).setResultsName(self.MEMORY_ID)
# Directive # Directive
directive_option = pp.Combine(
pp.Word('#@.', exact=1) + pp.Word(pp.printables, excludeChars=',')
)
directive_parameter = ( directive_parameter = (
pp.quotedString pp.quotedString
^ directive_option ^ (
^ identifier pp.Word(pp.printables, excludeChars=',#')
^ hex_number + pp.Optional(pp.Suppress(pp.Literal(',')))
^ decimal_number )
^ self.register ^ pp.Suppress(pp.Literal(','))
^ pp.Group(pp.Word(pp.alphanums + '_').setResultsName('name'))
) )
commaSeparatedList = pp.delimitedList(pp.Optional(directive_parameter), delim=',')
self.directive = pp.Group( self.directive = pp.Group(
pp.Literal('.') pp.Literal('.')
+ pp.Word(pp.alphanums + '_').setResultsName('name') + pp.Word(pp.alphanums + '_').setResultsName('name')
+ commaSeparatedList.setResultsName('parameters') # + pp.ZeroOrMore(directive_parameter).setResultsName('parameters')
+ pp.ZeroOrMore(directive_parameter).setResultsName('parameters')
+ pp.Optional(self.comment) + pp.Optional(self.comment)
).setResultsName(self.DIRECTIVE_ID) ).setResultsName(self.DIRECTIVE_ID)
@@ -277,8 +274,18 @@ class ParserX86ATT(BaseParser):
return self.process_immediate(operand[self.IMMEDIATE_ID]) return self.process_immediate(operand[self.IMMEDIATE_ID])
if self.LABEL_ID in operand: if self.LABEL_ID in operand:
return self.process_label(operand[self.LABEL_ID]) return self.process_label(operand[self.LABEL_ID])
if self.DIRECTIVE_ID in operand:
return self.process_directive(operand[self.DIRECTIVE_ID])
return operand return operand
def process_directive(self, directive):
directive_new = {'name': directive['name'], 'parameters': []}
if 'parameters' in directive:
directive_new['parameters'] = directive['parameters']
if 'comment' in directive:
directive_new['comment'] = directive['comment']
return AttrDict({self.DIRECTIVE_ID: directive_new})
def process_memory_address(self, memory_address): def process_memory_address(self, memory_address):
"""Post-process memory address operand""" """Post-process memory address operand"""
# Remove unecessarily created dictionary entries during memory address parsing # Remove unecessarily created dictionary entries during memory address parsing

View File

@@ -47,18 +47,26 @@ class TestParserX86ATT(unittest.TestCase):
self.assertEqual(len(self._get_directive(self.parser, '\t.align\t16,0x90').parameters), 2) self.assertEqual(len(self._get_directive(self.parser, '\t.align\t16,0x90').parameters), 2)
self.assertEqual( self.assertEqual(
self._get_directive(self.parser, '\t.set\tL$set$0,LECIE1-LSCIE1').parameters, self._get_directive(self.parser, '\t.set\tL$set$0,LECIE1-LSCIE1').parameters,
[{'name': 'L$set$0'}, {'name': 'LECIE1-LSCIE1'}]) ['L$set$0', 'LECIE1-LSCIE1'],
)
self.assertEqual( self.assertEqual(
self._get_directive( self._get_directive(
self.parser, self.parser,
'\t.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support' '\t.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support',
).parameters, ).parameters,
[{'name': v} for v in [
['__TEXT', '__eh_frame', 'coalesced', 'no_toc+strip_static_syms+live_support']]) '__TEXT',
'__eh_frame',
'coalesced',
'no_toc+strip_static_syms+live_support',
],
)
self.assertEqual( self.assertEqual(
self._get_directive( self._get_directive(
self.parser, '\t.section\t__TEXT,__literal16,16byte_literals').parameters, self.parser, '\t.section\t__TEXT,__literal16,16byte_literals'
[{'name': v} for v in ['__TEXT', '__literal16', '16byte_literals']]) ).parameters,
['__TEXT', '__literal16', '16byte_literals'],
)
self.assertEqual( self.assertEqual(
self._get_directive(self.parser, '\t.align\t16,0x90').parameters[1], '0x90' self._get_directive(self.parser, '\t.align\t16,0x90').parameters[1], '0x90'
) )
@@ -169,7 +177,7 @@ class TestParserX86ATT(unittest.TestCase):
instruction_form_3 = { instruction_form_3 = {
'instruction': None, 'instruction': None,
'operands': [], 'operands': [],
'directive': {'name': 'quad', 'parameters': [{'name': '.2.3_2__kmpc_loc_pack.2'}]}, 'directive': {'name': 'quad', 'parameters': ['.2.3_2__kmpc_loc_pack.2']},
'comment': 'qed', 'comment': 'qed',
'label': None, 'label': None,
'line': '.quad .2.3_2__kmpc_loc_pack.2 #qed', 'line': '.quad .2.3_2__kmpc_loc_pack.2 #qed',
@@ -186,9 +194,7 @@ class TestParserX86ATT(unittest.TestCase):
'scale': 1, 'scale': 1,
} }
}, },
{ {'register': {'name': 'ecx'}},
'register': {'name': 'ecx'}
}
], ],
'directive': None, 'directive': None,
'comment': '12.9', 'comment': '12.9',