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 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))
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))
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)
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
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)
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
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)
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")