[llvm-dev] LLVMOrcLLJITLookup crashing (segfault)

Georgiy Lebedev via llvm-dev
Sun, 18 Jul 2021 14:00:06 -0000

Hi!

I am trying to utilize the Orcv2 C API. Everything goes smooth, initialized
and well-formed (at least I assert for null pointers everywhere), till the
point I try to lookup a symbol with LLVMOrcLLJITLookup: I receive a SIGSEGV.

Providing the backtrace:

* thread #1, name = 'tarantool', stop reason = signal SIGSEGV: invalid
address (fault address: 0x0)
  * frame #0: 0x0000000001a88db0
tarantool`llvm::LLVMContext::getDiagHandlerPtr() const
    frame #1: 0x0000000001a959d4
tarantool`llvm::legacy::PassManagerImpl::run(llvm::Module&) + 628
    frame #2: 0x0000000000c5fa0e
tarantool`llvm::orc::SimpleCompiler::operator()(llvm::Module&) + 366
    frame #3: 0x0000000000c6fd4e tarantool`decltype(auto)
llvm::orc::ThreadSafeModule::withModuleDo<llvm::orc::IRCompileLayer::IRCompiler&>(llvm::orc::IRCompileLayer::IRCompiler&)
+ 94
    frame #4: 0x0000000000c6fa05
tarantool`llvm::orc::IRCompileLayer::emit(std::unique_ptr<llvm::orc::MaterializationResponsibility,
std::default_delete<llvm::orc::MaterializationResponsibility> >,
llvm::orc::ThreadSafeModule) + 37
    frame #5: 0x0000000000c6fff7
tarantool`llvm::orc::IRTransformLayer::emit(std::unique_ptr<llvm::orc::MaterializationResponsibility,
std::default_delete<llvm::orc::MaterializationResponsibility> >,
llvm::orc::ThreadSafeModule) + 199
    frame #6: 0x0000000000c6fff7
tarantool`llvm::orc::IRTransformLayer::emit(std::unique_ptr<llvm::orc::MaterializationResponsibility,
std::default_delete<llvm::orc::MaterializationResponsibility> >,
llvm::orc::ThreadSafeModule) + 199
    frame #7: 0x0000000000c396a2
tarantool`llvm::orc::BasicIRLayerMaterializationUnit::materialize(std::unique_ptr<llvm::orc::MaterializationResponsibility,
std::default_delete<llvm::orc::MaterializationResponsibility> >) + 274
    frame #8: 0x0000000000c1fb4b
tarantool`llvm::orc::ExecutionSession::materializeOnCurrentThread(std::unique_ptr<llvm::orc::MaterializationUnit,
std::default_delete<llvm::orc::MaterializationUnit> >,
std::unique_ptr<llvm::orc::MaterializationResponsibility,
std::default_delete<llvm::orc::MaterializationResponsibility> >) + 27
    frame #9: 0x0000000000c29a61 tarantool`std::_Function_handler<void
(std::unique_ptr<llvm::orc::MaterializationUnit,
std::default_delete<llvm::orc::MaterializationUnit> >,
std::unique_ptr<llvm::orc::MaterializationResponsibility,
std::default_delete<llvm::orc::MaterializationResponsibility> >), void
(*)(std::unique_ptr<llvm::orc::MaterializationUnit,
std::default_delete<llvm::orc::MaterializationUnit> >,
std::unique_ptr<llvm::orc::MaterializationResponsibility,
std::default_delete<llvm::orc::MaterializationResponsibility>
>)>::_M_invoke(std::_Any_data const&,
std::unique_ptr<llvm::orc::MaterializationUnit,
std::default_delete<llvm::orc::MaterializationUnit> >&&,
std::unique_ptr<llvm::orc::MaterializationResponsibility,
std::default_delete<llvm::orc::MaterializationResponsibility>
>&&) + 49
    frame #10: 0x0000000000c20d31
tarantool`llvm::orc::ExecutionSession::dispatchOutstandingMUs() + 353
    frame #11: 0x0000000000c23327
tarantool`llvm::orc::ExecutionSession::OL_completeLookup(std::unique_ptr<llvm::orc::InProgressLookupState,
std::default_delete<llvm::orc::InProgressLookupState> >,
std::shared_ptr<llvm::orc::AsynchronousSymbolQuery>, std::function<void
(llvm::DenseMap<llvm::orc::JITDylib*,
llvm::DenseSet<llvm::orc::SymbolStringPtr,
llvm::DenseMapInfo<llvm::orc::SymbolStringPtr> >,
llvm::DenseMapInfo<llvm::orc::JITDylib*>,
llvm::detail::DenseMapPair<llvm::orc::JITDylib*,
llvm::DenseSet<llvm::orc::SymbolStringPtr,
llvm::DenseMapInfo<llvm::orc::SymbolStringPtr> > > >
const&)>) + 4711
    frame #12: 0x0000000000c308fb
tarantool`llvm::orc::InProgressFullLookupState::complete(std::unique_ptr<llvm::orc::InProgressLookupState,
std::default_delete<llvm::orc::InProgressLookupState> >) + 251
    frame #13: 0x0000000000c14a0a
tarantool`llvm::orc::ExecutionSession::OL_applyQueryPhase1(std::unique_ptr<llvm::orc::InProgressLookupState,
std::default_delete<llvm::orc::InProgressLookupState> >, llvm::Error) +
2010
    frame #14: 0x0000000000c12c8c
tarantool`llvm::orc::ExecutionSession::lookup(llvm::orc::LookupKind,
std::vector<std::pair<llvm::orc::JITDylib*,
llvm::orc::JITDylibLookupFlags>,
std::allocator<std::pair<llvm::orc::JITDylib*,
llvm::orc::JITDylibLookupFlags> > > const&,
llvm::orc::SymbolLookupSet,
llvm::orc::SymbolState, llvm::unique_function<void
(llvm::Expected<llvm::DenseMap<llvm::orc::SymbolStringPtr,
llvm::JITEvaluatedSymbol, llvm::DenseMapInfo<llvm::orc::SymbolStringPtr>,
llvm::detail::DenseMapPair<llvm::orc::SymbolStringPtr,
llvm::JITEvaluatedSymbol> > >)>, std::function<void
(llvm::DenseMap<llvm::orc::JITDylib*,
llvm::DenseSet<llvm::orc::SymbolStringPtr,
llvm::DenseMapInfo<llvm::orc::SymbolStringPtr> >,
llvm::DenseMapInfo<llvm::orc::JITDylib*>,
llvm::detail::DenseMapPair<llvm::orc::JITDylib*,
llvm::DenseSet<llvm::orc::SymbolStringPtr,
llvm::DenseMapInfo<llvm::orc::SymbolStringPtr> > > >
const&)>) + 556
    frame #15: 0x0000000000c20fc6
tarantool`llvm::orc::ExecutionSession::lookup(std::vector<std::pair<llvm::orc::JITDylib*,
llvm::orc::JITDylibLookupFlags>,
std::allocator<std::pair<llvm::orc::JITDylib*,
llvm::orc::JITDylibLookupFlags> > > const&,
llvm::orc::SymbolLookupSet
const&, llvm::orc::LookupKind, llvm::orc::SymbolState, std::function<void
(llvm::DenseMap<llvm::orc::JITDylib*,
llvm::DenseSet<llvm::orc::SymbolStringPtr,
llvm::DenseMapInfo<llvm::orc::SymbolStringPtr> >,
llvm::DenseMapInfo<llvm::orc::JITDylib*>,
llvm::detail::DenseMapPair<llvm::orc::JITDylib*,
llvm::DenseSet<llvm::orc::SymbolStringPtr,
llvm::DenseMapInfo<llvm::orc::SymbolStringPtr> > > >
const&)>) + 486
    frame #16: 0x0000000000c2154e
tarantool`llvm::orc::ExecutionSession::lookup(std::vector<std::pair<llvm::orc::JITDylib*,
llvm::orc::JITDylibLookupFlags>,
std::allocator<std::pair<llvm::orc::JITDylib*,
llvm::orc::JITDylibLookupFlags> > > const&,
llvm::orc::SymbolStringPtr,
llvm::orc::SymbolState) + 302
    frame #17: 0x0000000000c3b937
tarantool`llvm::orc::LLJIT::lookupLinkerMangled(llvm::orc::JITDylib&,
llvm::orc::SymbolStringPtr) + 119
    frame #18: 0x0000000000c08b36
tarantool`llvm::orc::LLJIT::lookup(llvm::orc::JITDylib&, llvm::StringRef) +
166
    frame #19: 0x0000000000c0770b tarantool`LLVMOrcLLJITLookup + 59
    frame #20: 0x0000000000778900
tarantool`llvm_exec_compiled_expr_list(ctx=0x0000000003271510, fn_id=0,
vdbe=0x0000000002db9e18) at llvm_jit.c:443:8

Apparently, the problem with the segfault is the attempt to access the
DiagHandler, though I explicitly set it.

My code can be viewed here:

https://github.com/CuriousGeorgiy/tarantool/blob/CuriousGeorgiy/sql-vdbe-jit/src/box/sql/llvm_jit.h

https://github.com/CuriousGeorgiy/tarantool/blob/CuriousGeorgiy/sql-vdbe-jit/src/box/sql/llvm_jit.c

I understand the code I provided may be sophisticated enough, so if there
is any additional information or context I can provide that would be
helpful, please, let me know.
Also, this is my first time communicating via a mailing list, so, please,
let me know if I am missing on something.
Regards,
Georgiy Lebedev
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20210718/48de4c61/attachment.html>