没有调用“llvm::orc::ExecutorSymbolDef::ExecutorSymbolDef(llvm::JITEvaluatedSymbol&)”的匹配函数

问题描述 投票:0回答:1

我正在尝试构建一个工具。它支持 LLVM 15.0.7。但是当我尝试使用 LLVM 19 构建它时,出现以下错误。我想查明并理解发生错误的原因,以及我应该修改哪个文件以构建无错误的工具。 日志:

/home/pegasus/Documents/llvm-project/llvm/include/llvm/ExecutionEngine/Orc/LLJIT.h:476:27: note: remove ‘std::move’ call
In file included from /home/pegasus/Documents/llvm-project/llvm/include/llvm/ADT/DenseSet.h:17,
                 from /home/pegasus/Documents/llvm-project/llvm/include/llvm/IR/Function.h:20,
                 from /home/pegasus/Documents/llvm-project/llvm/include/llvm/IR/Module.h:25,
                 from /home/pegasus/Documents/llvm-project/llvm/include/llvm/ExecutionEngine/ExecutionEngine.h:24,
                 from /home/pegasus/Documents/llvm-project/llvm/include/llvm/ExecutionEngine/MCJIT.h:17,
                 from /home/pegasus/Documents/bpftime/vm/llvm-jit/src/llvm/llvm_jit_context.cpp:17:
/home/pegasus/Documents/llvm-project/llvm/include/llvm/ADT/DenseMap.h: In instantiation of ‘BucketT* llvm::DenseMapBase<DerivedT, KeyT, ValueT, KeyInfoT, BucketT>::InsertIntoBucket(BucketT*, KeyArg&&, ValueArgs&& ...) [with KeyArg = const llvm::orc::SymbolStringPtr&; ValueArgs = {llvm::JITEvaluatedSymbol&}; DerivedT = llvm::DenseMap<llvm::orc::SymbolStringPtr, llvm::orc::ExecutorSymbolDef>; KeyT = llvm::orc::SymbolStringPtr; ValueT = llvm::orc::ExecutorSymbolDef; KeyInfoT = llvm::DenseMapInfo<llvm::orc::SymbolStringPtr>; BucketT = llvm::detail::DenseMapPair<llvm::orc::SymbolStringPtr, llvm::orc::ExecutorSymbolDef>]’:
/home/pegasus/Documents/llvm-project/llvm/include/llvm/ADT/DenseMap.h:271:33:   required from ‘std::pair<llvm::DenseMapIterator<KeyT, ValueT, KeyInfoT, BucketT>, bool> llvm::DenseMapBase<DerivedT, KeyT, ValueT, KeyInfoT, BucketT>::try_emplace(const KeyT&, Ts&& ...) [with Ts = {llvm::JITEvaluatedSymbol&}; DerivedT = llvm::DenseMap<llvm::orc::SymbolStringPtr, llvm::orc::ExecutorSymbolDef>; KeyT = llvm::orc::SymbolStringPtr; ValueT = llvm::orc::ExecutorSymbolDef; KeyInfoT = llvm::DenseMapInfo<llvm::orc::SymbolStringPtr>; BucketT = llvm::detail::DenseMapPair<llvm::orc::SymbolStringPtr, llvm::orc::ExecutorSymbolDef>]’
/home/pegasus/Documents/bpftime/vm/llvm-jit/src/llvm/llvm_jit_context.cpp:319:26:   required from here
/home/pegasus/Documents/llvm-project/llvm/include/llvm/ADT/DenseMap.h:577:5: error: no matching function for call to ‘llvm::orc::ExecutorSymbolDef::ExecutorSymbolDef(llvm::JITEvaluatedSymbol&)’
  577 |     ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
      |     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /home/pegasus/Documents/llvm-project/llvm/include/llvm/ExecutionEngine/Orc/Shared/TargetProcessControlTypes.h:22,
                 from /home/pegasus/Documents/llvm-project/llvm/include/llvm/ExecutionEngine/Orc/ExecutorProcessControl.h:19,
                 from /home/pegasus/Documents/llvm-project/llvm/include/llvm/ExecutionEngine/Orc/Core.h:22:
/home/pegasus/Documents/llvm-project/llvm/include/llvm/ExecutionEngine/Orc/Shared/ExecutorSymbolDef.h:27:3: note: candidate: ‘llvm::orc::ExecutorSymbolDef::ExecutorSymbolDef(llvm::orc::ExecutorAddr, llvm::JITSymbolFlags)’
   27 |   ExecutorSymbolDef(ExecutorAddr Addr, JITSymbolFlags Flags)
      |   ^~~~~~~~~~~~~~~~~
/home/pegasus/Documents/llvm-project/llvm/include/llvm/ExecutionEngine/Orc/Shared/ExecutorSymbolDef.h:27:3: note:   candidate expects 2 arguments, 1 provided
/home/pegasus/Documents/llvm-project/llvm/include/llvm/ExecutionEngine/Orc/Shared/ExecutorSymbolDef.h:26:3: note: candidate: ‘constexpr llvm::orc::ExecutorSymbolDef::ExecutorSymbolDef()’
   26 |   ExecutorSymbolDef() = default;
      |   ^~~~~~~~~~~~~~~~~
/home/pegasus/Documents/llvm-project/llvm/include/llvm/ExecutionEngine/Orc/Shared/ExecutorSymbolDef.h:26:3: note:   candidate expects 0 arguments, 1 provided
/home/pegasus/Documents/llvm-project/llvm/include/llvm/ExecutionEngine/Orc/Shared/ExecutorSymbolDef.h:24:7: note: candidate: ‘constexpr llvm::orc::ExecutorSymbolDef::ExecutorSymbolDef(const llvm::orc::ExecutorSymbolDef&)’
   24 | class ExecutorSymbolDef {
      |       ^~~~~~~~~~~~~~~~~
/home/pegasus/Documents/llvm-project/llvm/include/llvm/ExecutionEngine/Orc/Shared/ExecutorSymbolDef.h:24:7: note:   no known conversion for argument 1 from ‘llvm::JITEvaluatedSymbol’ to ‘const llvm::orc::ExecutorSymbolDef&’
/home/pegasus/Documents/llvm-project/llvm/include/llvm/ExecutionEngine/Orc/Shared/ExecutorSymbolDef.h:24:7: note: candidate: ‘constexpr llvm::orc::ExecutorSymbolDef::ExecutorSymbolDef(llvm::orc::ExecutorSymbolDef&&)’
/home/pegasus/Documents/llvm-project/llvm/include/llvm/ExecutionEngine/Orc/Shared/ExecutorSymbolDef.h:24:7: note:   no known conversion for argument 1 from ‘llvm::JITEvaluatedSymbol’ to ‘llvm::orc::ExecutorSymbolDef&&’
/home/pegasus/Documents/llvm-project/llvm/include/llvm/ADT/DenseMap.h: In instantiation of ‘BucketT* llvm::DenseMapBase<DerivedT, KeyT, ValueT, KeyInfoT, BucketT>::InsertIntoBucket(BucketT*, KeyArg&&, ValueArgs&& ...) [with KeyArg = llvm::orc::SymbolStringPtr; ValueArgs = {llvm::JITEvaluatedSymbol&}; DerivedT = llvm::DenseMap<llvm::orc::SymbolStringPtr, llvm::orc::ExecutorSymbolDef>; KeyT = llvm::orc::SymbolStringPtr; ValueT = llvm::orc::ExecutorSymbolDef; KeyInfoT = llvm::DenseMapInfo<llvm::orc::SymbolStringPtr>; BucketT = llvm::detail::DenseMapPair<llvm::orc::SymbolStringPtr, llvm::orc::ExecutorSymbolDef>]’:
/home/pegasus/Documents/llvm-project/llvm/include/llvm/ADT/DenseMap.h:247:25:   required from ‘std::pair<llvm::DenseMapIterator<KeyT, ValueT, KeyInfoT, BucketT>, bool> llvm::DenseMapBase<DerivedT, KeyT, ValueT, KeyInfoT, BucketT>::try_emplace(KeyT&&, Ts&& ...) [with Ts = {llvm::JITEvaluatedSymbol&}; DerivedT = llvm::DenseMap<llvm::orc::SymbolStringPtr, llvm::orc::ExecutorSymbolDef>; KeyT = llvm::orc::SymbolStringPtr; ValueT = llvm::orc::ExecutorSymbolDef; KeyInfoT = llvm::DenseMapInfo<llvm::orc::SymbolStringPtr>; BucketT = llvm::detail::DenseMapPair<llvm::orc::SymbolStringPtr, llvm::orc::ExecutorSymbolDef>]’
/home/pegasus/Documents/bpftime/vm/llvm-jit/src/llvm/llvm_jit_context.cpp:340:24:   required from here
/home/pegasus/Documents/llvm-project/llvm/include/llvm/ADT/DenseMap.h:577:5: error: no matching function for call to ‘llvm::orc::ExecutorSymbolDef::ExecutorSymbolDef(llvm::JITEvaluatedSymbol&)’
  577 |     ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
      |     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/pegasus/Documents/llvm-project/llvm/include/llvm/ExecutionEngine/Orc/Shared/ExecutorSymbolDef.h:27:3: note: candidate: ‘llvm::orc::ExecutorSymbolDef::ExecutorSymbolDef(llvm::orc::ExecutorAddr, llvm::JITSymbolFlags)’
   27 |   ExecutorSymbolDef(ExecutorAddr Addr, JITSymbolFlags Flags)
      |   ^~~~~~~~~~~~~~~~~
/home/pegasus/Documents/llvm-project/llvm/include/llvm/ExecutionEngine/Orc/Shared/ExecutorSymbolDef.h:27:3: note:   candidate expects 2 arguments, 1 provided
/home/pegasus/Documents/llvm-project/llvm/include/llvm/ExecutionEngine/Orc/Shared/ExecutorSymbolDef.h:26:3: note: candidate: ‘constexpr llvm::orc::ExecutorSymbolDef::ExecutorSymbolDef()’
   26 |   ExecutorSymbolDef() = default;
      |   ^~~~~~~~~~~~~~~~~
/home/pegasus/Documents/llvm-project/llvm/include/llvm/ExecutionEngine/Orc/Shared/ExecutorSymbolDef.h:26:3: note:   candidate expects 0 arguments, 1 provided
/home/pegasus/Documents/llvm-project/llvm/include/llvm/ExecutionEngine/Orc/Shared/ExecutorSymbolDef.h:24:7: note: candidate: ‘constexpr llvm::orc::ExecutorSymbolDef::ExecutorSymbolDef(const llvm::orc::ExecutorSymbolDef&)’
   24 | class ExecutorSymbolDef {
      |       ^~~~~~~~~~~~~~~~~
/home/pegasus/Documents/llvm-project/llvm/include/llvm/ExecutionEngine/Orc/Shared/ExecutorSymbolDef.h:24:7: note:   no known conversion for argument 1 from ‘llvm::JITEvaluatedSymbol’ to ‘const llvm::orc::ExecutorSymbolDef&’
/home/pegasus/Documents/llvm-project/llvm/include/llvm/ExecutionEngine/Orc/Shared/ExecutorSymbolDef.h:24:7: note: candidate: ‘constexpr llvm::orc::ExecutorSymbolDef::ExecutorSymbolDef(llvm::orc::ExecutorSymbolDef&&)’
/home/pegasus/Documents/llvm-project/llvm/include/llvm/ExecutionEngine/Orc/Shared/ExecutorSymbolDef.h:24:7: note:   no known conversion for argument 1 from ‘llvm::JITEvaluatedSymbol’ to ‘llvm::orc::ExecutorSymbolDef&&’
/usr/bin/cmake: /usr/local/lib/libcurl.so.4: no version information available (required by /usr/bin/cmake)
[ 80%] Linking CXX executable bpftime_frida_uprobe_attach_tests
/usr/bin/cmake: /usr/local/lib/libcurl.so.4: no version information available (required by /usr/bin/cmake)
/usr/bin/cmake: /usr/local/lib/libcurl.so.4: no version information available (required by /usr/bin/cmake)
[ 80%] Linking CXX executable bpftime_syscall_trace_attach_tests
/usr/bin/cmake: /usr/local/lib/libcurl.so.4: no version information available (required by /usr/bin/cmake)
gmake[3]: Leaving directory '/home/pegasus/Documents/bpftime/build'
/usr/bin/cmake: /usr/local/lib/libcurl.so.4: no version information available (required by /usr/bin/cmake)
[ 80%] Built target bpftime_syscall_trace_attach_tests
gmake[3]: Leaving directory '/home/pegasus/Documents/bpftime/build'
/usr/bin/cmake: /usr/local/lib/libcurl.so.4: no version information available (required by /usr/bin/cmake)
[ 80%] Built target bpftime_frida_uprobe_attach_tests
/usr/bin/cmake: /usr/local/lib/libcurl.so.4: no version information available (required by /usr/bin/cmake)
[ 80%] Linking CXX executable bpftime
/usr/bin/cmake: /usr/local/lib/libcurl.so.4: no version information available (required by /usr/bin/cmake)
gmake[3]: *** [vm/llvm-jit/CMakeFiles/vm-bpf.dir/build.make:90: vm/llvm-jit/CMakeFiles/vm-bpf.dir/src/llvm/llvm_jit_context.cpp.o] Error 1
gmake[3]: Leaving directory '/home/pegasus/Documents/bpftime/build'
gmake[2]: *** [CMakeFiles/Makefile2:852: vm/llvm-jit/CMakeFiles/vm-bpf.dir/all] Error 2
gmake[2]: *** Waiting for unfinished jobs....
/usr/bin/ld: warning: generated-config_archs_linux-x86_64_asm_crypto_whrlpool_wp-x86_64.s.o: missing .note.GNU-stack section implies executable stack
/usr/bin/ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
gmake[3]: Leaving directory '/home/pegasus/Documents/bpftime/build'
/usr/bin/cmake: /usr/local/lib/libcurl.so.4: no version information available (required by /usr/bin/cmake)
[ 80%] Built target bpftime-cli-cpp
gmake[2]: Leaving directory '/home/pegasus/Documents/bpftime/build'
gmake[1]: *** [Makefile:156: all] Error 2
gmake[1]: Leaving directory '/home/pegasus/Documents/bpftime/build'
make: *** [Makefile:62: release] Error 2

llvm_jit_context的319行是

    // Create a JIT builder
    SPDLOG_DEBUG("LLVM-JIT: Creating LLJIT instance");
    auto jit = ExitOnErr(LLJITBuilder().create());

    auto &mainDylib = jit->getMainJITDylib();
    std::vector<std::string> extFuncNames;
    // insert the helper functions
    SymbolMap extSymbols;
    for (uint32_t i = 0; i < std::size(vm->ext_funcs); i++) {
        if (vm->ext_funcs[i] != nullptr) {
            auto sym = JITEvaluatedSymbol::fromPointer(
                vm->ext_funcs[i]);
            auto symName = jit->getExecutionSession().intern(
                ext_func_sym(i));
            sym.setFlags(JITSymbolFlags::Callable |
                     JITSymbolFlags::Exported);
        --->    extSymbols.try_emplace(symName, sym);
            extFuncNames.push_back(ext_func_sym(i));
        }
    }

Densemap.h的第577行是

  template <typename KeyArg, typename... ValueArgs>
  BucketT *InsertIntoBucket(BucketT *TheBucket, KeyArg &&Key,
                            ValueArgs &&... Values) {
    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);

    TheBucket->getFirst() = std::forward<KeyArg>(Key);
   ---> ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
    return TheBucket;
  }
c++ cmake makefile build llvm
1个回答
0
投票

自 LLVM 17 起。函数签名已更改。

auto sym = JITEvaluatedSymbol::fromPointer(
                vm->ext_funcs[i]->fn);

这就是错误的原因。 将其替换为

auto symbol = ::llvm::orc::ExecutorSymbolDef (::llvm::orc::ExecutorAddr (sym.getAddress()), sym.getFlags());

解决了问题

extSymbols.try_emplace(symName, symbol);

而不是

extSymbols.try_emplace(symName, symb);

更新后的总代码:

    std::vector<std::string> extFuncNames;
    // insert the helper functions
    SymbolMap extSymbols;
    for (uint32_t i = 0; i < std::size(vm->ext_funcs); i++) {
        if (vm->ext_funcs[i].has_value()) {
            auto sym = JITEvaluatedSymbol::fromPointer(
                vm->ext_funcs[i]->fn);
            auto symName = jit->getExecutionSession().intern(
                ext_func_sym(i));
            sym.setFlags(JITSymbolFlags::Callable |
                     JITSymbolFlags::Exported);
            

        #if LLVM_VERSION_MAJOR < 17
            extSymbols.try_emplace(symName, sym);
            extFuncNames.push_back(ext_func_sym(i));
        #else
            auto symbol = ::llvm::orc::ExecutorSymbolDef (::llvm::orc::ExecutorAddr (sym.getAddress()), sym.getFlags());
            extSymbols.try_emplace(symName, symbol);
            extFuncNames.emplace_back(ext_func_sym(i));
        #endif
            
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.