我一直在试图弄清楚如何基本上获取一部分 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
}

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

最佳答案

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

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

如果嵌入 IR 比性能更重要,则必须使用 ParseIR() 路由(不需要 ParseIRFile() - 您可以直接从内存中解析)。

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

关于c - 在 C 中执行 LLVM IR 代码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16204665/

10-11 22:46