我正在尝试编写一个程序来JIT一些代码。 JIT的代码需要调用正在运行的应用程序进行运行时支持,但是当函数实例化时找不到运行时支持符号。
我尝试遵循Kaleidoscope教程。我需要从一些生成的IR代码中调用运行时中的函数。例如,我想从一些llvm IR中调用此函数。
extern "C" void* llvmNewVector() {
return new vector<int>();
}
根据万花筒教程,应该在应用程序运行时将其声明为extern "C"。我已经创建了一个函数原型并正确地生成了IR(在检查我正在jit的函数后没有错误)。
对我来说似乎还有更多工作要做,以将此函数链接到jit代码,但是Kaleidoscope教程似乎并没有这样做。
我的问题是,由于外部符号未解析,jit代码无法实现。以下代码会打印“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;
我相信我在做某些事情时出了问题或者漏掉了某些步骤,但我一直没有找到。
我得到的输出是:
made it here.
JIT session error: Symbols not found: { llvmNewVector }
Failed to materialize symbols: { my_test }
使用以下标志编译了代码: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
以下是所使用的链接:
llvm-config --libs