def create_global_load_save_module(): mod = Module.CreateWithName('module') ty = Type.int8(mod.context) x = Global.add(mod, ty, 'x') x.initializer = Value.const_int(ty, 0, True) def create_store(): ft = Type.function(Type.void(), [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) bldr.store(xt, x) bldr.ret_void() def create_load(): ft = Type.function(ty, [], False) f = mod.add_function('load', ft) bb = f.append_basic_block('body') bldr = Builder.create(mod.context) bldr.position_at_end(bb) xt = bldr.load(x, "xt") bldr.ret(xt) create_store() create_load() return mod
def create_cumsum_module(): mod = Module.CreateWithName('module') ty = Type.int8(context=mod.context) ft = Type.function(ty, [ty], False) f = mod.add_function('cumsum', ft) bb1 = f.append_basic_block('body') bb_hdr = f.append_basic_block('hdr') bb_loop = f.append_basic_block('loop') bb_exit = f.append_basic_block('exit') bldr = Builder.create(mod.context) bldr.position_at_end(bb1) bldr.branch(bb_hdr) bldr.position_at_end(bb_hdr) i = bldr.phi(ty, 'i') s = bldr.phi(ty, 's') zero = Value.const_int(ty, 0, True) c = bldr.int_signed_lt(zero, i, 'comp') bldr.conditional_branch(c, bb_loop, bb_exit) bldr.position_at_end(bb_loop) s1 = bldr.add(s, i, 's1') i1 = bldr.sub(i, Value.const_int(ty, 1, True), 'i1') bldr.branch(bb_hdr) i.add_incoming([f.get_param(0), i1], [bb1, bb_loop]) s.add_incoming([Value.const_int(ty, 0, True), s1], [bb1, bb_loop]) bldr.position_at_end(bb_exit) bldr.ret(s) return (mod, f)
def create_abs_module(): mod = Module.CreateWithName('module') ty = Type.int8(context=mod.context) ft = Type.function(ty, [ty], False) f = mod.add_function('abs', ft) bb1 = f.append_basic_block('body') bbt = f.append_basic_block('true') bbf = f.append_basic_block('false') bbm = f.append_basic_block('merge') bldr = Builder.create(mod.context) bldr.position_at_end(bb1) x = f.get_param(0) zero = Value.const_int(ty, 0, True) c = bldr.int_signed_lt(x, zero, 'comp') bldr.conditional_branch(c, bbt, bbf) # True branch bldr.position_at_end(bbt) y_t = bldr.neg(x, 'neg_x') bldr.branch(bbm) # False branch bldr.position_at_end(bbf) bldr.branch(bbm) bldr.position_at_end(bbm) y = bldr.phi(ty, 'y') y.add_incoming([y_t, x], [bbt, bbf]) bldr.ret(y) return (mod, f)
def testAppendBasicBlock(self): mod = Module.CreateWithName('module') ty = Type.int8(context=mod.context) ft = Type.function(ty, [ty], False) f = mod.add_function('timestwo', ft) bb = f.append_basic_block('body') self.assertEqual('body', bb.name)
def testCreateNamedStructInMod(self): ctx = Context() mod = Module.CreateWithName('mod', ctx) ty = Type.create_named_structure(mod.context, 'mystruct') el = Type.int8(context=mod.context) ty.set_body([el, el], True) t = mod.get_type('mystruct') self.assertEqual(ty, t)
def testAddGlobal(self): mod = Module.CreateWithName('module') ty = Type.int8(context=mod.context) a = Value.const_int(ty, 1, True) g = Global.add(mod, ty, 'x') g.initializer = Value.const_int(ty, 4, True) bldr = Builder.create() c = bldr.add(g.initializer, a, 'tmp1') self.assertEqual(5, c.get_signext_value())
def create_two_module(): mod = Module.CreateWithName('module') ty = Type.int8(context=mod.context) ft = Type.function(ty, [], False) f = mod.add_function('two', ft) bb = f.append_basic_block('body') bldr = Builder.create(mod.context) bldr.position_at_end(bb) two = Value.const_int(ty, 2, True) bldr.ret(two) return mod
def setUp(self): mod = Module.CreateWithName('module') ty = Type.int8(context=mod.context) ft = Type.function(ty, [ty], False) f = mod.add_function('timestwo', ft) bb = f.append_basic_block('body') bldr = Builder.create(mod.context) bldr.position_at_end(bb) self.bldr = bldr self.ty = ty self.f = f
def create_timestwo_module(): mod = Module.CreateWithName('module') ty = Type.int8(context=mod.context) ft = Type.function(ty, [ty], False) f = mod.add_function('timestwo', ft) bb = f.append_basic_block('body') bldr = Builder.create(mod.context) bldr.position_at_end(bb) x = f.get_param(0) two = Value.const_int(ty, 2, True) y = bldr.mul(x, two, 'res') bldr.ret(y) return (mod, f)
def testAddFunction(self): mod = Module.CreateWithName('module') ty = Type.int8(context=mod.context) ft = Type.function(ty, [ty], False) f = mod.add_function('timestwo', ft) self.assertEqual('timestwo', f.name) f1 = mod.first self.assertEqual('timestwo', f1.name) fcns = [fn for fn in mod] self.assertEqual(1, len(fcns)) self.assertTrue('timestwo' in str(mod))
def create_lessthanzero_module(): mod = Module.CreateWithName('module') ty = Type.int8(context=mod.context) bool_t = Type.int1(context=mod.context) ft = Type.function(bool_t, [ty], False) f = mod.add_function('lessthanzero', ft) bb = f.append_basic_block('body') bldr = Builder.create(mod.context) bldr.position_at_end(bb) x = f.get_param(0) zero = Value.const_int(ty, 0, True) y = bldr.int_signed_lt(x, zero, 'res') bldr.ret(y) return (mod, f)
def testAddGlobalVal(self): mod = Module.CreateWithName('module') ty = Type.int8(context=mod.context) a = Value.const_int(ty, 1, True) g = Global.add(mod, ty, 'x') g.initializer = Value.const_int(ty, 4, True) g.set_const(True) t = g.type self.assertTrue(g.is_const()) bldr = Builder.create() # Build instruction %tmp1 = add i8 %tmp0, 1 c = bldr.add(bldr.load(g, "tmp0"), a, 'tmp1') self.assertEqual('i8', c.type.name) self.assertEqual('tmp1', c.name)
def create_timestwo_module_with_global(): mod = Module.CreateWithName('module') ty = Type.int8(mod.context) k = Global.add(mod, ty, 'k') k.initializer = Value.const_int(ty, 2, True) ft = Type.function(ty, [ty], False) f = mod.add_function('timestwo', ft) bb = f.append_basic_block('body') bldr = Builder.create(mod.context) bldr.position_at_end(bb) x = f.get_param(0) two = bldr.load(k, "two") y = bldr.mul(x, two, 'res') bldr.ret(y) return (mod, f)
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
def testTarget(self): context = Context() mod = Module.CreateWithName('module', context) mod.target = 'i686-apple-darwin9' self.assertEqual('i686-apple-darwin9', mod.target)
def testDataLayout(self): context = Context() mod = Module.CreateWithName('module', context) mod.datalayout = 'E-p:32:32' self.assertEqual('E-p:32:32', mod.datalayout)
def setUp(self): self.context = Context() self.module = Module.CreateWithName('module', context=self.context)