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