1from .base import TestBase
2from ..core import OpCode
3from ..core import MemoryBuffer
4from ..core import PassRegistry
5from ..core import Context
6from ..core import Module
7from ..bit_reader import parse_bitcode
8
9class TestCore(TestBase):
10    def test_opcode(self):
11        self.assertTrue(hasattr(OpCode, 'Ret'))
12        self.assertTrue(isinstance(OpCode.Ret, OpCode))
13        self.assertEqual(OpCode.Ret.value, 1)
14
15        op = OpCode.from_value(1)
16        self.assertTrue(isinstance(op, OpCode))
17        self.assertEqual(op, OpCode.Ret)
18
19    def test_memory_buffer_create_from_file(self):
20        source = self.get_test_file()
21
22        MemoryBuffer(filename=source)
23
24    def test_memory_buffer_failing(self):
25        with self.assertRaises(Exception):
26            MemoryBuffer(filename="/hopefully/this/path/doesnt/exist")
27
28    def test_memory_buffer_len(self):
29        source = self.get_test_file()
30        m = MemoryBuffer(filename=source)
31        self.assertEqual(len(m), 50)
32
33    def test_create_passregistry(self):
34        PassRegistry()
35
36    def test_create_context(self):
37        Context.GetGlobalContext()
38
39    def test_create_module_with_name(self):
40        # Make sure we can not create a module without a LLVMModuleRef.
41        with self.assertRaises(TypeError):
42            m = Module()
43        m = Module.CreateWithName("test-module")
44
45    def test_module_getset_datalayout(self):
46        m = Module.CreateWithName("test-module")
47        dl = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:32:64-v128:32:128-a0:0:32-n32-S32"
48        m.datalayout = dl
49        self.assertEqual(m.datalayout, dl)
50
51    def test_module_getset_target(self):
52        m = Module.CreateWithName("test-module")
53        target = "thumbv7-apple-ios5.0.0"
54        m.target = target
55        self.assertEqual(m.target, target)
56
57    def test_module_print_module_to_file(self):
58        m = Module.CreateWithName("test")
59        dl = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:32:64-v128:32:128-a0:0:32-n32-S32"
60        m.datalayout = dl
61        target = "thumbv7-apple-ios5.0.0"
62        m.target = target
63        m.print_module_to_file("test2.ll")
64
65    def test_module_function_iteration(self):
66        m = parse_bitcode(MemoryBuffer(filename=self.get_test_bc()))
67        i = 0
68        functions = ["f", "f2", "f3", "f4", "f5", "f6", "g1", "g2", "h1", "h2",
69                     "h3"]
70        # Forward
71        for f in m:
72            self.assertEqual(f.name, functions[i])
73            f.dump()
74            i += 1
75        # Backwards
76        for f in reversed(m):
77            i -= 1
78            self.assertEqual(f.name, functions[i])
79            f.dump()
80
81    def test_function_basicblock_iteration(self):
82        m = parse_bitcode(MemoryBuffer(filename=self.get_test_bc()))
83        i = 0
84
85        bb_list = ['b1', 'b2', 'end']
86
87        f = m.first
88        while f.name != "f6":
89            f = f.next
90
91        # Forward
92        for bb in f:
93            self.assertEqual(bb.name, bb_list[i])
94            bb.dump()
95            i += 1
96
97        # Backwards
98        for bb in reversed(f):
99            i -= 1
100            self.assertEqual(bb.name, bb_list[i])
101            bb.dump()
102
103    def test_basicblock_instruction_iteration(self):
104        m = parse_bitcode(MemoryBuffer(filename=self.get_test_bc()))
105        i = 0
106
107        inst_list = [('arg1', OpCode.ExtractValue),
108                     ('arg2', OpCode.ExtractValue),
109                     ('', OpCode.Call),
110                     ('', OpCode.Ret)]
111
112        bb = m.first.first
113
114        # Forward
115        for inst in bb:
116            self.assertEqual(inst.name, inst_list[i][0])
117            self.assertEqual(inst.opcode, inst_list[i][1])
118            for op in range(len(inst)):
119                o = inst.get_operand(op)
120                print o.name
121                o.dump()
122            inst.dump()
123            i += 1
124
125        # Backwards
126        for inst in reversed(bb):
127            i -= 1
128            self.assertEqual(inst.name, inst_list[i][0])
129            self.assertEqual(inst.opcode, inst_list[i][1])
130            inst.dump()
131