我正在尝试编写一个程序来 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 found: { llvmNewVector }
Failed to materialize symbols: { my_test }
Run Code Online (Sandbox Code Playgroud)
该代码是使用带有以下标志的LLVM-9编译的:
clang++ -I. -g -I../include/ -std=c++11 -fexceptions -fvisibility=hidden -fno-rtti -D_DEBUG -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -MT main.o -MD -MP -MF .deps/main.Tpo -c -o main.o main.cpp
Run Code Online (Sandbox Code Playgroud)
为了链接,使用了以下内容:
llvm-config --libs
Run Code Online (Sandbox Code Playgroud)
小智 4
我遇到了同样的问题,可以通过以下方式解决:
本教程中的以下代码行的目标是解析主机进程中的符号,但似乎不起作用。
ES.getMainJITDylib().setGenerator(
cantFail(DynamicLibrarySearchGenerator::GetForCurrentProcess(DL)));
Run Code Online (Sandbox Code Playgroud)
因此,我手动注册了我想要链接的符号,如下所示:
SymbolMap M;
// Register every symbol that can be accessed from the JIT'ed code.
M[Mangle("llvmNewVector")] = JITEvaluatedSymbol(
pointerToJITTargetAddress(&llvmNewVector), JITSymbolFlags());
}
cantFail(ES.getMainJITDylib().define(absoluteSymbols(M)));
Run Code Online (Sandbox Code Playgroud)
我在上面提到的教程中的两行代码之后添加了此代码。
| 归档时间: |
|
| 查看次数: |
4603 次 |
| 最近记录: |