def testGEP(self): ty = Type.int64() ptr_ty = Type.int64() bldr = Builder.create() arr_ty = Type.array(ty, 2) a = bldr.alloca(arr_ty, 'a') offset = Value.const_int(ptr_ty, 0, True) b = bldr.gep(a, [offset, offset], 'gep') self.assertEqual(' %gep = getelementptr [2 x i64]* %a, i64 0, i64 0', str(b))
def testGlobalArrayLoadStore(self): mod = create_global_load_save_array_module() ee = ExecutionEngine.create_interpreter(mod) load = mod.get_function('load') ptr_ty = Type.int64(context=mod.context) offset = GenericValue.of_int(ptr_ty, 1, True) x0 = ee.run_function(load, [offset]) self.assertEqual(0, x0.to_int(True)) ty = Type.int8(context=mod.context) y = GenericValue.of_int(ty, 4, True) store = mod.get_function('store') ee.run_function(store, [y, offset]) x = ee.run_function(load, [offset]) self.assertEqual(4, x.to_int(True))
def create_global_load_save_array_module(): mod = Module.CreateWithName('module') ty = Type.int8(mod.context) array_ty = Type.array(ty, 2) x = Global.add(mod, array_ty, 'x') v = Value.const_int(ty, 0, True) ptr_ty = Type.int64(mod.context) v0 = Value.const_int(ptr_ty, 0, True) x.initializer = Value.const_array(ty, [v, v]) def create_store(): ft = Type.function(Type.void(), [ty, ptr_ty], False) f = mod.add_function('store', ft) bb = f.append_basic_block('body') bldr = Builder.create(mod.context) bldr.position_at_end(bb) xt = f.get_param(0) offset = f.get_param(1) elem_ptr = bldr.gep(x, [v0, offset], 'elem') bldr.store(xt, elem_ptr) bldr.ret_void() def create_load(): ft = Type.function(ty, [ptr_ty], False) f = mod.add_function('load', ft) bb = f.append_basic_block('body') bldr = Builder.create(mod.context) bldr.position_at_end(bb) offset = f.get_param(0) elem_ptr = bldr.gep(x, [v0, offset], 'elem') y = bldr.load(elem_ptr, 'y') bldr.ret(y) create_store() create_load() return mod