从LLVM模块获取符号大小

时间:2018-07-17 15:21:02

标签: llvm jit llvm-ir

我正在使用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 ...我不知道它可能从哪里来。

有人知道什么可能导致此行为,以及如何解决该问题的想法吗?

非常感谢。

0 个答案:

没有答案