我正试图编写一个程序来编写一些代码。JITTed代码需要对运行中的应用程序进行调用以获得运行时支持,并且在函数物化时找不到运行时支持符号。
我试着遵循万花筒教程。我需要从一些IR生成的代码中调用运行时的函数。例如,我想从某个llvm调用这个函数。
extern "C" void* llvmNewVector() {
return new vector<int>();
}根据万花筒教程,它应该被宣布出"C“和在运行时的应用程序。在LLVM IR中,我创建了一个函数原型,并正确地生成了IR (在检查我正在退出的函数后没有错误)。
在我看来,要将这个函数链接到跳转代码,还有更多的事情要做,但万花筒教程似乎没有这样做。
我的问题是,由于外部符号没有得到解决,所以跳码无法实现。
下面的代码打印“在这里”,但没有得到更多信息。
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发布于 2020-01-09 18:23:28
我遇到了同样的问题,可以通过以下方式解决:
教程中的以下代码行(其目标是解析主机进程中的符号)似乎不起作用。
ES.getMainJITDylib().setGenerator(
cantFail(DynamicLibrarySearchGenerator::GetForCurrentProcess(DL)));因此,我手动注册了我想要链接的符号,如下所示:
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)));我在教程中提到的两行代码之后添加了这段代码。
发布于 2020-06-23 06:03:07
为clang添加-Xlinker --export-dynamic选项如何?
我在教程中遇到了类似的问题。在我的环境(Ubuntu20.04)中,sin和cos可以被解析,但是printd或putchard (在万花筒处理器源代码中定义的函数)不能被解析。
编译后,您能在程序的动态符号表中看到函数名吗?
objdump -T program | grep llvmNewVector如果objdump (例如Mac)中没有-T选项,则情况可能不是这样。在我的示例中,printd或putchard不出现在动态符号表中(而是出现在符号表中)。
要将这些函数名添加到动态符号表中,您需要传递clang的-Xlinker --export-dynamic选项(实际上,该选项被传递给ld),例如(这是教程中的一个),
clang++ -Xlinker --export-dynamic -g toy.cpp `llvm-config --ldflags --system-libs --libs all` -O3 -o toy编译后,函数名出现在动态符号表中,本教程的示例运行良好。
发布于 2020-07-06 14:47:57
这取决于您使用哪个llvm版本。LLVM 10有LLJIT类,它对我的工作方式如下
auto J = ExitOnErr(LLJITBuilder().create());
auto M = createDemoModule();
auto &dl = J->getDataLayout();
MangleAndInterner Mangle(J->getExecutionSession(), dl);
auto &jd = J->getMainJITDylib();
auto s = absoluteSymbols({{ Mangle("printd"), JITEvaluatedSymbol(pointerToJITTargetAddress(&printd), JITSymbolFlags::Exported)}});
jd.define(s);printd函数在同一个文件中定义。
extern "C" int32_t printd() {
std::cout << "calling " << __FUNCTION__ << "...\n";
return 11;
}https://stackoverflow.com/questions/57612173
复制相似问题