From c0ebc1806a70dc66699f10160e80d1def8a8e3c9 Mon Sep 17 00:00:00 2001 From: Eugene Zhulenev Date: Tue, 27 Aug 2024 18:28:40 -0700 Subject: [PATCH] [orc] Fix asan error in RTDyldObjectLinkingLayer.cpp (#106300) `JITDylibSearchOrderResolver` local variable can be destroyed before completion of all callbacks. Capture it together with `Deps` in `OnEmitted` callback. Original error: ``` ==2035==ERROR: AddressSanitizer: stack-use-after-return on address 0x7bebfa155b70 at pc 0x7ff2a9a88b4a bp 0x7bec08d51980 sp 0x7bec08d51978 READ of size 8 at 0x7bebfa155b70 thread T87 (tf_xla-cpu-llvm) #0 0x7ff2a9a88b49 in operator() llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp:55:58 #1 0x7ff2a9a88b49 in __invoke<(lambda at llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp:55:9) &, const llvm::DenseMap >, llvm::DenseMapInfo, llvm::detail::DenseMapPair > > > &> libcxx/include/__type_traits/invoke.h:149:25 #2 0x7ff2a9a88b49 in __call<(lambda at llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp:55:9) &, const llvm::DenseMap >, llvm::DenseMapInfo, llvm::detail::DenseMapPair > > > &> libcxx/include/__type_traits/invoke.h:224:5 #3 0x7ff2a9a88b49 in operator() libcxx/include/__functional/function.h:210:12 #4 0x7ff2a9a88b49 in void std::__u::__function::__policy_invoker + #include "llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h" #include "llvm/Object/COFF.h" @@ -184,11 +186,13 @@ void RTDyldObjectLinkingLayer::emit( std::shared_ptr SharedR(std::move(R)); auto Deps = std::make_unique(); - JITDylibSearchOrderResolver Resolver(*SharedR, *Deps); + auto Resolver = + std::make_unique(*SharedR, *Deps); + auto *ResolverPtr = Resolver.get(); jitLinkForORC( object::OwningBinary(std::move(*Obj), std::move(O)), - MemMgrRef, Resolver, ProcessAllSections, + MemMgrRef, *ResolverPtr, ProcessAllSections, [this, SharedR, &MemMgrRef, InternalSymbols]( const object::ObjectFile &Obj, RuntimeDyld::LoadedObjectInfo &LoadedObjInfo, @@ -196,7 +200,8 @@ void RTDyldObjectLinkingLayer::emit( return onObjLoad(*SharedR, Obj, MemMgrRef, LoadedObjInfo, ResolvedSymbols, *InternalSymbols); }, - [this, SharedR, MemMgr = std::move(MemMgr), Deps = std::move(Deps)]( + [this, SharedR, MemMgr = std::move(MemMgr), Deps = std::move(Deps), + Resolver = std::move(Resolver)]( object::OwningBinary Obj, std::unique_ptr LoadedObjInfo, Error Err) mutable {