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

时间:2014-04-09 08:22:35

标签: c++ llvm llvm-ir llvm-c++-api

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

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

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

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

    我正在探索的选项是:

    • 编写编译方法字符串编译(字符串逻辑,列表和错误,列表和警告)
    • 此处输入逻辑是包含以我们的自定义语言编码的逻辑的字符串
    • 它生成llvm ir,编译方法的返回值返回ir string
    • 编写链接方法bool链接(字符串ir,字符串文件名,列表和错误,列表和警告)
    • 对于链接方法,我搜索了llvm文档,但我无法找出是否有可能编写这样的方法

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

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

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

1 个答案:

答案 0 :(得分:3)

llc这是一个llvm工具,它将LLVM-IR用于二进制代码转换。我认为这就是你所需要的一切。

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

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

这是一个有用的链接:

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

我希望它有所帮助。