| //===--- SimpleExecutorDylibManager.cpp - Executor-side dylib management --===// | |
| // | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #include "llvm/ExecutionEngine/Orc/TargetProcess/SimpleExecutorDylibManager.h" | |
| #include "llvm/ExecutionEngine/Orc/Shared/Mangler.h" | |
| #include "llvm/TargetParser/Host.h" | |
| #include "llvm/TargetParser/Triple.h" | |
| #include "llvm/ExecutionEngine/Orc/Shared/SPSCI/NativeDylibManagerSPSCI.h" | |
| #include "llvm/Support/MSVCErrorWorkarounds.h" | |
| #include <future> | |
| #define DEBUG_TYPE "orc" | |
| namespace llvm { | |
| namespace orc { | |
| namespace rt_bootstrap { | |
| SimpleExecutorDylibManager::~SimpleExecutorDylibManager() { | |
| assert(Dylibs.empty() && "shutdown not called?"); | |
| } | |
| Expected<tpctypes::DylibHandle> | |
| SimpleExecutorDylibManager::open(const std::string &Path, uint64_t Mode) { | |
| if (Mode != 0) | |
| return make_error<StringError>("open: non-zero mode bits not yet supported", | |
| inconvertibleErrorCode()); | |
| const char *PathCStr = Path.empty() ? nullptr : Path.c_str(); | |
| std::string ErrMsg; | |
| auto DL = sys::DynamicLibrary::getPermanentLibrary(PathCStr, &ErrMsg); | |
| if (!DL.isValid()) | |
| return make_error<StringError>(std::move(ErrMsg), inconvertibleErrorCode()); | |
| std::lock_guard<std::mutex> Lock(M); | |
| auto H = ExecutorAddr::fromPtr(DL.getOSSpecificHandle()); | |
| Resolvers.push_back(std::make_unique<DylibSymbolResolver>(H)); | |
| Dylibs.insert(DL.getOSSpecificHandle()); | |
| return ExecutorAddr::fromPtr(Resolvers.back().get()); | |
| } | |
| ExecutorResolver::ResolveResult | |
| SimpleExecutorDylibManager::resolve(ExecutorAddr Resolver, | |
| RemoteSymbolLookupSet Lookup) { | |
| using TmpResult = MSVCPExpected<std::vector<std::optional<ExecutorAddr>>>; | |
| std::promise<TmpResult> P; | |
| auto F = P.get_future(); | |
| Resolver.toPtr<ExecutorResolver *>()->resolveAsync( | |
| std::move(Lookup), [&](TmpResult R) { P.set_value(std::move(R)); }); | |
| return F.get(); | |
| } | |
| Error SimpleExecutorDylibManager::shutdown() { | |
| DylibSet DS; | |
| { | |
| std::lock_guard<std::mutex> Lock(M); | |
| std::swap(DS, Dylibs); | |
| } | |
| // There is no removal of dylibs at the moment, so nothing to do here. | |
| return Error::success(); | |
| } | |
| void SimpleExecutorDylibManager::addBootstrapSymbols( | |
| StringMap<ExecutorAddr> &M) { | |
| Mangler Mangle{Triple(sys::getProcessTriple())}; | |
| // SimpleExecutorDylibManager is the LLVM-side implementation of the runtime's | |
| // NativeDylibManager controller interface, so it publishes its bootstrap | |
| // symbols under the NativeDylibManager_* names. The class itself will be | |
| // renamed to NativeDylibManager to match in a future cleanup. | |
| M[Mangle.mangledCopy(rt::sps_ci::NativeDylibManagerInstanceName)] = | |
| ExecutorAddr::fromPtr(this); | |
| M[Mangle.mangledCopy(rt::sps_ci::DylibMgrOpen::Name)] = | |
| ExecutorAddr::fromPtr(&openWrapper); | |
| M[Mangle.mangledCopy(rt::sps_ci::DylibMgrResolve::Name)] = | |
| ExecutorAddr::fromPtr(&resolveWrapper); | |
| } | |
| llvm::orc::shared::CWrapperFunctionBuffer | |
| SimpleExecutorDylibManager::openWrapper(const char *ArgData, size_t ArgSize) { | |
| return shared::WrapperFunction<rt::sps_ci::DylibMgrOpen::SPSSig>::handle( | |
| ArgData, ArgSize, | |
| shared::makeMethodWrapperHandler( | |
| &SimpleExecutorDylibManager::open)) | |
| .release(); | |
| } | |
| llvm::orc::shared::CWrapperFunctionBuffer | |
| SimpleExecutorDylibManager::resolveWrapper(const char *ArgData, | |
| size_t ArgSize) { | |
| return shared::WrapperFunction<rt::sps_ci::DylibMgrResolve::SPSSig>::handle( | |
| ArgData, ArgSize, | |
| shared::makeMethodWrapperHandler( | |
| &SimpleExecutorDylibManager::resolve)) | |
| .release(); | |
| } | |
| } // namespace rt_bootstrap | |
| } // end namespace orc | |
| } // end namespace llvm |