mirror of
https://github.com/RRZE-HPC/OSACA.git
synced 2025-12-16 09:00:05 +01:00
Update parsing of memory segments
This addresses issue discussed in RRZE-HPC/OSACA#107. Now it can parse instructions of the form %fs:var@RELOC %fs:var@RELOC+4 %fs:var@RELOC(%rdi)
This commit is contained in:
@@ -52,6 +52,7 @@ class ParserX86ATT(BaseParser):
|
|||||||
joinString="::",
|
joinString="::",
|
||||||
).setResultsName("name")
|
).setResultsName("name")
|
||||||
+ pp.Optional(relocation).setResultsName("relocation")
|
+ pp.Optional(relocation).setResultsName("relocation")
|
||||||
|
+ pp.Optional(pp.Suppress(pp.Optional(pp.Literal("+"))) + decimal_number).setResultsName("offset")
|
||||||
).setResultsName("identifier")
|
).setResultsName("identifier")
|
||||||
# Label
|
# Label
|
||||||
label_rest = pp.Word(pp.alphanums + "$_.+-()")
|
label_rest = pp.Word(pp.alphanums + "$_.+-()")
|
||||||
@@ -106,13 +107,13 @@ class ParserX86ATT(BaseParser):
|
|||||||
^ pp.Word(pp.nums)
|
^ pp.Word(pp.nums)
|
||||||
^ pp.Group(
|
^ pp.Group(
|
||||||
pp.Optional(offset.setResultsName("offset"))
|
pp.Optional(offset.setResultsName("offset"))
|
||||||
+ pp.Literal("(")
|
+ pp.Optional(pp.Literal("(")
|
||||||
+ pp.Optional(self.register.setResultsName("base"))
|
+ pp.Optional(self.register.setResultsName("base"))
|
||||||
+ pp.Optional(pp.Suppress(pp.Literal(",")))
|
+ pp.Optional(pp.Suppress(pp.Literal(",")))
|
||||||
+ pp.Optional(self.register.setResultsName("index"))
|
+ pp.Optional(self.register.setResultsName("index"))
|
||||||
+ pp.Optional(pp.Suppress(pp.Literal(",")))
|
+ pp.Optional(pp.Suppress(pp.Literal(",")))
|
||||||
+ pp.Optional(scale.setResultsName("scale"))
|
+ pp.Optional(scale.setResultsName("scale"))
|
||||||
+ pp.Literal(")")
|
+ pp.Literal(")"))
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
memory_segmentation = (
|
memory_segmentation = (
|
||||||
|
|||||||
@@ -112,6 +112,9 @@ class TestParserX86ATT(unittest.TestCase):
|
|||||||
instr5 = "mov %ebx,var(,1)"
|
instr5 = "mov %ebx,var(,1)"
|
||||||
instr6 = "lea (,%rax,8),%rbx"
|
instr6 = "lea (,%rax,8),%rbx"
|
||||||
instr7 = "vinsertf128 $0x1, %xmm0, %ymm1, %ymm1"
|
instr7 = "vinsertf128 $0x1, %xmm0, %ymm1, %ymm1"
|
||||||
|
instr8 = "cmpb $0, %fs:var@TPOFF"
|
||||||
|
instr9 = "movq %rdi, %fs:var@TPOFF-8(%rcx)"
|
||||||
|
instr10 = "movq $624, %fs:var@TPOFF+4992"
|
||||||
|
|
||||||
parsed_1 = self.parser.parse_instruction(instr1)
|
parsed_1 = self.parser.parse_instruction(instr1)
|
||||||
parsed_2 = self.parser.parse_instruction(instr2)
|
parsed_2 = self.parser.parse_instruction(instr2)
|
||||||
@@ -120,6 +123,9 @@ class TestParserX86ATT(unittest.TestCase):
|
|||||||
parsed_5 = self.parser.parse_instruction(instr5)
|
parsed_5 = self.parser.parse_instruction(instr5)
|
||||||
parsed_6 = self.parser.parse_instruction(instr6)
|
parsed_6 = self.parser.parse_instruction(instr6)
|
||||||
parsed_7 = self.parser.parse_instruction(instr7)
|
parsed_7 = self.parser.parse_instruction(instr7)
|
||||||
|
parsed_8 = self.parser.parse_instruction(instr8)
|
||||||
|
parsed_9 = self.parser.parse_instruction(instr9)
|
||||||
|
parsed_10 = self.parser.parse_instruction(instr10)
|
||||||
|
|
||||||
self.assertEqual(parsed_1.mnemonic, "vcvtsi2ss")
|
self.assertEqual(parsed_1.mnemonic, "vcvtsi2ss")
|
||||||
self.assertEqual(parsed_1.operands[0].name, "edx")
|
self.assertEqual(parsed_1.operands[0].name, "edx")
|
||||||
@@ -162,6 +168,27 @@ class TestParserX86ATT(unittest.TestCase):
|
|||||||
self.assertEqual(parsed_7.operands[2].name, "ymm1")
|
self.assertEqual(parsed_7.operands[2].name, "ymm1")
|
||||||
self.assertEqual(parsed_7.operands[3].name, "ymm1")
|
self.assertEqual(parsed_7.operands[3].name, "ymm1")
|
||||||
|
|
||||||
|
self.assertEqual(parsed_8.mnemonic, "cmpb")
|
||||||
|
self.assertEqual(parsed_8.operands[0].value, 0)
|
||||||
|
self.assertEqual(parsed_8.operands[1].base.name, "fs")
|
||||||
|
self.assertEqual(parsed_8.operands[1].segment_ext[0]['offset']['identifier']['name'], "var")
|
||||||
|
self.assertEqual(parsed_8.operands[1].segment_ext[0]['offset']['identifier']['relocation'], "@TPOFF")
|
||||||
|
|
||||||
|
self.assertEqual(parsed_9.mnemonic, "movq")
|
||||||
|
self.assertEqual(parsed_9.operands[0].name, "rdi")
|
||||||
|
self.assertEqual(parsed_9.operands[1].base.name, "fs")
|
||||||
|
self.assertEqual(parsed_9.operands[1].segment_ext[0]['offset']['identifier']['name'], "var")
|
||||||
|
self.assertEqual(parsed_9.operands[1].segment_ext[0]['offset']['identifier']['relocation'], "@TPOFF")
|
||||||
|
self.assertEqual(parsed_9.operands[1].segment_ext[0]['offset']['identifier']['offset'][0], "-8")
|
||||||
|
self.assertEqual(parsed_9.operands[1].segment_ext[0]['base']['name'], "rcx")
|
||||||
|
|
||||||
|
self.assertEqual(parsed_10.mnemonic, "movq")
|
||||||
|
self.assertEqual(parsed_10.operands[0].value, 624)
|
||||||
|
self.assertEqual(parsed_10.operands[1].base.name, "fs")
|
||||||
|
self.assertEqual(parsed_10.operands[1].segment_ext[0]['offset']['identifier']['name'], "var")
|
||||||
|
self.assertEqual(parsed_10.operands[1].segment_ext[0]['offset']['identifier']['relocation'], "@TPOFF")
|
||||||
|
self.assertEqual(parsed_10.operands[1].segment_ext[0]['offset']['identifier']['offset'][0], "4992")
|
||||||
|
|
||||||
def test_parse_line(self):
|
def test_parse_line(self):
|
||||||
line_comment = "# -- Begin main"
|
line_comment = "# -- Begin main"
|
||||||
line_label = "..B1.7: # Preds ..B1.6"
|
line_label = "..B1.7: # Preds ..B1.6"
|
||||||
|
|||||||
Reference in New Issue
Block a user