从C++中的嵌入式LLVM生成二进制代码(共享库)

San*_*jit 13 c++ llvm llvm-ir llvm-c++-api

我正在研究用C++编写的高性能系统.该过程需要能够在运行时理解一些使用为此应用程序开发的简单语言编写的复杂逻辑(规则).我们有两种选择:

  1. 解释逻辑 - 运行嵌入式解释器并生成动态函数调用,当接收数据时,基于解释逻辑处理数据

  2. 将逻辑编译成plugin.so动态共享文件,使用dlopen,dlsym加载插件并在运行时调用逻辑函数

选项2看起来非常有吸引力,因为它将是优化的机器代码,在运行过程中运行速度比嵌入式解释器快得多.

我正在探索的选项是:

    • 编写一个编译方法字符串编译(字符串逻辑,列表和错误,列表和警告)
    • 这里输入逻辑是一个包含用我们的自定义语言编码的逻辑的字符
    • 它生成llvm ir,compile方法的返回值返回ir字符串
    • 写链接方法bool link(string ir,string filename,list&errors,list&warnings)
    • 对于链接方法我搜索llvm文档,但我还没有找到是否有可能写这样的方法

    如果我是正确的,LLVM IR将转换为LLVM字节代码或汇编代码.然后使用LLVM JIT在JIT模式下运行或使用GNU Assembler用于生成本机代码.

    是否有可能在LLVM中找到这样做的功能?如果它是从代码中完成的,而不是使用来自C++的系统命令来调用"as"来生成我的需求的plugin.so文件,那将会更好.

    如果您知道我可以在运行时从我的进程生成共享库本机二进制代码的任何方法,请通知我.

    小智 3

    llc 是一个 llvm 工具,可以将 LLVM-IR 转换为二进制代码。我想这就是你所需要的。

    基本上,您可以按照您想要的方式生成 LLVM IR,然后通过 IR 调用 llc。

    您可以从命令行调用它,也可以转到 llc 的实现并了解它是如何在您自己的程序中执行此操作的。

    这是一个有用的链接:

    http://llvm.org/docs/CommandGuide/llc.html

    我希望它有帮助。

    • llc 是汇编器/编译器,而不是链接器。它产生 .asm 或 .obj 输出。它不生成可加载库(.dll 或 .so)。 (4认同)
    • 感谢肖恩的评论,它解决了我的问题。嵌入式 JIT 是迄今为止我发现的最佳选择。 (2认同)