示例#1
0
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))
示例#2
0
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))
示例#3
0
 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)
示例#4
0
    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
示例#5
0
    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
示例#6
0
    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
示例#7
0
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
示例#8
0
    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)
示例#9
0
    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)
示例#10
0
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))
示例#11
0
 def load_Undef(self, arg):
     return lc.Constant.undef(llvm_type(arg.type))
示例#12
0
def initialize(func, env):
    verify_lowlevel(func)
    llvm_module = env["codegen.llvm.module"]
    return llvm_module.add_function(llvm_type(func.type), func.name)
示例#13
0
 def load_Undef(self, arg):
     return lc.Constant.undef(llvm_type(arg.type))
示例#14
0
 def load_Pointer(self, arg):
     return const_i64(arg.addr).inttoptr(llvm_type(arg.type))