我正在尝试编写一个程序来 JIT 一些代码。JITTed 代码需要回调正在运行的应用程序以获得运行时支持,并且在实现函数时找不到运行时支持符号。
我尝试遵循万花筒教程。我需要在运行时从一些 IR 生成的代码中调用函数。例如,我想从一些 llvm IR 调用这个函数。
extern "C" void* llvmNewVector() {
return new vector<int>();
}
Run Code Online (Sandbox Code Playgroud)
根据 Kaleidscope 教程,它应该在应用程序的运行时声明为 extern“C”。在 LLVM IR 中,我创建了一个函数原型,并且正确生成了 IR(检查我正在执行的函数后没有错误)。
在我看来,需要做更多的事情才能将此函数链接到 jitted 代码,但 Kaleidoscopy 教程似乎并没有这样做。
我的问题是,由于外部符号未解析,因此抖动代码无法实现。
以下代码打印“made it here”,但没有进一步说明。
cerr << "made it here." << endl;
auto Sym = ExitOnErr(TheJIT->lookup(name));
NativeCodePtr FP = (NativeCodePtr)Sym.getAddress();
assert(FP && "Failed to find function ");
cerr << "returning jitted function " << name << endl;
return FP;
Run Code Online (Sandbox Code Playgroud)
我确信我做错了什么或错过了某些步骤,但我一直无法找到它。
我得到的输出是:
made it here.
JIT session error: Symbols not …Run Code Online (Sandbox Code Playgroud)