added comment line marker support and adjusted tests

This commit is contained in:
JanLJL
2020-01-22 15:06:56 +01:00
parent c3b334a0f2
commit 15782bd106
4 changed files with 62 additions and 44 deletions

View File

@@ -3,6 +3,8 @@ from collections import OrderedDict
from osaca.parser import ParserAArch64v81, ParserX86ATT, get_parser
COMMENT_MARKER = {'start': 'OSACA-BEGIN', 'end': 'OSACA-END'}
def reduce_to_section(kernel, isa):
isa = isa.lower()
@@ -22,14 +24,27 @@ def reduce_to_section(kernel, isa):
def find_marked_kernel_AArch64(lines):
nop_bytes = ['213', '3', '32', '31']
return find_marked_section(
lines, ParserAArch64v81(), ['mov'], 'x1', [111, 222], nop_bytes, reverse=True
lines,
ParserAArch64v81(),
['mov'],
'x1',
[111, 222],
nop_bytes,
reverse=True,
comments=COMMENT_MARKER,
)
def find_marked_kernel_x86ATT(lines):
nop_bytes = ['100', '103', '144']
return find_marked_section(
lines, ParserX86ATT(), ['mov', 'movl'], 'ebx', [111, 222], nop_bytes
lines,
ParserX86ATT(),
['mov', 'movl'],
'ebx',
[111, 222],
nop_bytes,
comments=COMMENT_MARKER,
)
@@ -70,13 +85,20 @@ def get_marker(isa, comment=""):
return start_marker, end_marker
def find_marked_section(lines, parser, mov_instr, mov_reg, mov_vals, nop_bytes, reverse=False):
def find_marked_section(
lines, parser, mov_instr, mov_reg, mov_vals, nop_bytes, reverse=False, comments=None
):
# TODO match to instructions returned by get_marker
index_start = -1
index_end = -1
for i, line in enumerate(lines):
try:
if line.instruction in mov_instr and lines[i + 1].directive is not None:
if line.instruction is None and comments is not None and line.comment is not None:
if comments['start'] == line.comment:
index_start = i + 1
elif comments['end'] == line.comment:
index_end = i
elif line.instruction in mov_instr and lines[i + 1].directive is not None:
source = line.operands[0 if not reverse else 1]
destination = line.operands[1 if not reverse else 0]
# instruction pair matches, check for operands
@@ -121,7 +143,7 @@ def match_bytes(lines, index, byte_list):
line_count += 1
extracted_bytes += lines[index].directive.parameters
index += 1
if extracted_bytes[0:len(byte_list)] == byte_list:
if extracted_bytes[0 : len(byte_list)] == byte_list:
return True, line_count
return False, -1
@@ -156,7 +178,7 @@ def find_jump_labels(lines):
if all(
[
l['instruction'].startswith('.')
for l in lines[labels[label][0]:labels[label][1]]
for l in lines[labels[label][0] : labels[label][1]]
if l['instruction'] is not None
]
):
@@ -180,7 +202,7 @@ def find_basic_blocks(lines):
blocks = OrderedDict()
for label, label_line_idx in valid_jump_labels.items():
blocks[label] = []
for line in lines[label_line_idx + 1:]:
for line in lines[label_line_idx + 1 :]:
terminate = False
blocks[label].append(line)
# Find end of block by searching for references to valid jump labels
@@ -209,7 +231,7 @@ def find_basic_loop_bodies(lines):
loop_bodies = OrderedDict()
for label, label_line_idx in valid_jump_labels.items():
current_block = []
for line in lines[label_line_idx + 1:]:
for line in lines[label_line_idx + 1 :]:
terminate = False
current_block.append(line)
# Find end of block by searching for references to valid jump labels

View File

@@ -1,5 +1,4 @@
// mov x1, #111
// .byte 213,3,32,31
// OSACA-BEGIN
.LBB0_32:
ldp q4, q5, [x9, #-32]
ldp q6, q7, [x9], #64
@@ -23,5 +22,4 @@
fmov s1, #2.0e+2f
prfm pldl1keep, [x26, #2112]
b.ne .LBB0_32
// mov x1, #222
// .byte 213,3,32,31
// OSACA-END

View File

@@ -1,5 +1,4 @@
#movl $111,%ebx
#.byte 100,103,144
# OSACA-BEGIN
.L10:
vmovapd (%r15,%rax), %ymm0
vmovapd (%r12,%rax), %ymm3
@@ -9,5 +8,4 @@
addq $32, %rax
cmpl %ecx, %r10d
ja .L10
#movl $222,%ebx
#.byte 100,103,144
# OSACA-END

View File

@@ -108,48 +108,48 @@ class TestSemanticTools(unittest.TestCase):
def test_kernelDG_x86(self):
#
# 3
# \___>5__>6
# 4
# \___>6__>7
# /
# 2
# 4_______>8
# 3
# 5_______>9
#
dg = KernelDG(self.kernel_x86, self.parser_x86, self.machine_model_csx)
self.assertTrue(nx.algorithms.dag.is_directed_acyclic_graph(dg.dg))
self.assertEqual(len(list(dg.get_dependent_instruction_forms(line_number=3))), 1)
self.assertEqual(next(dg.get_dependent_instruction_forms(line_number=3)), 6)
self.assertEqual(len(list(dg.get_dependent_instruction_forms(line_number=4))), 1)
self.assertEqual(next(dg.get_dependent_instruction_forms(line_number=4)), 7)
self.assertEqual(next(dg.get_dependent_instruction_forms(line_number=4)), 6)
self.assertEqual(len(list(dg.get_dependent_instruction_forms(line_number=5))), 1)
self.assertEqual(next(dg.get_dependent_instruction_forms(line_number=5)), 7)
self.assertEqual(next(dg.get_dependent_instruction_forms(line_number=5)), 9)
self.assertEqual(len(list(dg.get_dependent_instruction_forms(line_number=6))), 1)
self.assertEqual(next(dg.get_dependent_instruction_forms(line_number=6)), 10)
self.assertEqual(len(list(dg.get_dependent_instruction_forms(line_number=7))), 1)
self.assertEqual(next(dg.get_dependent_instruction_forms(line_number=7)), 8)
self.assertEqual(next(dg.get_dependent_instruction_forms(line_number=6)), 7)
self.assertEqual(len(list(dg.get_dependent_instruction_forms(line_number=7))), 0)
self.assertEqual(len(list(dg.get_dependent_instruction_forms(line_number=8))), 0)
self.assertEqual(len(list(dg.get_dependent_instruction_forms(line_number=9))), 0)
with self.assertRaises(ValueError):
dg.get_dependent_instruction_forms()
def test_kernelDG_AArch64(self):
dg = KernelDG(self.kernel_AArch64, self.parser_AArch64, self.machine_model_tx2)
self.assertTrue(nx.algorithms.dag.is_directed_acyclic_graph(dg.dg))
self.assertEqual(set(dg.get_dependent_instruction_forms(line_number=4)), {8, 9})
self.assertEqual(set(dg.get_dependent_instruction_forms(line_number=5)), {10, 11})
self.assertEqual(set(dg.get_dependent_instruction_forms(line_number=6)), {7, 8, 9})
self.assertEqual(set(dg.get_dependent_instruction_forms(line_number=7)), {10, 11})
self.assertEqual(set(dg.get_dependent_instruction_forms(line_number=3)), {7, 8})
self.assertEqual(set(dg.get_dependent_instruction_forms(line_number=4)), {9, 10})
self.assertEqual(set(dg.get_dependent_instruction_forms(line_number=5)), {6, 7, 8})
self.assertEqual(set(dg.get_dependent_instruction_forms(line_number=6)), {9, 10})
self.assertEqual(next(dg.get_dependent_instruction_forms(line_number=7)), 13)
self.assertEqual(next(dg.get_dependent_instruction_forms(line_number=8)), 14)
self.assertEqual(next(dg.get_dependent_instruction_forms(line_number=9)), 15)
self.assertEqual(next(dg.get_dependent_instruction_forms(line_number=9)), 16)
self.assertEqual(next(dg.get_dependent_instruction_forms(line_number=10)), 17)
self.assertEqual(next(dg.get_dependent_instruction_forms(line_number=11)), 18)
self.assertEqual(set(dg.get_dependent_instruction_forms(line_number=12)), {14, 15})
self.assertEqual(set(dg.get_dependent_instruction_forms(line_number=13)), {17, 18})
self.assertEqual(next(dg.get_dependent_instruction_forms(line_number=14)), 16)
self.assertEqual(next(dg.get_dependent_instruction_forms(line_number=15)), 16)
self.assertEqual(len(list(dg.get_dependent_instruction_forms(line_number=16))), 0)
self.assertEqual(next(dg.get_dependent_instruction_forms(line_number=17)), 19)
self.assertEqual(next(dg.get_dependent_instruction_forms(line_number=18)), 19)
self.assertEqual(set(dg.get_dependent_instruction_forms(line_number=11)), {13, 14})
self.assertEqual(set(dg.get_dependent_instruction_forms(line_number=12)), {16, 17})
self.assertEqual(next(dg.get_dependent_instruction_forms(line_number=13)), 15)
self.assertEqual(next(dg.get_dependent_instruction_forms(line_number=14)), 15)
self.assertEqual(len(list(dg.get_dependent_instruction_forms(line_number=15))), 0)
self.assertEqual(next(dg.get_dependent_instruction_forms(line_number=16)), 18)
self.assertEqual(next(dg.get_dependent_instruction_forms(line_number=17)), 18)
self.assertEqual(len(list(dg.get_dependent_instruction_forms(line_number=18))), 0)
self.assertEqual(len(list(dg.get_dependent_instruction_forms(line_number=19))), 0)
self.assertEqual(len(list(dg.get_dependent_instruction_forms(line_number=20))), 0)
self.assertEqual(len(list(dg.get_dependent_instruction_forms(line_number=21))), 0)
with self.assertRaises(ValueError):
dg.get_dependent_instruction_forms()
@@ -185,12 +185,12 @@ class TestSemanticTools(unittest.TestCase):
dg.get_loopcarried_dependencies()
def test_loop_carried_dependency_x86(self):
lcd_id = 9
lcd_id2 = 10
lcd_id = 8
lcd_id2 = 9
dg = KernelDG(self.kernel_x86, self.parser_x86, self.machine_model_csx)
lc_deps = dg.get_loopcarried_dependencies()
self.assertEqual(len(lc_deps), 2)
# ID 9
# ID 8
self.assertEqual(
lc_deps[lcd_id]['root'], dg.dg.nodes(data=True)[lcd_id]['instruction_form']
)
@@ -198,7 +198,7 @@ class TestSemanticTools(unittest.TestCase):
self.assertEqual(
lc_deps[lcd_id]['dependencies'][0], dg.dg.nodes(data=True)[lcd_id]['instruction_form']
)
# ursprünglich ID 6 mit LCD zu ID 6 (len=1)
# ID 9 ursprünglich ID 5 mit LCD zu ID 5 (len=1)
# TODO discuss
self.assertEqual(
lc_deps[lcd_id2]['root'], dg.dg.nodes(data=True)[lcd_id2]['instruction_form']