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