def make_constant(value, ty): lty = llvm_type(ty) if type(ty) == Pointer: value = value.addr if value == 0: return lc.Constant.null(lty) elif isinstance(value, (int, long)): return const_i64(value).inttoptr(lty) else: raise ValueError( "Cannot create constant pointer to value '%s'" % (value,)) elif type(ty) == Integral: if ty.unsigned: return lc.Constant.int(lty, value) else: return lc.Constant.int_signextend(lty, value) elif type(ty) == Real: return lc.Constant.real(lty, value) elif type(ty) == Boolean: return lc.Constant.int(lty, value) elif type(ty) == Struct: return lc.Constant.struct([make_constant(unwrap(c), c.type) for c in value.values]) elif ty.is_vector: const = make_constant(value, ty.base) return lc.Constant.vector([const] * ty.count) else: raise NotImplementedError("Constants for", type(ty))
def make_constant(value, ty): lty = llvm_type(ty) if type(ty) == Pointer: if value == 0: return lc.Constant.null(lty) elif isinstance(value, (int, long)): return const_i64(value).inttoptr(i64) else: raise ValueError( "Cannot create constant pointer to value '%s'" % (value,)) elif type(ty) == Integral: if ty.unsigned: return lc.Constant.int(lty, value) else: return lc.Constant.int_signextend(lty, value) elif type(ty) == Real: return lc.Constant.real(lty, value) elif type(ty) == Boolean: return lc.Constant.int(lty, value) elif type(ty) == Struct: return lc.Constant.struct([make_constant(c.const, c.type) for c in value.values]) else: raise NotImplementedError("Constants for", type(ty))
def op_getfield(self, op, p, attr): struct_type = op.args[0].type.base result = gep(self.builder, struct_type, p, attr) lty = llvm_type(op.type) if result.type == lty: return result return self.builder.load(result)
def load_GlobalValue(self, arg): if arg.external: value = self.lmod.get_or_insert_function(llvm_type(arg.type)) if arg.address: self.engine.add_global_mapping(value, arg.address) else: assert arg.value value = arg.value.const return value
def load_GlobalValue(self, arg): if arg.external: fnty = llvm_type(arg.type) value = self.llvm_module.get_or_insert_function(fnty, name=arg.name) if arg.address: self.engine.add_global_mapping(value, arg.address) else: assert arg.value value = arg.value.const return value
def translate(func, engine, llvm_module): verify_lowlevel(func) ### Create lfunc ### lfunc = llvm_module.add_function(llvm_type(func.type), func.name) blockmap = allocate_blocks(lfunc, func) ### Create visitor ### translator = Translator(func, lfunc, llvm_type, llvm_module) visitor = opgrouper(translator) ### Codegen ### argloader = LLVMArgLoader(None, engine, llvm_module, lfunc, blockmap) valuemap = vvisit(visitor, func, argloader) update_phis(translator.phis, valuemap, argloader) return lfunc
def load_Constant(self, arg): ty = type(arg.type) lty = llvm_type(arg.type) if ty == Pointer: if arg.const == 0: return lc.Constant.null(lty) else: return const_i64(arg.const).inttoptr(i64) elif ty == Integral: if arg.type.unsigned: return lc.Constant.int(lty, arg.const) else: return lc.Constant.int_signextend(lty, arg.const) elif ty == Real: return lc.Constant.real(lty, arg.const) else: raise NotImplementedError("Constants for", ty)
def initialize(func, env): verify_lowlevel(func) llvm_module = env["codegen.llvm.module"] return llvm_module.add_function(llvm_type(func.type), mangle(func.name))
def load_Undef(self, arg): return lc.Constant.undef(llvm_type(arg.type))
def initialize(func, env): verify_lowlevel(func) llvm_module = env["codegen.llvm.module"] return llvm_module.add_function(llvm_type(func.type), func.name)
def load_Pointer(self, arg): return const_i64(arg.addr).inttoptr(llvm_type(arg.type))