在C中执行LLVM IR代码

时间:2013-04-25 00:51:16

标签: c llvm clang llvm-ir

我一直在试图弄清楚如何基本上采用LLVM IR代码的一部分并在C中执行 inline 。我希望能够内联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代码并创建一个指向该函数的指针,但这不是我想要的,因为需要进行虚函数调用。

1 个答案:

答案 0 :(得分:2)

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

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

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

我想你可以在你的构建过程中引入一些脚本,它需要一个混合的C / IR输入文件,将它分成两个文件,然后将它们编译在一起,并适当地修改IR中的调试信息,就好像它一样真正嵌入在C文件中。但这是一种非常hacky的方法,无论哪种方式,输入文件都不是合法的C文件。