Ejemplo n.º 1
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.º 2
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.º 3
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.º 4
0
def const(python_scalar, parakeet_type):
    assert isinstance(parakeet_type, ScalarT)
    llvm_type = llvm_value_type(parakeet_type)
    if isinstance(parakeet_type, FloatT):
        return llcore.Constant.real(llvm_type, float(python_scalar))
    else:
        return llcore.Constant.int(llvm_type, int(python_scalar))
Ejemplo n.º 5
0
def const(python_scalar, parakeet_type):
  assert isinstance(parakeet_type, ScalarT)
  llvm_type = llvm_value_type(parakeet_type)
  if isinstance(parakeet_type, FloatT):
    return llcore.Constant.real(llvm_type, float(python_scalar))
  else:
    return llcore.Constant.int(llvm_type, int(python_scalar))
Ejemplo n.º 6
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.º 7
0
def from_float(llvm_value, new_ptype, builder):
  """Convert from an LLVM float value to some other LLVM scalar type"""

  dest_llvm_type = llvm_value_type(new_ptype)
  dest_name = "%s.cast_%s" % (llvm_value.name, new_ptype)

  if isinstance(new_ptype, FloatT):
    if llvm_types.nbytes(llvm_value.type) <= new_ptype.nbytes:
      return builder.fpext(llvm_value, dest_llvm_type, dest_name)
    else:
      return builder.fptrunc(llvm_value, dest_llvm_type, dest_name)
  elif isinstance(new_ptype, SignedT):
    return builder.fptosi(llvm_value, dest_llvm_type, dest_name)
  elif isinstance(new_ptype, UnsignedT):
    return builder.fptoui(llvm_value, dest_llvm_type, dest_name)
  else:
    return to_bool(llvm_value, builder)
Ejemplo n.º 8
0
  def compile_Struct(self, expr, builder, local = False):
    struct_t = expr.type
    llvm_struct_t = llvm_value_type(struct_t)
    name = expr.type.node_type()
    if local:
      struct_ptr = builder.alloca(llvm_struct_t, name + "_local_ptr")
    else:
      struct_ptr = builder.malloc(llvm_struct_t, name + "_ptr")

    for (i, elt) in enumerate(expr.args):
      field_name, field_type = struct_t._fields_[i]
      assert elt.type == field_type, \
          "Mismatch between expected type %s and given %s for field '%s' " % \
          (field_type, elt.type, field_name)
      elt_ptr = builder.gep(struct_ptr, [int32(0), int32(i)], "field%d_ptr" % i)
      llvm_elt = self.compile_expr(elt, builder)
      builder.store(llvm_elt, elt_ptr)

    return struct_ptr
Ejemplo n.º 9
0
def from_unsigned(llvm_value, new_ptype, builder):
  """Convert from an LLVM float value to some other LLVM scalar type"""

  dest_llvm_type = llvm_value_type(new_ptype)
  dest_name = "%s.cast_%s" % (llvm_value.name, new_ptype)

  if isinstance(new_ptype, FloatT):
    return builder.uitofp(llvm_value, dest_llvm_type, dest_name)
  elif isinstance(new_ptype, BoolT):
    return to_bool(llvm_value, builder)
  else:
    assert isinstance(new_ptype, IntT)
    nbytes = llvm_value.type.width / 8

    if nbytes == new_ptype.nbytes:
      return builder.bitcast(llvm_value, dest_llvm_type, dest_name)
    elif nbytes < new_ptype.nbytes:
      return builder.zext(llvm_value, dest_llvm_type, dest_name)
    else:
      return builder.trunc(llvm_value, dest_llvm_type, dest_name)
Ejemplo n.º 10
0
    def compile_Struct(self, expr, builder, local=False):
        struct_t = expr.type
        llvm_struct_t = llvm_value_type(struct_t)
        name = expr.type.node_type()
        if local:
            struct_ptr = builder.alloca(llvm_struct_t, name + "_local_ptr")
        else:
            struct_ptr = builder.malloc(llvm_struct_t, name + "_ptr")

        for (i, elt) in enumerate(expr.args):
            field_name, field_type = struct_t._fields_[i]
            assert elt.type == field_type, \
                "Mismatch between expected type %s and given %s for field '%s' " % \
                (field_type, elt.type, field_name)
            elt_ptr = builder.gep(struct_ptr, [int32(0), int32(i)],
                                  "field%d_ptr" % i)
            llvm_elt = self.compile_expr(elt, builder)
            builder.store(llvm_elt, elt_ptr)

        return struct_ptr
Ejemplo n.º 11
0
def from_bit(llvm_value, new_ptype, builder):
  llvm_t = llvm_value_type(new_ptype)
  name = "%s.cast.%s" % (llvm_value.name, new_ptype)
  return builder.select(llvm_value, one(llvm_t), zero(llvm_t), name)
Ejemplo n.º 12
0
 def compile_Alloc(self, expr, builder):
   elt_t = expr.elt_type
   llvm_elt_t = llvm_types.llvm_value_type(elt_t)
   n_elts = self.compile_expr(expr.count, builder)
   return builder.malloc_array(llvm_elt_t, n_elts, "data_ptr")
Ejemplo n.º 13
0
 def compile_Alloc(self, expr, builder):
     elt_t = expr.elt_type
     llvm_elt_t = llvm_types.llvm_value_type(elt_t)
     n_elts = self.compile_expr(expr.count, builder)
     return builder.malloc_array(llvm_elt_t, n_elts, "data_ptr")