代码之家  ›  专栏  ›  技术社区  ›  agg212

在C中执行LLVM IR代码

  •  3
  • agg212  · 技术社区  · 11 年前

    我一直在试图弄清楚如何基本上获取LLVM IR代码的一部分并执行它 内联 在C中,我希望能够内联IR代码,这样就不需要虚拟函数调用(与使用 _asm{} ). 请参见以下示例:

    要执行的LLVM IR代码:

    define i64 @square(i64 %x){
        %y = mul i64 %x, %x
        ret i64 %y
    }
    

    C程序:

    for(i = 0; i < length; i++){
       //run LLVM IR Code here
    }
    

    我知道我可以在使用时读取IR代码 parseIRFile() 并创建一个指向函数的指针,但这不是我想要的,因为需要虚拟函数调用。

    1 回复  |  直到 11 年前
        1
  •  2
  •   Community Dai    7 年前

    首先,不涉及虚拟函数——C没有这样的概念。我认为你的意思是 间接的 函数调用,即获取一个函数指针并调用它所指向的函数。

    简短的回答是 ,没有简单的方法可以将LLVM IR嵌入到C中并使其与代码一起编译: see this related question and my answer 。正如我在那里提到的,如果你想让程序员编写LLVM IR,并且仍然坚持直接的函数调用,你应该将IR封装在一个函数中,并将其放在一个单独的文件中。

    如果嵌入IR比性能更重要,那么您必须使用 ParseIR() 路线(无需 ParseIRFile() -您可以直接从内存中进行解析)。

    我想您可以在构建过程中引入一些脚本,该脚本采用混合C/IR输入文件,将其拆分为两个文件,然后将它们编译在一起,并适当地修改IR中的调试信息,使其表现得像真正嵌入到C文件中一样。但这是一种非常棘手的方法,无论哪种方式,输入文件都不会是合法的C文件。