From edd772380eee5ad2c9f48780ecff69a1d5b4195e Mon Sep 17 00:00:00 2001 From: JanLJL Date: Fri, 30 Aug 2019 10:56:18 +0200 Subject: [PATCH] added tests for hidden load --- tests/test_files/kernel-x86.s | 4 +++ tests/test_semantics.py | 55 +++++++++++++++++++++++------------ 2 files changed, 41 insertions(+), 18 deletions(-) diff --git a/tests/test_files/kernel-x86.s b/tests/test_files/kernel-x86.s index 3dd3185..e582b6e 100644 --- a/tests/test_files/kernel-x86.s +++ b/tests/test_files/kernel-x86.s @@ -1,3 +1,5 @@ +#movl $111,%ebx +#.byte 100,103,144 .L10: vmovapd (%r15,%rax), %ymm0 vmovapd (%r12,%rax), %ymm3 @@ -7,3 +9,5 @@ addq $32, %rax cmpl %ecx, %r10d ja .L10 +#movl $222,%ebx +#.byte 100,103,144 diff --git a/tests/test_semantics.py b/tests/test_semantics.py index b687ff1..df57214 100755 --- a/tests/test_semantics.py +++ b/tests/test_semantics.py @@ -10,9 +10,8 @@ from subprocess import call import networkx as nx from osaca.parser import AttrDict, ParserAArch64v81, ParserX86ATT -from osaca.semantics.hw_model import MachineModel -from osaca.semantics.kernel_dg import KernelDG -from osaca.semantics.semanticsAppender import SemanticsAppender +from osaca.semantics import (INSTR_FLAGS, KernelDG, MachineModel, + SemanticsAppender) class TestSemanticTools(unittest.TestCase): @@ -31,11 +30,11 @@ class TestSemanticTools(unittest.TestCase): self.parser_x86 = ParserX86ATT() self.parser_AArch64 = ParserAArch64v81() with open(self._find_file('kernel-x86.s')) as f: - code_x86 = f.read() + self.code_x86 = f.read() with open(self._find_file('kernel-AArch64.s')) as f: - code_AArch64 = f.read() - self.kernel_x86 = self.parser_x86.parse_file(code_x86) - self.kernel_AArch64 = self.parser_AArch64.parse_file(code_AArch64) + self.code_AArch64 = f.read() + self.kernel_x86 = self.parser_x86.parse_file(self.code_x86) + self.kernel_AArch64 = self.parser_AArch64.parse_file(self.code_AArch64) # set up machine models self.machine_model_csx = MachineModel( @@ -117,16 +116,18 @@ class TestSemanticTools(unittest.TestCase): # 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=2))), 1) - self.assertEqual(next(dg.get_dependent_instruction_forms(line_number=2)), 5) - self.assertEqual(len(list(dg.get_dependent_instruction_forms(line_number=3))), 1) - self.assertEqual(next(dg.get_dependent_instruction_forms(line_number=3)), 5) self.assertEqual(len(list(dg.get_dependent_instruction_forms(line_number=4))), 1) - self.assertEqual(next(dg.get_dependent_instruction_forms(line_number=4)), 8) + self.assertEqual(next(dg.get_dependent_instruction_forms(line_number=4)), 7) self.assertEqual(len(list(dg.get_dependent_instruction_forms(line_number=5))), 1) - self.assertEqual(next(dg.get_dependent_instruction_forms(line_number=5)), 6) - self.assertEqual(len(list(dg.get_dependent_instruction_forms(line_number=6))), 0) - self.assertEqual(len(list(dg.get_dependent_instruction_forms(line_number=7))), 0) + self.assertEqual(next(dg.get_dependent_instruction_forms(line_number=5)), 7) + 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(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) @@ -149,6 +150,21 @@ class TestSemanticTools(unittest.TestCase): 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() + + def test_hidden_load(self): + machine_model_zen = MachineModel(arch='ZEN1') + semantics_zen = SemanticsAppender(machine_model_zen) + kernel_zen = self.parser_x86.parse_file(self.code_x86) + kernel_zen_2 = self.parser_x86.parse_file(self.code_x86)[-3:] + semantics_zen.add_semantics(kernel_zen) + semantics_zen.add_semantics(kernel_zen_2) + + num_hidden_loads = len([x for x in kernel_zen if INSTR_FLAGS.HIDDEN_LD in x['flags']]) + num_hidden_loads_2 = len([x for x in kernel_zen_2 if INSTR_FLAGS.HIDDEN_LD in x['flags']]) + self.assertEqual(num_hidden_loads, 1) + self.assertEqual(num_hidden_loads_2, 0) def test_cyclic_dag(self): dg = KernelDG(self.kernel_x86, self.parser_x86, self.machine_model_csx) @@ -161,13 +177,16 @@ class TestSemanticTools(unittest.TestCase): dg.get_loopcarried_dependencies() def test_loop_carried_dependency_x86(self): + lcd_id = 9 dg = KernelDG(self.kernel_x86, self.parser_x86, self.machine_model_csx) lc_deps = dg.get_loopcarried_dependencies() self.assertEqual(len(lc_deps), 1) - self.assertEqual(lc_deps[7]['root'], dg.dg.nodes(data=True)[7]['instruction_form']) - self.assertEqual(len(lc_deps[7]['dependencies']), 1) self.assertEqual( - lc_deps[7]['dependencies'][0], dg.dg.nodes(data=True)[7]['instruction_form'] + lc_deps[lcd_id]['root'], dg.dg.nodes(data=True)[lcd_id]['instruction_form'] + ) + self.assertEqual(len(lc_deps[lcd_id]['dependencies']), 1) + self.assertEqual( + lc_deps[lcd_id]['dependencies'][0], dg.dg.nodes(data=True)[lcd_id]['instruction_form'] ) def test_is_read_is_written_x86(self):