Ejemplo n.º 1
0
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)
Ejemplo n.º 2
0
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))
Ejemplo n.º 3
0
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))
Ejemplo n.º 4
0
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))
Ejemplo n.º 5
0
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))
Ejemplo n.º 6
0
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]