Example #1
0
    def create_module(self, name):
        mod = lc.Module.new(name)
        mod.triple = ll.get_default_triple()

        if self._data_layout:
            mod.data_layout = self._data_layout
        return mod
    def __init__(self, **kwargs):
        self.info = {"global_variables": []}
        self.local_vars = []
        self.aux = []
        self.functions = []
        self.module = ir.module.Module()

        llvm.initialize()
        llvm.initialize_all_targets()
        llvm.initialize_native_target()
        llvm.initialize_native_asmprinter()

        self.module = ir.Module('module.bc')
        self.module.triple = llvm.get_default_triple()
        target = llvm.Target.from_triple(self.module.triple)
        target_machine = target.create_target_machine()
        self.module.data_layout = target_machine.target_data

        self.escrevaInteiro = ir.Function(self.module,
                                          ir.FunctionType(
                                              ir.VoidType(), [ir.IntType(32)]),
                                          name="escrevaInteiro")
        self.escrevaFlutuante = ir.Function(self.module,
                                            ir.FunctionType(
                                                ir.VoidType(),
                                                [ir.FloatType()]),
                                            name="escrevaFlutuante")
        self.leiaInteiro = ir.Function(self.module,
                                       ir.FunctionType(ir.IntType(32), []),
                                       name="leiaInteiro")
        self.leiaFlutuante = ir.Function(self.module,
                                         ir.FunctionType(ir.FloatType(), []),
                                         name="leiaFlutuante")
Example #3
0
    def generate(self, ast=[[]], output="output.ll"):

        self.variables = {}
        self.constants = {}
        self.functions = {}
        self.scope = ''

        self.module = ir.Module(name=output)

        triple = binding.get_default_triple()
        self.module.triple = ""  # the default triple from llvmlite seems to not work on some devices.

        self.setup_std_funcs()

        main_ty = ir.FunctionType(ir.IntType(32), ())
        self.main = ir.Function(self.module, main_ty, name="main")

        self.scope = self.main

        main_block = self.scope.append_basic_block(name="entry")
        builder = ir.IRBuilder(main_block)

        for statement in ast[0]:
            builder = self.codegen(statement, builder)

        builder.ret(ir.IntType(32)(0))

        return self.module
Example #4
0
 def test_create_target_machine(self):
     target = llvm.Target.from_triple(llvm.get_default_triple())
     # With the default settings
     target.create_target_machine('', '', 1, 'default', 'default')
     # With the host's CPU
     cpu = llvm.get_host_cpu_name()
     target.create_target_machine(cpu, '', 1, 'default', 'default')
Example #5
0
    def __init__(self, file=None, name=None):
        S.Scope.__init__(self)

        if name:
            self.qname = self.mname = name
        else:
            self.file = file
            self.qname, self.mname = find_name(self.file)

        self.llvm = ir.Module(name=self.qname)
        self.llvm.triple = binding.get_default_triple()
        self.imports = set()
        self.links = set()
        self.libs = set()

        self.runtime = runtime.Runtime(self)
        self.static = static.Static(self)

        self.runtime.declare()

        typ = T.arr(T.i8, len(self.qname) + 1)
        ptr = self.add_global(typ, name=self.mangle('_name'))
        ptr.initializer = typ(bytearray(self.qname + '\0', 'utf-8'))
        self.name_ptr = ptr.gep([T.i32(0), T.i32(0)])

        self.builder = None
        self.arg_ptrs = None
        self.landingpad = None
        self.before = None
        self.loop = None
        self.after = None
        self.ret_ptr = None

        self.name_counter = 0
Example #6
0
    def template_string(self, index):
        """
        Generate template string to be used in LLVM IR call asm.

        This is used to disambiguate different usage types of a single register
        from its constaint code.

        E.g. on aarch64 targets float types will append a shape parameter to
        differentiate between single and double precision types.

        :param index: Index to use for input or output constraints.
        """
        # Optional ${reg:shape} parameter
        shape = None
        # Optional ${reg}.suffix parameter
        suffix = None

        target_triple = llvm.get_default_triple()
        if target_triple.startswith('aarch64-'):
            shape = aarch64_llvm_type_shape.get(self.llvm_type)
            suffix = aarch64_llvm_type_suffix.get(self.llvm_type)

        if shape == None:
            shape = ''
        else:
            shape = ':' + shape
        if suffix == None:
            suffix = ''
        else:
            suffix = '.' + suffix
        return '${{{}{}}}{}'.format(index, shape, suffix)
Example #7
0
    def __init__(self) -> None:
        self.module: ll.Module = ll.Module("zet")
        self.module.triple = llvm.get_default_triple() 

        self.block : ll.Block = None
        self.builder: ll.IRBuilder = None

        self.variables = {}

        self.functions = {}
        self.methods = {}
        self.structs = {}


        self.flags = { "string" : 0 }

        self.modifiers = {
            "attribute" : Attribute(),
            "static": Static(),
        }

        self.sizes = {
            "i32" : 4,
            "i8"  : 1,
            "str" : 1,
            "void": 0,
        }

        self.types = {
            "i32" : ll.IntType(32),
            "i8"  : ll.IntType(8),
            "str" : ll.IntType(8).as_pointer(),
            "void": ll.VoidType()
        }
Example #8
0
 def test_from_triple(self):
     f = llvm.Target.from_triple
     with self.assertRaises(RuntimeError) as cm:
         f("foobar")
     self.assertIn("No available targets are compatible with this triple", str(cm.exception))
     triple = llvm.get_default_triple()
     target = f(triple)
     self.assertEqual(target.triple, triple)
     target.close()
Example #9
0
    def host(cls, name='host_cpu', strict=False, use_tracing_allocator=False):
        """Return target info for host CPU.
        """
        key = (name, strict, use_tracing_allocator)

        target_info = TargetInfo._host_target_info_cache.get(key)
        if target_info is not None:
            return target_info

        import llvmlite.binding as ll
        target_info = cls(name=name,
                          strict=strict,
                          use_tracing_allocator=use_tracing_allocator)
        target_info.set('name', ll.get_host_cpu_name())
        target_info.set('triple', ll.get_default_triple())
        features = ','.join(
            ['-+'[int(v)] + k for k, v in ll.get_host_cpu_features().items()])
        target_info.set('features', features)

        for tname, ctype in dict(bool=ctypes.c_bool,
                                 size_t=ctypes.c_size_t,
                                 ssize_t=ctypes.c_ssize_t,
                                 char=ctypes.c_char,
                                 uchar=ctypes.c_char,
                                 schar=ctypes.c_char,
                                 byte=ctypes.c_byte,
                                 ubyte=ctypes.c_ubyte,
                                 wchar=ctypes.c_wchar,
                                 short=ctypes.c_short,
                                 ushort=ctypes.c_ushort,
                                 int=ctypes.c_int,
                                 uint=ctypes.c_uint,
                                 long=ctypes.c_long,
                                 ulong=ctypes.c_ulong,
                                 longlong=ctypes.c_longlong,
                                 ulonglong=ctypes.c_ulonglong,
                                 float=ctypes.c_float,
                                 double=ctypes.c_double,
                                 longdouble=ctypes.c_longdouble,
                                 voidptr=ctypes.c_void_p).items():
            target_info.type_sizeof[tname] = ctypes.sizeof(ctype)

        target_info.add_library('m')
        target_info.add_library('stdio')
        target_info.add_library('stdlib')
        target_info.add_library('rbclib')
        if use_tracing_allocator:
            target_info.set('fn_allocate_varlen_buffer',
                            'rbclib_tracing_allocate_varlen_buffer')
            target_info.set('fn_free_buffer', 'rbclib_tracing_free_buffer')
        else:
            target_info.set('fn_allocate_varlen_buffer',
                            'rbclib_allocate_varlen_buffer')
            target_info.set('fn_free_buffer', 'rbclib_free_buffer')
        cls._host_target_info_cache[key] = target_info

        return target_info
Example #10
0
 def test_from_triple(self):
     f = llvm.Target.from_triple
     with self.assertRaises(RuntimeError) as cm:
         f("foobar")
     self.assertIn("No available targets are compatible with",
                   str(cm.exception))
     triple = llvm.get_default_triple()
     target = f(triple)
     self.assertEqual(target.triple, triple)
     target.close()
Example #11
0
    def test_get_process_triple(self):
        triple = llvm.get_process_triple()
        default = llvm.get_default_triple()
        self.assertIsInstance(triple, str)
        self.assertTrue(triple)

        default_parts = default.split('-')
        triple_parts = triple.split('-')
        # Arch must be equal
        self.assertEqual(default_parts[0], triple_parts[0])
    def __init__(self, tree: Program, symbol_table: SymbolTable,
                 source_file: str) -> None:
        llvm.initialize()
        llvm.initialize_all_targets()
        llvm.initialize_all_asmprinters()

        self.tree = tree
        self.codegen = CodeGenerator(symbol_table)
        self.source_file = source_file
        self.target = llvm.Target.from_triple(llvm.get_default_triple())
Example #13
0
    def __init__(self):
        llvm.initialize()
        llvm.initialize_native_target()
        llvm.initialize_native_asmprinter()

        self.codegen = LLVMCodeGenerator()
        self.codegen.module.triple = llvm.get_default_triple()
        self.parser = Parser()
        self._add_builtins(self.codegen.module)

        self.target = llvm.Target.from_default_triple()
Example #14
0
def codegen(ast, ir_flag=False):

    ir_module = make_ir(ast)
    if ir_flag:
        return ir_module
    else:
        if binding.get_default_triple() != target_triple:
            raise ValueError(
                'cross-compilation not supported in code generator')
        asm = make_asm(ir_module)
        return asm
Example #15
0
    def visit_Program(self, node):
        self._current_scope = node._scope
        self.module = ir.Module()
        self.module.triple = get_default_triple()
        self.types = {
            Integer(): ir.IntType(64),
            Real(): ir.DoubleType(),
            Logical(): ir.IntType(1),
        }

        int_type = ir.IntType(64)
        fn = ir.FunctionType(int_type, [])
        self.func = ir.Function(self.module, fn, name="main")
        block = self.func.append_basic_block(name='.entry')
        self.builder = ir.IRBuilder(block)

        for ssym in self._current_scope.symbols:
            assert ssym not in ["abs", "sqrt", "log", "sum", "random_number"]
            sym = self._current_scope.symbols[ssym]
            type_f = sym["type"]
            if isinstance(type_f, Array):
                assert len(type_f.shape) == 1
                array_type = ir.ArrayType(self.types[type_f.type_],
                                          type_f.shape[0])
                ptr = self.builder.alloca(array_type, name=sym["name"])
            else:
                if type_f not in self.types:
                    raise Exception("Type not implemented.")
                ptr = self.builder.alloca(self.types[type_f], name=sym["name"])
            sym["ptr"] = ptr
        self._global_scope.symbols["abs"][
            "fn"] = self.module.declare_intrinsic('llvm.fabs',
                                                  [ir.DoubleType()])
        self._global_scope.symbols["sqrt"][
            "fn"] = self.module.declare_intrinsic('llvm.sqrt',
                                                  [ir.DoubleType()])
        self._global_scope.symbols["log"][
            "fn"] = self.module.declare_intrinsic('llvm.log',
                                                  [ir.DoubleType()])

        fn_type = ir.FunctionType(
            ir.DoubleType(),
            [ir.IntType(64), ir.DoubleType().as_pointer()])
        fn_sum = ir.Function(self.module, fn_type, name="_lfort_sum")
        self._global_scope.symbols["sum"]["fn"] = fn_sum
        fn_rand = ir.Function(self.module,
                              fn_type,
                              name="_lfort_random_number")
        self._global_scope.symbols["random_number"]["fn"] = fn_rand

        self.visit_sequence(node.contains)
        self.visit_sequence(node.body)
        self.builder.ret(ir.Constant(ir.IntType(64), 0))
        self._current_scope = node._scope.parent_scope
def initialize():
    '''
    Initalize llvm and module
    Return module
    '''
    llvm.initialize()
    llvm.initialize_native_target()
    llvm.initialize_native_asmprinter()

    module = ir.Module(name="prog")
    module.triple = llvm.get_default_triple()
    return module
Example #17
0
def test_linux64_program_write(capfd):
    source_ll = r"""
@.message = internal constant [14 x i8] c"Hello, world!\0A"

; write(STDOUT, message, message_len)
define i64 @write(i64 %STDOUT, i8* %message, i64 %message_len) {
    %1 = call i64 asm sideeffect "syscall",
        "={rax},{rax},{rdi},{rsi},{rdx},~{rcx},~{r11},~{dirflag},~{fpsr},~{flags}"
        ( i64 1            ; {rax} SYSCALL_WRITE
        , i64 %STDOUT      ; {rdi} STDOUT
        , i8* %message     ; {rsi} message
        , i64 %message_len ; {rdx} message_len
        )
    ret i64 %1
}

; exit(int exit_code)
define void @exit(i64 %exit_code) {
    call i64 asm sideeffect "syscall",
        "={rax},{rax},{rdi},~{rcx},~{r11},~{dirflag},~{fpsr},~{flags}"
        ( i64 60          ; {rax} SYSCALL_EXIT
        , i64 %exit_code  ; {rdi} exit_code
        )
    ret void
}

define void @_start() {
    %message_ptr = getelementptr [14 x i8], [14 x i8]* @.message , i64 0, i64 0

    call i64 @write(i64 1, i8* %message_ptr, i64 14)
    call void @exit(i64 42)
    ret void
}
    """
    with TemporaryDirectory() as tmpdir:
        objfile = os.path.join(tmpdir, "test1.o")
        binfile = os.path.join(tmpdir, "test1")
        llvm.initialize()
        llvm.initialize_native_asmprinter()
        llvm.initialize_native_asmparser()
        llvm.initialize_native_target()
        target = llvm.Target.from_triple(llvm.get_default_triple())
        target_machine = target.create_target_machine()
        mod = llvm.parse_assembly(source_ll)
        mod.verify()
        with open(objfile, "wb") as o:
            o.write(target_machine.emit_object(mod))
        linker(["-o", binfile, objfile])
        r = call("%s" % binfile)
        assert r == 42
        out = capfd.readouterr().out
        assert out == "Hello, world!\n"
def pi_llvm(pi_ast):
    module = ir.Module('main_module')
    module.triple = llvm.get_default_triple()
    func_type = ir.FunctionType(LLVMTypes.INT, [], False)
    func = ir.Function(module, func_type, "main_function")

    llvm_compiler = LLVMDcl(func)

    llvm_compiler.compile(pi_ast)

    llvm_compiler.builder.ret(llvm_compiler.compile(Num(0)))

    return module
Example #19
0
def test_linux64_program():
    """
    This is the simplest assembly program that uses Linux 64bit syscall to
    return an exit value.
    """
    # Named registers are used in the `asm` block, so that LLVM handles
    # register allocation.
    #
    # The calling convention for syscall on x86-64 (see `man syscall`) is to
    # pass the system call number in {rax}, the return value is returned in
    # {rax}, and the system call arguments in:
    #     {rdi},{rsi},{rdx},{r10},{r8},{r9}
    # The syscall kernel call clobbers {rcx} and {r11} registers.
    #
    # The LLVM's `asm` call itself clobbers the following registers:
    #   * {flags} (EFLAGS: status flags register)
    #   * {dirflag} (DF: direction flag; modeled separately from {flags})
    #   * {fpsr} (floating point status register)
    source_ll = r"""
; exit(int exit_code)
define void @exit(i64 %exit_code) {
    call i64 asm sideeffect "syscall",
        "={rax},{rax},{rdi},~{rcx},~{r11},~{dirflag},~{fpsr},~{flags}"
        ( i64 60          ; {rax} SYSCALL_EXIT
        , i64 %exit_code  ; {rdi} exit_code
        )
    ret void
}

define void @_start() {
    call void @exit(i64 42)
    ret void
}
    """
    with TemporaryDirectory() as tmpdir:
        objfile = os.path.join(tmpdir, "test1.o")
        binfile = os.path.join(tmpdir, "test1")
        llvm.initialize()
        llvm.initialize_native_asmprinter()
        llvm.initialize_native_asmparser()
        llvm.initialize_native_target()
        target = llvm.Target.from_triple(llvm.get_default_triple())
        target_machine = target.create_target_machine()
        mod = llvm.parse_assembly(source_ll)
        mod.verify()
        with open(objfile, "wb") as o:
            o.write(target_machine.emit_object(mod))
        linker(["-o", binfile, objfile])
        r = call("%s" % binfile)
        assert r == 42
Example #20
0
 def __init__(self, module_name):
     self.module = ir.Module(module_name)
     self.module.triple = binding.get_default_triple()
     self.module.data_layout = ''
     self.target_data = binding.create_target_data(self.module.data_layout)
     self.builder = None
     self.terminating_return = None
     self.insert_blocks = []
     self.fns = {}
     self.vars = {}
     self.nstrings = 0
     self.zero = self.getint(0)
     self.memset = None
     self.loops = []
Example #21
0
    def initialize_module(self, name):
        # create module
        self.module = ir.Module(name=name)
        self.module.triple = binding.get_default_triple()

        # load builtin I/O functions
        self.load_builtins()

        # create main function
        func_type = ir.FunctionType(ir.VoidType(), [], False)
        base_func = ir.Function(self.module, func_type, name="main")
        block = base_func.append_basic_block(name="entry")

        # create llvm ir builder and set at start of the main block
        self.builder = ir.IRBuilder(block)
Example #22
0
    def _test_record_args(self, revargs):
        """
        Testing scalar record value as argument
        """
        npval = self.refsample1d.copy()[0]
        nbval = self.nbsample1d.copy()[0]
        attrs = "abc"
        valtypes = types.float64, types.int16, types.complex64
        values = 1.23, 12345, 123 + 456j
        old_refcnt = sys.getrefcount(nbval)

        for attr, valtyp, val in zip(attrs, valtypes, values):
            expected = getattr(npval, attr)
            nbrecord = numpy_support.from_dtype(recordtype)

            # Test with a record as either the first argument or the second
            # argument (issue #870)
            if revargs:
                prefix = "get_record_rev_"
                argtypes = (valtyp, nbrecord)
                args = (val, nbval)
            else:
                prefix = "get_record_"
                argtypes = (nbrecord, valtyp)
                args = (nbval, val)

            pyfunc = globals()[prefix + attr]
            cfunc = self.get_cfunc(pyfunc, argtypes)

            got = cfunc(*args)
            try:
                self.assertEqual(expected, got)
            except AssertionError as e:
                # On ARM, a LLVM misoptimization can produce buggy code,
                # see https://llvm.org/bugs/show_bug.cgi?id=24669
                import llvmlite.binding as ll

                if attr != "c":
                    raise
                if ll.get_default_triple() != "armv7l-unknown-linux-gnueabihf":
                    raise
                self.assertEqual(val, got)
            else:
                self.assertEqual(nbval[attr], val)
            del got, expected, args

        # Check for potential leaks (issue #441)
        self.assertEqual(sys.getrefcount(nbval), old_refcnt)
    def _test_record_args(self, revargs):
        """
        Testing scalar record value as argument
        """
        npval = self.refsample1d.copy()[0]
        nbval = self.nbsample1d.copy()[0]
        attrs = "abc"
        valtypes = types.float64, types.int16, types.complex64
        values = 1.23, 12345, 123 + 456j
        old_refcnt = sys.getrefcount(nbval)

        for attr, valtyp, val in zip(attrs, valtypes, values):
            expected = getattr(npval, attr)
            nbrecord = numpy_support.from_dtype(recordtype)

            # Test with a record as either the first argument or the second
            # argument (issue #870)
            if revargs:
                prefix = "get_record_rev_"
                argtypes = (valtyp, nbrecord)
                args = (val, nbval)
            else:
                prefix = "get_record_"
                argtypes = (nbrecord, valtyp)
                args = (nbval, val)

            pyfunc = globals()[prefix + attr]
            cfunc = self.get_cfunc(pyfunc, argtypes)

            got = cfunc(*args)
            try:
                self.assertEqual(expected, got)
            except AssertionError:
                # On ARM, a LLVM misoptimization can produce buggy code,
                # see https://llvm.org/bugs/show_bug.cgi?id=24669
                import llvmlite.binding as ll

                if attr != "c":
                    raise
                if ll.get_default_triple() != "armv7l-unknown-linux-gnueabihf":
                    raise
                self.assertEqual(val, got)
            else:
                self.assertEqual(nbval[attr], val)
            del got, expected, args

        # Check for potential leaks (issue #441)
        self.assertEqual(sys.getrefcount(nbval), old_refcnt)
Example #24
0
    def host(cls, name='host_cpu', strict=False):
        """Return target info for host CPU.
        """
        key = (name, strict)

        target_info = cls._host_target_info_cache.get(key)
        if target_info is not None:
            return target_info

        import llvmlite.binding as ll
        target_info = TargetInfo(name=name, strict=strict)
        target_info.set('name', ll.get_host_cpu_name())
        target_info.set('triple', ll.get_default_triple())
        features = ','.join(['-+'[int(v)] + k
                             for k, v in ll.get_host_cpu_features().items()])
        target_info.set('features', features)

        for tname, ctype in dict(
                bool=ctypes.c_bool,
                size_t=ctypes.c_size_t,
                ssize_t=ctypes.c_ssize_t,
                char=ctypes.c_char,
                uchar=ctypes.c_char,
                schar=ctypes.c_char,
                byte=ctypes.c_byte,
                ubyte=ctypes.c_ubyte,
                wchar=ctypes.c_wchar,
                short=ctypes.c_short,
                ushort=ctypes.c_ushort,
                int=ctypes.c_int,
                uint=ctypes.c_uint,
                long=ctypes.c_long,
                ulong=ctypes.c_ulong,
                longlong=ctypes.c_longlong,
                ulonglong=ctypes.c_ulonglong,
                float=ctypes.c_float,
                double=ctypes.c_double,
                longdouble=ctypes.c_longdouble,
        ).items():
            target_info.type_sizeof[tname] = ctypes.sizeof(ctype)

        cls._host_target_info_cache[key] = target_info
        return target_info
Example #25
0
def make_asm(ir_module):

    # Note: llvmlite does not allow us to do cross-compilation
    # only native compilation is supported.
    # therefore, only use default triple for native code generation

    binding.initialize()
    binding.initialize_native_target()
    binding.initialize_native_asmprinter()
    target = binding.Target.from_triple(binding.get_default_triple())
    target_machine = target.create_target_machine()
    target_machine.set_asm_verbosity(True)

    # necessary in order to generate code from ir module
    mod_ref = binding.parse_assembly(ir_module)
    mod_ref.verify()

    # generate the native assembly code
    asm_code = target_machine.emit_assembly(mod_ref)

    # return asm code as a string
    return asm_code
Example #26
0
def main(verbose=True):
    llvm.initialize()
    llvm.initialize_native_asmprinter()
    llvm.initialize_native_target()

    target = llvm.Target.from_triple(llvm.get_default_triple())
    target_machine = target.create_target_machine()
    target_machine.set_asm_verbosity(True)

    # Empty backing module
    backing_mod = llvm.parse_assembly("")
    backing_mod.verify()
    engine = llvm.create_mcjit_compiler(backing_mod, target_machine)

    print("Interactive Fortran.")
    print("  * Use Ctrl-D to exit.")
    print("  * Use Enter to submit.")
    print("  * Features:")
    print("    - Multi-line editing (use Alt-Enter)")
    print("    - History")
    print("    - Syntax highlighting")
    print()

    fortran_evaluator = FortranEvaluator()

    session = PromptSession('> ',
                            lexer=PygmentsLexer(FortranLexer),
                            multiline=True,
                            key_bindings=kb)
    try:
        while True:
            text = session.prompt()
            if verbose:
                print()
            handle_input(engine, fortran_evaluator, text, verbose)
            if verbose:
                print()
    except EOFError:
        print("Exiting.")
Example #27
0
def run_code(code):
    compiler = Compiler()
    lexer = PLexer()
    tokens = lexer.tokenize(code)
    parser = PParser()
    parser.parse(tokens)
    ast = parser.ast
    ast = ast[1]['body']
    #print(pprint.pformat(ast))
    compiler.compile(ast)
    module = compiler.module

    module.triple = llvm.get_default_triple()
    llvm.initialize()
    llvm.initialize_native_target()
    llvm.initialize_native_asmprinter()

    llvm_ir_parsed = llvm.parse_assembly(str(module))
    llvm_ir_parsed.verify()

    target_machine = llvm.Target.from_default_triple().create_target_machine()
    engine = llvm.create_mcjit_compiler(llvm_ir_parsed, target_machine)
    engine.finalize_object()

    # Run the function with name func_name. This is why it makes sense to have a 'main' function that calls other functions.
    entry = engine.get_function_address('main')
    cfunc = CFUNCTYPE(c_int)(entry)

    print('The llvm IR generated is:')
    print(module)
    print()
    start_time = time()
    result = cfunc()
    end_time = time()

    print(f'It returns {result}')
    print('\nExecuted in {:f} sec'.format(end_time - start_time))
Example #28
0
 def test_name(self):
     t = llvm.Target.from_triple(llvm.get_default_triple())
     u = llvm.Target.from_default_triple()
     self.assertIsInstance(t.name, str)
     self.assertEqual(t.name, u.name)
Example #29
0
from llvmlite import binding as llvm
from llvmlite import ir as lc

llvm.initialize()
llvm.initialize_native_target()
llvm.initialize_native_asmprinter()

mod = lc.Module()
mod.triple = llvm.get_default_triple()
func = lc.Function(mod, lc.FunctionType(lc.VoidType(), [lc.IntType(32)]),
                   name='foo')
builder = lc.IRBuilder(func.append_basic_block())
builder.ret_void()

print(mod)

mod = llvm.parse_assembly(str(mod))

mod.verify()
print(repr(mod))
print(mod)

with llvm.create_module_pass_manager() as pm:
    with llvm.create_pass_manager_builder() as pmb:
        pmb.populate(pm)
    pm.run(mod)

print(mod)

tm = llvm.Target.from_default_triple().create_target_machine()
ee = llvm.create_mcjit_compiler(mod, tm)
Example #30
0
 def __init__(self):
     self.stack = []
     self._mark = []
     self.symboltable = builtins()
     self.module = ir.Module(name="main")
     self.module.triple = binding.get_default_triple()
Example #31
0
 def test_triple(self):
     mod = self.module()
     s = mod.triple
     self.assertEqual(s, llvm.get_default_triple())
     mod.triple = ''
     self.assertEqual(mod.triple, '')
Example #32
0
 def codeGenerate(self,var_ptr_symbolTBL):
    module = ll.Module()
    module.triple = llvm.get_default_triple()
    for ast in self.asts:
       module = ast.codeGenerate(module, var_ptr_symbolTBL)
    return module, cfg_list;
Example #33
0
 def test_get_default_triple(self):
     triple = llvm.get_default_triple()
     self.assertIsInstance(triple, str)
     self.assertTrue(triple)
Example #34
0
 def tli(self):
     return llvm.create_target_library_info(llvm.get_default_triple())
Example #35
0
 def test_str(self):
     target = llvm.Target.from_triple(llvm.get_default_triple())
     s = str(target)
     self.assertIn(target.name, s)
     self.assertIn(target.description, s)
Example #36
0
 def _create_empty_module(self, name):
     ir_module = lc.Module.new(name)
     ir_module.triple = ll.get_default_triple()
     if self._data_layout:
         ir_module.data_layout = self._data_layout
     return ir_module
Example #37
0
 def _create_empty_module(self, name):
     ir_module = lc.Module.new(name)
     ir_module.triple = ll.get_default_triple()
     return ir_module
Example #38
0
 def __init__(self, modulename):
     self.module = ir.Module(name=modulename)
     self.module.triple = llvm.get_default_triple()
     self.currentfunc = None
Example #39
0
 def test_create_target_library_info(self):
     tli = llvm.create_target_library_info(llvm.get_default_triple())
     with tli:
         pass
     tli.close()
Example #40
0
 def test_description(self):
     t = llvm.Target.from_triple(llvm.get_default_triple())
     u = llvm.Target.from_default_triple()
     self.assertIsInstance(t.description, str)
     self.assertEqual(t.description, u.description)
Example #41
0
 def module(self, asm=asm_sum, context=None):
     asm = asm.format(triple=llvm.get_default_triple())
     mod = llvm.parse_assembly(asm, context)
     return mod
Example #42
0
 def test_create_target_machine(self):
     target = llvm.Target.from_triple(llvm.get_default_triple())
     target.create_target_machine('', '', 1, 'default', 'default')