From 977e11f5094192647daf33a455b06f9641b700e0 Mon Sep 17 00:00:00 2001 From: Eugene Zhulenev Date: Tue, 27 Aug 2024 15:28:10 -0700 Subject: [PATCH 1/3] Fix asan error in RTDyldObjectLinkingLayer.cpp `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() third_party/llvm/llvm-project/llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp:55:58 #1 0x7ff2a9a88b49 in __invoke<(lambda at third_party/llvm/llvm-project/llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp:55:9) &, const llvm::DenseMap >, llvm::DenseMapInfo, llvm::detail::DenseMapPair > > > &> third_party/crosstool/v18/stable/src/libcxx/include/__type_traits/invoke.h:149:25 #2 0x7ff2a9a88b49 in __call<(lambda at third_party/llvm/llvm-project/llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp:55:9) &, const llvm::DenseMap >, llvm::DenseMapInfo, llvm::detail::DenseMapPair > > > &> third_party/crosstool/v18/stable/src/libcxx/include/__type_traits/invoke.h:224:5 #3 0x7ff2a9a88b49 in operator() third_party/crosstool/v18/stable/src/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,12 @@ 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); jitLinkForORC( object::OwningBinary(std::move(*Obj), std::move(O)), - MemMgrRef, Resolver, ProcessAllSections, + MemMgrRef, *Resolver, ProcessAllSections, [this, SharedR, &MemMgrRef, InternalSymbols]( const object::ObjectFile &Obj, RuntimeDyld::LoadedObjectInfo &LoadedObjInfo, @@ -196,7 +199,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 { From 924425863a030c4e82dd1845d1197159c4432e6c Mon Sep 17 00:00:00 2001 From: Eugene Zhulenev Date: Tue, 27 Aug 2024 15:42:27 -0700 Subject: [PATCH 2/3] Update RTDyldObjectLinkingLayer.cpp --- llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp b/llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp index e518466e73e07..d41b6b481a5fa 100644 --- a/llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp +++ b/llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp @@ -188,10 +188,11 @@ void RTDyldObjectLinkingLayer::emit( 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, From 3c10c415f0e97ff2778ca228cf1e4a8ad645cde1 Mon Sep 17 00:00:00 2001 From: Eugene Zhulenev Date: Tue, 27 Aug 2024 15:50:54 -0700 Subject: [PATCH 3/3] Fix format warning --- llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp b/llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp index d41b6b481a5fa..bc3433d011551 100644 --- a/llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp +++ b/llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp @@ -188,7 +188,7 @@ void RTDyldObjectLinkingLayer::emit( auto Resolver = std::make_unique(*SharedR, *Deps); - auto* ResolverPtr = Resolver.get(); + auto *ResolverPtr = Resolver.get(); jitLinkForORC( object::OwningBinary(std::move(*Obj), std::move(O)),