[python-bindings] Added support for iterating over a basic blocks instructions, getti...
[oota-llvm.git] / bindings / python / llvm / tests / test_core.py
1 from .base import TestBase
2 from ..core import OpCode
3 from ..core import MemoryBuffer
4 from ..core import PassRegistry
5 from ..core import Context
6 from ..core import Module
7 from ..bit_reader import parse_bitcode
8
9 class 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             inst.dump()
119             i += 1
120         
121         # Backwards
122         for inst in reversed(bb):
123             i -= 1
124             self.assertEqual(inst.name, inst_list[i][0])
125             self.assertEqual(inst.opcode, inst_list[i][1])
126             inst.dump()