我正在使用LLVM JIT,遇到一个我不知道如何解决的问题,而且似乎没有关于我想做的文件。
因此,我们的想法是解析LLVM IR文件并进行编译。有用。但是我想在IR模块中检索给定符号的大小。为此,我想到了以下代码:
uint64_t getSymbolSizeInModule(const std::string symbol, std::unique_ptr<llvm::Module>& module) {
// Retrieve compiler used by JIT.
auto compiler = compileLayer.getCompiler();
// Convert IR Module to ObjectFile
auto objFile = compiler(*module);
auto symbolStringRef = new llvm::StringRef(symbol);
auto sizes = llvm::object::computeSymbolSizes(*objFile.getBinary());
for (auto pair : sizes) {
auto symbolRef = std::get<0>(pair);
auto size = std::get<1>(pair);
if (symbolRef.getName()->equals(*symbolStringRef)) {
return size;
}
}
return 0;
}
问题是将IR模块转换为ObjectFile时出现段错误。 FWIW,我通过在调用getSymbolSizeInModule
之前检索符号地址并执行它来验证该模块是否有效。
以下是valgrind
的输出:
==14847== Invalid read of size 8
==14847== at 0x5CCCDF7: ??? (in /usr/lib/x86_64-linux-gnu/libLLVM-6.0.so.1)
==14847== by 0x5BE0FA1: llvm::FPPassManager::doInitialization(llvm::Module&) (in /usr/lib/x86_64-linux-gnu/libLLVM-6.0.so.1)
==14847== by 0x5BEC219: llvm::legacy::PassManagerImpl::run(llvm::Module&) (in /usr/lib/x86_64-linux-gnu/libLLVM-6.0.so.1)
==14847== by 0x40333FE: llvm::orc::JIT::getSymbolSizeInModule(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::unique_ptr<llvm::Module, std::default_delete<llvm::Module> >&) (in /home/vagrant/libjit.so)
==14847== Address 0x20 is not stack'd, malloc'd or (recently) free'd
似乎在PassManager初始化时,它尝试访问地址0x20
...我不知道它可能从哪里来。
有人知道什么可能导致此行为,以及如何解决该问题的想法吗?
非常感谢。