diff --git a/osaca/semantics/marker_utils.py b/osaca/semantics/marker_utils.py index 5b212a9..9cd5271 100755 --- a/osaca/semantics/marker_utils.py +++ b/osaca/semantics/marker_utils.py @@ -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 diff --git a/tests/test_files/kernel-AArch64.s b/tests/test_files/kernel-AArch64.s index 3509ee9..e934761 100644 --- a/tests/test_files/kernel-AArch64.s +++ b/tests/test_files/kernel-AArch64.s @@ -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 diff --git a/tests/test_files/kernel-x86.s b/tests/test_files/kernel-x86.s index e582b6e..ca7af30 100644 --- a/tests/test_files/kernel-x86.s +++ b/tests/test_files/kernel-x86.s @@ -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 diff --git a/tests/test_semantics.py b/tests/test_semantics.py index b770603..b162bb7 100755 --- a/tests/test_semantics.py +++ b/tests/test_semantics.py @@ -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']