在C中执行LLVM IR代码

在C中执行LLVM IR代码,c,llvm,clang,llvm-ir,C,Llvm,Clang,Llvm Ir,我一直在试图弄清楚如何基本上获取一部分LLVM IR代码并在C中内联执行。我希望能够内联IR代码,这样就不需要虚拟函数调用(与使用\u 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 } for

我一直在试图弄清楚如何基本上获取一部分LLVM IR代码并在C中内联执行。我希望能够内联IR代码,这样就不需要虚拟函数调用(与使用\u 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
}
for(i=0;i

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

首先,没有涉及虚拟函数-C没有这样的概念。我想你的意思是一个间接函数调用,也就是说,获取一个函数指针并调用它所指向的函数

简单的回答是,不,没有直接的方法将LLVM IR嵌入C并用代码编译:。正如我在这里提到的,如果您想允许程序员编写LLVM IR,并且仍然坚持直接函数调用,那么应该将IR封装在函数中,并将其放在单独的文件中

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

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

你们在说什么“虚拟调用”?用于(i=0;i)的