def gv_from_python(x, llvm_type = None): if isinstance(x, GenericValue): return x elif isinstance(x, (int,long)): llvm_type = ty_int64 if llvm_type is None else llvm_type assert is_llvm_int_type(llvm_type), \ "Expected LLVM integer type, not %s" % (llvm_type,) return GenericValue.int(llvm_type, x) elif isinstance(x, float): llvm_type = ty_float64 if llvm_type is None else llvm_type assert is_llvm_float_type(llvm_type), \ "Expected LLVM float type, not %s" % (llvm_type,) return GenericValue.real(llvm_type, x) elif isinstance(x, bool): llvm_type = ty_int8 if llvm_type is None else llvm_type assert is_llvm_int_type(llvm_type), \ "Expected LLVM integer type, not %s" % (llvm_type,) return GenericValue.int(llvm_type, x) else: assert isinstance(x, np.ndarray) assert llvm_type is not None assert is_llvm_ptr_type(llvm_type), \ "Native argument receiving numpy array must be a pointer, not %s" % (llvm_type,) elt_type = llvm_type.pointee assert is_llvm_float_type(elt_type) or is_llvm_int_type(elt_type) assert elt_type == python_to_lltype(x.dtype), \ "Can't pass array with %s* data pointer to function that expects %s*" % (x.dtype, elt_type) return GenericValue.pointer(x.ctypes.data)
def ctypes_to_generic_value(cval, t): if isinstance(t, core_types.FloatT): llvm_t = llvm_types.llvm_value_type(t) return GenericValue.real(llvm_t, cval.value) elif isinstance(t, core_types.SignedT): llvm_t = llvm_types.llvm_value_type(t) return GenericValue.int_signed(llvm_t, cval.value) elif isinstance(t, core_types.IntT): llvm_t = llvm_types.llvm_value_type(t) return GenericValue.int(llvm_t, cval.value) elif isinstance(t, core_types.PtrT): return GenericValue.pointer(ctypes.addressof(cval.contents)) else: return GenericValue.pointer(ctypes.addressof(cval))
def python_to_generic_value(x, t): if isinstance(t, core_types.FloatT): llvm_t = llvm_types.llvm_value_type(t) return GenericValue.real(llvm_t, x) elif isinstance(t, core_types.SignedT): llvm_t = llvm_types.llvm_value_type(t) return GenericValue.int_signed(llvm_t, x) elif isinstance(t, core_types.IntT): llvm_t = llvm_types.llvm_value_type(t) return GenericValue.int(llvm_t, x) elif isinstance(t, core_types.PtrT): return GenericValue.pointer(x) else: ctypes_obj = type_conv.from_python(x) return GenericValue.pointer(ctypes.addressof(ctypes_obj))
def python_to_generic_value(x, t): if isinstance(t, FloatT): llvm_t = llvm_types.llvm_value_type(t) return GenericValue.real(llvm_t, x) elif isinstance(t, SignedT): llvm_t = llvm_types.llvm_value_type(t) return GenericValue.int_signed(llvm_t, x) elif isinstance(t, IntT): llvm_t = llvm_types.llvm_value_type(t) return GenericValue.int(llvm_t, x) elif isinstance(t, PtrT): return GenericValue.pointer(x) else: ctypes_obj = type_conv.from_python(x) return GenericValue.pointer(ctypes.addressof(ctypes_obj))
def ctypes_to_generic_value(cval, t): if isinstance(t, FloatT): llvm_t = llvm_types.llvm_value_type(t) return GenericValue.real(llvm_t, cval.value) elif isinstance(t, SignedT): llvm_t = llvm_types.llvm_value_type(t) return GenericValue.int_signed(llvm_t, cval.value) elif isinstance(t, IntT): llvm_t = llvm_types.llvm_value_type(t) return GenericValue.int(llvm_t, cval.value) elif isinstance(t, NoneT): return GenericValue.int(llvm_types.int64_t, 0) elif isinstance(t, PtrT): return GenericValue.pointer(ctypes.addressof(cval.contents)) else: return GenericValue.pointer(ctypes.addressof(cval))
dsquared_func = Function.new(mod, Type.function(Type.double(), [Type.double(), Type.double()], False), "dsquared") block = dsquared_func.append_basic_block("entry") builder = Builder.new(block) x = dsquared_func.args[0] xsquared = builder.fmul(x, x) y = dsquared_func.args[1] ysquared = builder.fmul(y, y) d2 = builder.fadd(xsquared, ysquared) builder.ret(d2) #print(mod) a = GenericValue.real(Type.double(), 3.0) b = GenericValue.real(Type.double(), 4.0) result = engine.run_function(dsquared_func, [a, b]) #print(result.as_real(Type.double())) sqrt_func = Function.new(mod, Type.function(Type.double(), [Type.double()], False), "sqrt") r = engine.run_function(sqrt_func, [result]) #print(r.as_real(Type.double())) # define a function that calls a function distance_func = Function.new(mod, Type.function(Type.double(), [Type.double(), Type.double()], False), "distance") block = distance_func.append_basic_block("entry") builder = Builder.new(block) x = distance_func.args[0]