[ORC] Update SelfExecutorProcessControl to allow user-supplied handles.
authorLang Hames <lhames@gmail.com>
Tue, 25 Oct 2022 15:23:27 +0000 (08:23 -0700)
committerLang Hames <lhames@gmail.com>
Tue, 25 Oct 2022 15:50:27 +0000 (08:50 -0700)
SelfExecutorProcessControl no longer requires that handles passed to
lookupSymbols be ones that were previously returned from loadDylib. This brings
SelfExecutorPRocessControl into alignment with SimpleRemoteEPC, which was
updated in 6613f4aff85.

llvm/include/llvm/ExecutionEngine/Orc/ExecutorProcessControl.h
llvm/lib/ExecutionEngine/Orc/ExecutorProcessControl.cpp

index 20f5c98..f858788 100644 (file)
@@ -483,7 +483,6 @@ private:
 
   std::unique_ptr<jitlink::JITLinkMemoryManager> OwnedMemMgr;
   char GlobalManglingPrefix = 0;
-  std::vector<std::unique_ptr<sys::DynamicLibrary>> DynamicLibraries;
 };
 
 } // end namespace orc
index b48d60b..361fcd4 100644 (file)
@@ -75,12 +75,10 @@ SelfExecutorProcessControl::Create(
 Expected<tpctypes::DylibHandle>
 SelfExecutorProcessControl::loadDylib(const char *DylibPath) {
   std::string ErrMsg;
-  auto Dylib = std::make_unique<sys::DynamicLibrary>(
-      sys::DynamicLibrary::getPermanentLibrary(DylibPath, &ErrMsg));
-  if (!Dylib->isValid())
+  auto Dylib = sys::DynamicLibrary::getPermanentLibrary(DylibPath, &ErrMsg);
+  if (!Dylib.isValid())
     return make_error<StringError>(std::move(ErrMsg), inconvertibleErrorCode());
-  DynamicLibraries.push_back(std::move(Dylib));
-  return ExecutorAddr::fromPtr(DynamicLibraries.back().get());
+  return ExecutorAddr::fromPtr(Dylib.getOSSpecificHandle());
 }
 
 Expected<std::vector<tpctypes::LookupResult>>
@@ -88,19 +86,13 @@ SelfExecutorProcessControl::lookupSymbols(ArrayRef<LookupRequest> Request) {
   std::vector<tpctypes::LookupResult> R;
 
   for (auto &Elem : Request) {
-    auto *Dylib = Elem.Handle.toPtr<sys::DynamicLibrary *>();
-    assert(llvm::any_of(DynamicLibraries,
-                        [=](const std::unique_ptr<sys::DynamicLibrary> &DL) {
-                          return DL.get() == Dylib;
-                        }) &&
-           "Invalid handle");
-
+    sys::DynamicLibrary Dylib(Elem.Handle.toPtr<void *>());
     R.push_back(std::vector<ExecutorAddr>());
     for (auto &KV : Elem.Symbols) {
       auto &Sym = KV.first;
       std::string Tmp((*Sym).data() + !!GlobalManglingPrefix,
                       (*Sym).size() - !!GlobalManglingPrefix);
-      void *Addr = Dylib->getAddressOfSymbol(Tmp.c_str());
+      void *Addr = Dylib.getAddressOfSymbol(Tmp.c_str());
       if (!Addr && KV.second == SymbolLookupFlags::RequiredSymbol) {
         // FIXME: Collect all failing symbols before erroring out.
         SymbolNameVector MissingSymbols;