diff --git a/osaca/parser/base_parser.py b/osaca/parser/base_parser.py index edfe8d1..9624737 100755 --- a/osaca/parser/base_parser.py +++ b/osaca/parser/base_parser.py @@ -33,7 +33,7 @@ class BaseParser(object): asm_instructions.append(self.parse_line(line, i + 1 + start_line)) return asm_instructions - def parse_line(self, line, line_number): + def parse_line(self, line, line_number=None): # Done in derived classes raise NotImplementedError @@ -51,7 +51,8 @@ class BaseParser(object): raise NotImplementedError def construct_parser(self): - raise NotImplementedError + return + # raise NotImplementedError ################## # Helper functions diff --git a/osaca/semantics/semanticsAppender.py b/osaca/semantics/semanticsAppender.py index 5f518ff..2428dff 100755 --- a/osaca/semantics/semanticsAppender.py +++ b/osaca/semantics/semanticsAppender.py @@ -58,7 +58,7 @@ class SemanticsAppender(object): if len(stores) == 0 or len(loads) == 0: # nothing to do return - if len(loads) < len(stores): + if len(loads) <= len(stores): # Hide all loads for load in loads: load['flags'] += [INSTR_FLAGS.HIDDEN_LD] diff --git a/tests/test_base_parser.py b/tests/test_base_parser.py new file mode 100755 index 0000000..1ef8cea --- /dev/null +++ b/tests/test_base_parser.py @@ -0,0 +1,76 @@ +#!/usr/bin/env python3 +""" +Unit tests for base assembly parser +""" + +import os +import unittest + +from osaca.parser import AttrDict, BaseParser + + +class TestBaseParser(unittest.TestCase): + @classmethod + def setUpClass(self): + try: + self.parser = BaseParser() + except NotImplementedError: + pass + with open(self._find_file('triad-x86-iaca.s')) as f: + self.triad_code = f.read() + + ################## + # Test + ################## + + def test_parse_file(self): + with self.assertRaises(NotImplementedError): + self.parser.parse_file(self.triad_code) + + def test_parse_line(self): + line_instruction = '\t\tlea 2(%rax,%rax), %ecx #12.9' + with self.assertRaises(NotImplementedError): + self.parser.parse_line(line_instruction) + + def test_parse_instruction(self): + instr1 = '\t\tvcvtsi2ss %edx, %xmm2, %xmm2\t\t\t#12.27' + with self.assertRaises(NotImplementedError): + self.parser.parse_instruction(instr1) + + def test_register_funcs(self): + reg_a1 = AttrDict({'name': 'rax'}) + reg_a2 = AttrDict({'name': 'eax'}) + register_string = 'v1.2d' + with self.assertRaises(NotImplementedError): + self.parser.is_reg_dependend_of(reg_a1, reg_a2) + with self.assertRaises(NotImplementedError): + self.parser.parse_register(register_string) + with self.assertRaises(NotImplementedError): + self.parser.is_gpr(reg_a1) + with self.assertRaises(NotImplementedError): + self.parser.is_vector_register(reg_a1) + with self.assertRaises(NotImplementedError): + self.parser.process_operand(reg_a1) + with self.assertRaises(NotImplementedError): + self.parser.get_full_reg_name(reg_a1) + + def test_normalize_imd(self): + imd_hex_1 = {'value': '0x4f'} + with self.assertRaises(NotImplementedError): + self.parser.normalize_imd(imd_hex_1) + + ################## + # Helper functions + ################## + + @staticmethod + def _find_file(name): + testdir = os.path.dirname(__file__) + name = os.path.join(testdir, 'test_files', name) + assert os.path.exists(name) + return name + + +if __name__ == '__main__': + suite = unittest.TestLoader().loadTestsFromTestCase(TestBaseParser) + unittest.TextTestRunner(verbosity=2).run(suite) diff --git a/tests/test_semantics.py b/tests/test_semantics.py index df57214..441c0f0 100755 --- a/tests/test_semantics.py +++ b/tests/test_semantics.py @@ -157,14 +157,19 @@ class TestSemanticTools(unittest.TestCase): 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) kernel_zen_2 = self.parser_x86.parse_file(self.code_x86)[-3:] + kernel_zen_3 = self.parser_x86.parse_file(self.code_x86)[5:8] semantics_zen.add_semantics(kernel_zen) semantics_zen.add_semantics(kernel_zen_2) + semantics_zen.add_semantics(kernel_zen_3) 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']]) + num_hidden_loads_3 = len([x for x in kernel_zen_3 if INSTR_FLAGS.HIDDEN_LD in x['flags']]) self.assertEqual(num_hidden_loads, 1) self.assertEqual(num_hidden_loads_2, 0) + self.assertEqual(num_hidden_loads_3, 1) def test_cyclic_dag(self): dg = KernelDG(self.kernel_x86, self.parser_x86, self.machine_model_csx)