0
我正在做一个类似JIT的事情。我有以下代码:如何将函数指针转换为LLVM值,以便我可以在IR中调用它?
Obj doSomething(Obj o, Selector sel){
...
}
而且我有一个指向这个功能,我的问题是如何包装指针成一个LLVM:Value
,这样我可以将其插入我的IR,用IRBuilder.CreateCall
,怎么办我需要去做?
我正在做一个类似JIT的事情。我有以下代码:如何将函数指针转换为LLVM值,以便我可以在IR中调用它?
Obj doSomething(Obj o, Selector sel){
...
}
而且我有一个指向这个功能,我的问题是如何包装指针成一个LLVM:Value
,这样我可以将其插入我的IR,用IRBuilder.CreateCall
,怎么办我需要去做?
(我明白你的问题是:我有一个C++指针LLVM的功能,我需要创建到一个电话,如果我错了,请澄清它在后或在下面评论)
大多数LLVM类的派生从llvm::Value
,当你做这样的事情
llvm::Function *theFunction = llvm::Function::Create(...);
llvm::Function是llvm::Value
一个子类,你可以在一个CreateCall
Value *result = Builder.CreateCall(theFunction, ...); // This is the call instruction
对于具有void类型的函数,该过程将在[这里]中解释(http://stackoverflow.com/questions/24899568/how-to-call-functions-from-external-dll-using-llvm-irbuilder/ 24937141#24937141)。 但是,您的情况要复杂得多,因为您需要创建正确的类型而不是使用'Type :: getVoidTy'。网上似乎没有任何好的例子可以说明如何做到这一点。如果可能的话,你可以使用指针(void *最好)和一个包装函数来简化情况。 – antipattern 2014-11-04 16:30:10