未找到 LLVM JIT 符号

Ken*_*Lee 5 c++ jit llvm

我正在尝试编写一个程序来 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)

我在上面提到的教程中的两行代码之后添加了此代码。