在llvmlite中链接C

Bat*_*ata 5 c python compiler-construction llvm llvmlite

我用Python编写了一个编译器,llvmlite用于生成中间LLVM IR。Lexer和解析器已完成,现在我正在执行代码生成。编译器将是动态的且类型微弱的,因此我将需要在运行时做一些事情,例如分配。为此,我已经在C语言中实现了一些功能,现在我想使用builder.callllvmlite 调用这些功能。

我还没有找到文档或如何执行此操作的示例。

这个函数只是一个简单的例子,实际的函数要大得多。

C:

int some_function(int a)
{
     return a + 4;
}
Run Code Online (Sandbox Code Playgroud)

蟒蛇:

...

    main_ty = ir.FunctionType(ir.IntType(32), [])
    func = ir.Function(module, main_ty, 'main')
    block = func.append_basic_block('entry')
    builder = ir.IRBuilder(block)

    # I want to do something like this...

    ret = builder.call(some_function, [ir.Constant(ir.IntType(32), 34)]);

...
Run Code Online (Sandbox Code Playgroud)

我可以使用llvmlite构建器直接编写函数,但是用C语言可以更加快捷,简洁和方便。欢迎任何帮助!

小智 5

您可以导入包含运行时的动态库。

llvmlite.binding.load_library_permanently("runtime.so")
Run Code Online (Sandbox Code Playgroud)

然后你可以简单地生成正常的函数调用。