mirror of
https://github.com/RRZE-HPC/OSACA.git
synced 2026-01-05 18:50:08 +01:00
enhanced x86 parser for directives
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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',
|
||||||
|
|||||||
Reference in New Issue
Block a user