From 6378735d180d7d344ee0521e43fd14cf1ceb93d3 Mon Sep 17 00:00:00 2001 From: SahilPatidar Date: Wed, 4 Jun 2025 11:53:50 +0530 Subject: [PATCH 1/8] [ORC] Add `Resolver` API --- .../Orc/EPCGenericDylibManager.h | 5 +- .../Orc/ExecutorResolutionGenerator.h | 76 +++++++++++++++ .../ExecutionEngine/Orc/Shared/OrcRTBridge.h | 5 + .../Orc/Shared/TargetProcessControlTypes.h | 4 + .../Orc/TargetProcess/ExecutorResolver.h | 48 ++++++++++ .../SimpleExecutorDylibManager.h | 5 + llvm/lib/ExecutionEngine/Orc/CMakeLists.txt | 1 + .../Orc/EPCDynamicLibrarySearchGenerator.cpp | 27 ++++-- .../Orc/EPCGenericDylibManager.cpp | 15 +-- .../Orc/ExecutorResolutionGenerator.cpp | 96 +++++++++++++++++++ .../Orc/Shared/OrcRTBridge.cpp | 2 + .../Orc/TargetProcess/CMakeLists.txt | 1 + .../Orc/TargetProcess/ExecutorResolver.cpp | 47 +++++++++ .../SimpleExecutorDylibManager.cpp | 28 +++++- 14 files changed, 340 insertions(+), 20 deletions(-) create mode 100644 llvm/include/llvm/ExecutionEngine/Orc/ExecutorResolutionGenerator.h create mode 100644 llvm/include/llvm/ExecutionEngine/Orc/TargetProcess/ExecutorResolver.h create mode 100644 llvm/lib/ExecutionEngine/Orc/ExecutorResolutionGenerator.cpp create mode 100644 llvm/lib/ExecutionEngine/Orc/TargetProcess/ExecutorResolver.cpp diff --git a/llvm/include/llvm/ExecutionEngine/Orc/EPCGenericDylibManager.h b/llvm/include/llvm/ExecutionEngine/Orc/EPCGenericDylibManager.h index 68bc54b89fe56..66073a8111f71 100644 --- a/llvm/include/llvm/ExecutionEngine/Orc/EPCGenericDylibManager.h +++ b/llvm/include/llvm/ExecutionEngine/Orc/EPCGenericDylibManager.h @@ -35,6 +35,7 @@ class EPCGenericDylibManager { ExecutorAddr Instance; ExecutorAddr Open; ExecutorAddr Lookup; + ExecutorAddr Resolve; }; /// Create an EPCGenericMemoryAccess instance from a given set of @@ -68,8 +69,8 @@ class EPCGenericDylibManager { return RF.get(); } - using SymbolLookupCompleteFn = - unique_function>)>; + using SymbolLookupCompleteFn = unique_function>)>; /// Looks up symbols within the given dylib. LLVM_ABI void lookupAsync(tpctypes::DylibHandle H, diff --git a/llvm/include/llvm/ExecutionEngine/Orc/ExecutorResolutionGenerator.h b/llvm/include/llvm/ExecutionEngine/Orc/ExecutorResolutionGenerator.h new file mode 100644 index 0000000000000..987e5082597a4 --- /dev/null +++ b/llvm/include/llvm/ExecutionEngine/Orc/ExecutorResolutionGenerator.h @@ -0,0 +1,76 @@ + +// LLVM_EXECUTIONENGINE_ORC_EXECUTORRESOLUTIONGENERATOR_H +//===----- ExecutorResolver.h - Resolve symbols in executor -----*- C++ -*-===// +// +// 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 +// +//===----------------------------------------------------------------------===// +// +// Declares ExecutorResolutionGenerator for symbol resolution, +// dynamic library loading, and lookup in an executor process via +// ExecutorResolver. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_EXECUTIONENGINE_ORC_EXECUTORRESOLUTIONGENERATOR_H +#define LLVM_EXECUTIONENGINE_ORC_EXECUTORRESOLUTIONGENERATOR_H + +#include "llvm/ADT/FunctionExtras.h" +#include "llvm/ExecutionEngine/Orc/AbsoluteSymbols.h" +#include "llvm/ExecutionEngine/Orc/Core.h" + +namespace llvm::orc { + +class ExecutorResolutionGenerator : public DefinitionGenerator { +public: + using SymbolPredicate = unique_function; + using AbsoluteSymbolsFn = + unique_function(SymbolMap)>; + + ExecutorResolutionGenerator( + ExecutionSession &ES, tpctypes::ResolverHandle H, + SymbolPredicate Allow = SymbolPredicate(), + AbsoluteSymbolsFn AbsoluteSymbols = absoluteSymbols) + : EPC(ES.getExecutorProcessControl()), H(H), Allow(std::move(Allow)), + AbsoluteSymbols(std::move(AbsoluteSymbols)) {} + + ExecutorResolutionGenerator( + ExecutionSession &ES, SymbolPredicate Allow = SymbolPredicate(), + AbsoluteSymbolsFn AbsoluteSymbols = absoluteSymbols) + : EPC(ES.getExecutorProcessControl()), Allow(std::move(Allow)), + AbsoluteSymbols(std::move(AbsoluteSymbols)) {} + + /// Permanently loads the library at the given path and, on success, returns + /// an ExecutorResolutionGenerator that will search it for symbol + /// definitions in the library. On failure returns the reason the library + /// failed to load. + static Expected> + Load(ExecutionSession &ES, const char *LibraryPath, + SymbolPredicate Allow = SymbolPredicate(), + AbsoluteSymbolsFn AbsoluteSymbols = absoluteSymbols); + + /// Creates a ExecutorResolutionGenerator that searches for symbols in + /// the target process. + static Expected> + GetForTargetProcess(ExecutionSession &ES, + SymbolPredicate Allow = SymbolPredicate(), + AbsoluteSymbolsFn AbsoluteSymbols = absoluteSymbols) { + return Load(ES, nullptr, std::move(Allow), std::move(AbsoluteSymbols)); + } + + Error tryToGenerate(LookupState &LS, LookupKind K, JITDylib &JD, + JITDylibLookupFlags JDLookupFlags, + const SymbolLookupSet &LookupSet) override; + +private: + ExecutorProcessControl &EPC; + tpctypes::ResolverHandle H; + SymbolPredicate Allow; + AbsoluteSymbolsFn AbsoluteSymbols; +}; + +} // namespace llvm::orc + +#endif // LLVM_EXECUTIONENGINE_ORC_EXECUTORRESOLUTIONGENERATOR_H diff --git a/llvm/include/llvm/ExecutionEngine/Orc/Shared/OrcRTBridge.h b/llvm/include/llvm/ExecutionEngine/Orc/Shared/OrcRTBridge.h index 2bc6c1218ae72..cceb8abe35bfa 100644 --- a/llvm/include/llvm/ExecutionEngine/Orc/Shared/OrcRTBridge.h +++ b/llvm/include/llvm/ExecutionEngine/Orc/Shared/OrcRTBridge.h @@ -26,6 +26,7 @@ namespace rt { LLVM_ABI extern const char *SimpleExecutorDylibManagerInstanceName; LLVM_ABI extern const char *SimpleExecutorDylibManagerOpenWrapperName; LLVM_ABI extern const char *SimpleExecutorDylibManagerLookupWrapperName; +LLVM_ABI extern const char *SimpleExecutorDylibManagerResolveWrapperName; LLVM_ABI extern const char *SimpleExecutorMemoryManagerInstanceName; LLVM_ABI extern const char *SimpleExecutorMemoryManagerReserveWrapperName; @@ -71,6 +72,10 @@ using SPSSimpleExecutorDylibManagerLookupSignature = shared::SPSExecutorAddr, shared::SPSExecutorAddr, shared::SPSRemoteSymbolLookupSet); +using SPSSimpleExecutorDylibManagerResolveSignature = + shared::SPSExpected>( + shared::SPSExecutorAddr, shared::SPSRemoteSymbolLookupSet); + using SPSSimpleExecutorMemoryManagerReserveSignature = shared::SPSExpected(shared::SPSExecutorAddr, uint64_t); diff --git a/llvm/include/llvm/ExecutionEngine/Orc/Shared/TargetProcessControlTypes.h b/llvm/include/llvm/ExecutionEngine/Orc/Shared/TargetProcessControlTypes.h index adb07ba29b92a..0d118318b5ece 100644 --- a/llvm/include/llvm/ExecutionEngine/Orc/Shared/TargetProcessControlTypes.h +++ b/llvm/include/llvm/ExecutionEngine/Orc/Shared/TargetProcessControlTypes.h @@ -114,6 +114,10 @@ struct PointerWrite { /// A handle used to represent a loaded dylib in the target process. using DylibHandle = ExecutorAddr; +/// A handle used to reference the resolver associated with a loaded +/// dylib in the target process. +using ResolverHandle = ExecutorAddr; + using LookupResult = std::vector; } // end namespace tpctypes diff --git a/llvm/include/llvm/ExecutionEngine/Orc/TargetProcess/ExecutorResolver.h b/llvm/include/llvm/ExecutionEngine/Orc/TargetProcess/ExecutorResolver.h new file mode 100644 index 0000000000000..45dbd753bac55 --- /dev/null +++ b/llvm/include/llvm/ExecutionEngine/Orc/TargetProcess/ExecutorResolver.h @@ -0,0 +1,48 @@ +//===----- ExecutorResolver.h - Symbol resolver -----*- C++ -*-===// +// +// 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 +// +//===----------------------------------------------------------------------===// +// +// Executor Symbol resolver. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_EXECUTIONENGINE_ORC_TARGETPROCESS_EXECUTORRESOLVER_H +#define LLVM_EXECUTIONENGINE_ORC_TARGETPROCESS_EXECUTORRESOLVER_H + +#include "llvm/ADT/FunctionExtras.h" + +#include "llvm/ExecutionEngine/Orc/Shared/ExecutorSymbolDef.h" +#include "llvm/ExecutionEngine/Orc/Shared/SimpleRemoteEPCUtils.h" +#include "llvm/ExecutionEngine/Orc/Shared/TargetProcessControlTypes.h" + +namespace llvm::orc { + +class ExecutorResolver { +public: + using ResolveResult = Expected>; + using YieldResolveResultFn = unique_function; + + virtual ~ExecutorResolver() = default; + + virtual void resolveAsync(const RemoteSymbolLookupSet &L, + YieldResolveResultFn &&OnResolve) = 0; +}; + +class DylibSymbolResolver : public ExecutorResolver { +public: + DylibSymbolResolver(tpctypes::DylibHandle H) + : Handle(H) {} + + void resolveAsync(const RemoteSymbolLookupSet &L, + ExecutorResolver::YieldResolveResultFn &&OnResolve) override; + +private: + tpctypes::DylibHandle Handle; +}; + +} // end namespace llvm::orc +#endif // LLVM_EXECUTIONENGINE_ORC_TARGETPROCESS_EXECUTORRESOLVER_H diff --git a/llvm/include/llvm/ExecutionEngine/Orc/TargetProcess/SimpleExecutorDylibManager.h b/llvm/include/llvm/ExecutionEngine/Orc/TargetProcess/SimpleExecutorDylibManager.h index 36a6f4bf6e193..e809d8c7fdee5 100644 --- a/llvm/include/llvm/ExecutionEngine/Orc/TargetProcess/SimpleExecutorDylibManager.h +++ b/llvm/include/llvm/ExecutionEngine/Orc/TargetProcess/SimpleExecutorDylibManager.h @@ -23,6 +23,7 @@ #include "llvm/ExecutionEngine/Orc/Shared/TargetProcessControlTypes.h" #include "llvm/ExecutionEngine/Orc/Shared/WrapperFunctionUtils.h" #include "llvm/ExecutionEngine/Orc/TargetProcess/ExecutorBootstrapService.h" +#include "llvm/ExecutionEngine/Orc/TargetProcess/ExecutorResolver.h" #include "llvm/Support/Compiler.h" #include "llvm/Support/DynamicLibrary.h" #include "llvm/Support/Error.h" @@ -54,8 +55,12 @@ class LLVM_ABI SimpleExecutorDylibManager : public ExecutorBootstrapService { static llvm::orc::shared::CWrapperFunctionResult lookupWrapper(const char *ArgData, size_t ArgSize); + static llvm::orc::shared::CWrapperFunctionResult + resolveWrapper(const char *ArgData, size_t ArgSize); + std::mutex M; DylibSet Dylibs; + std::vector> Resolvers; }; } // end namespace rt_bootstrap diff --git a/llvm/lib/ExecutionEngine/Orc/CMakeLists.txt b/llvm/lib/ExecutionEngine/Orc/CMakeLists.txt index f159d59fa3ace..0ffe3ae37da28 100644 --- a/llvm/lib/ExecutionEngine/Orc/CMakeLists.txt +++ b/llvm/lib/ExecutionEngine/Orc/CMakeLists.txt @@ -24,6 +24,7 @@ add_llvm_component_library(LLVMOrcJIT EPCGenericRTDyldMemoryManager.cpp EPCIndirectionUtils.cpp ExecutionUtils.cpp + ExecutorResolutionGenerator.cpp ObjectFileInterface.cpp GetDylibInterface.cpp IndirectionUtils.cpp diff --git a/llvm/lib/ExecutionEngine/Orc/EPCDynamicLibrarySearchGenerator.cpp b/llvm/lib/ExecutionEngine/Orc/EPCDynamicLibrarySearchGenerator.cpp index 59d66b271bb09..702a91b755155 100644 --- a/llvm/lib/ExecutionEngine/Orc/EPCDynamicLibrarySearchGenerator.cpp +++ b/llvm/lib/ExecutionEngine/Orc/EPCDynamicLibrarySearchGenerator.cpp @@ -79,25 +79,32 @@ Error EPCDynamicLibrarySearchGenerator::tryToGenerate( assert(Result->front().size() == LookupSymbols.size() && "Result has incorrect number of elements"); - SymbolMap NewSymbols; - auto ResultI = Result->front().begin(); - for (auto &KV : LookupSymbols) { - if (ResultI->getAddress()) - NewSymbols[KV.first] = *ResultI; - ++ResultI; + const std::vector &Syms = Result->front(); + size_t SymIdx = 0; + SymbolNameSet MissingSymbols; + SymbolMap NewSyms; + for (auto &[Name, Flags] : LookupSymbols) { + auto Sym = Syms[SymIdx++]; + if (Sym.getAddress()) + NewSyms[Name] = Sym; + else if (LLVM_UNLIKELY(Flags == SymbolLookupFlags::RequiredSymbol)) + MissingSymbols.insert(Name); } LLVM_DEBUG({ dbgs() << "EPCDynamicLibrarySearchGenerator lookup returned " - << NewSymbols << "\n"; + << NewSyms << "\n"; }); - // If there were no resolved symbols bail out. - if (NewSymbols.empty()) + if (NewSyms.empty()) return LS.continueLookup(Error::success()); + if (LLVM_UNLIKELY(!MissingSymbols.empty())) + return LS.continueLookup(make_error( + this->EPC.getSymbolStringPool(), std::move(MissingSymbols))); + // Define resolved symbols. - Error Err = addAbsolutes(JD, std::move(NewSymbols)); + Error Err = addAbsolutes(JD, std::move(NewSyms)); LS.continueLookup(std::move(Err)); }); diff --git a/llvm/lib/ExecutionEngine/Orc/EPCGenericDylibManager.cpp b/llvm/lib/ExecutionEngine/Orc/EPCGenericDylibManager.cpp index f98b18ccd0dc7..7c7335e6a3128 100644 --- a/llvm/lib/ExecutionEngine/Orc/EPCGenericDylibManager.cpp +++ b/llvm/lib/ExecutionEngine/Orc/EPCGenericDylibManager.cpp @@ -66,7 +66,8 @@ EPCGenericDylibManager::CreateWithDefaultBootstrapSymbols( if (auto Err = EPC.getBootstrapSymbols( {{SAs.Instance, rt::SimpleExecutorDylibManagerInstanceName}, {SAs.Open, rt::SimpleExecutorDylibManagerOpenWrapperName}, - {SAs.Lookup, rt::SimpleExecutorDylibManagerLookupWrapperName}})) + {SAs.Lookup, rt::SimpleExecutorDylibManagerLookupWrapperName}, + {SAs.Resolve, rt::SimpleExecutorDylibManagerResolveWrapperName}})) return std::move(Err); return EPCGenericDylibManager(EPC, std::move(SAs)); } @@ -84,8 +85,8 @@ Expected EPCGenericDylibManager::open(StringRef Path, void EPCGenericDylibManager::lookupAsync(tpctypes::DylibHandle H, const SymbolLookupSet &Lookup, SymbolLookupCompleteFn Complete) { - EPC.callSPSWrapperAsync( - SAs.Lookup, + EPC.callSPSWrapperAsync( + SAs.Resolve, [Complete = std::move(Complete)]( Error SerializationErr, Expected> Result) mutable { @@ -96,14 +97,14 @@ void EPCGenericDylibManager::lookupAsync(tpctypes::DylibHandle H, } Complete(std::move(Result)); }, - SAs.Instance, H, Lookup); + H, Lookup); } void EPCGenericDylibManager::lookupAsync(tpctypes::DylibHandle H, const RemoteSymbolLookupSet &Lookup, SymbolLookupCompleteFn Complete) { - EPC.callSPSWrapperAsync( - SAs.Lookup, + EPC.callSPSWrapperAsync( + SAs.Resolve, [Complete = std::move(Complete)]( Error SerializationErr, Expected> Result) mutable { @@ -114,7 +115,7 @@ void EPCGenericDylibManager::lookupAsync(tpctypes::DylibHandle H, } Complete(std::move(Result)); }, - SAs.Instance, H, Lookup); + H, Lookup); } } // end namespace orc diff --git a/llvm/lib/ExecutionEngine/Orc/ExecutorResolutionGenerator.cpp b/llvm/lib/ExecutionEngine/Orc/ExecutorResolutionGenerator.cpp new file mode 100644 index 0000000000000..c8f8257e23330 --- /dev/null +++ b/llvm/lib/ExecutionEngine/Orc/ExecutorResolutionGenerator.cpp @@ -0,0 +1,96 @@ +//===---- ExecutorProcessControl.cpp -- Executor process control APIs -----===// +// +// 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/ExecutorResolutionGenerator.h" + +#include "llvm/ExecutionEngine/Orc/DebugUtils.h" +#include "llvm/ExecutionEngine/Orc/Shared/ExecutorSymbolDef.h" +#include "llvm/Support/Error.h" + +#define DEBUG_TYPE "orc" + +namespace llvm { +namespace orc { + +Expected> +ExecutorResolutionGenerator::Load(ExecutionSession &ES, const char *LibraryPath, + SymbolPredicate Allow, + AbsoluteSymbolsFn AbsoluteSymbols) { + auto H = ES.getExecutorProcessControl().getDylibMgr().loadDylib(LibraryPath); + if (H) + return H.takeError(); + return std::make_unique( + ES, *H, std::move(Allow), std::move(AbsoluteSymbols)); +} + +Error ExecutorResolutionGenerator::tryToGenerate( + LookupState &LS, LookupKind K, JITDylib &JD, + JITDylibLookupFlags JDLookupFlags, const SymbolLookupSet &LookupSet) { + + if (LookupSet.empty()) + return Error::success(); + + LLVM_DEBUG({ + dbgs() << "ExecutorResolutionGenerator trying to generate " << LookupSet + << "\n"; + }); + + SymbolLookupSet LookupSymbols; + for (auto &[Name, LookupFlag] : LookupSet) { + if (Allow && !Allow(Name)) + continue; + LookupSymbols.add(Name, LookupFlag); + } + + DylibManager::LookupRequest LR(H, LookupSymbols); + EPC.getDylibMgr().lookupSymbolsAsync( + LR, [this, LS = std::move(LS), JD = JITDylibSP(&JD), + LookupSymbols](auto Result) mutable { + if (Result) { + LLVM_DEBUG({ + dbgs() << "ExecutorResolutionGenerator lookup failed due to error"; + }); + return LS.continueLookup(Result.takeError()); + } + assert(Result->size() == 1 && + "Results for more than one library returned"); + assert(Result->front().size() == LookupSymbols.size() && + "Result has incorrect number of elements"); + + const std::vector &Syms = Result->front(); + size_t SymIdx = 0; + SymbolNameSet MissingSymbols; + SymbolMap NewSyms; + for (auto &[Name, Flags] : LookupSymbols) { + auto Sym = Syms[SymIdx++]; + if (Sym.getAddress()) + NewSyms[Name] = Sym; + else if (LLVM_UNLIKELY(Flags == SymbolLookupFlags::RequiredSymbol)) + MissingSymbols.insert(Name); + } + + LLVM_DEBUG({ + dbgs() << "ExecutorResolutionGenerator lookup returned " << NewSyms + << "\n"; + }); + + if (NewSyms.empty()) + return LS.continueLookup(Error::success()); + + if (LLVM_UNLIKELY(!MissingSymbols.empty())) + return LS.continueLookup(make_error( + this->EPC.getSymbolStringPool(), std::move(MissingSymbols))); + + LS.continueLookup(JD->define(AbsoluteSymbols(std::move(NewSyms)))); + }); + + return Error::success(); +} + +} // end namespace orc +} // end namespace llvm diff --git a/llvm/lib/ExecutionEngine/Orc/Shared/OrcRTBridge.cpp b/llvm/lib/ExecutionEngine/Orc/Shared/OrcRTBridge.cpp index 123651fc623e2..102875c3f113a 100644 --- a/llvm/lib/ExecutionEngine/Orc/Shared/OrcRTBridge.cpp +++ b/llvm/lib/ExecutionEngine/Orc/Shared/OrcRTBridge.cpp @@ -18,6 +18,8 @@ const char *SimpleExecutorDylibManagerOpenWrapperName = "__llvm_orc_SimpleExecutorDylibManager_open_wrapper"; const char *SimpleExecutorDylibManagerLookupWrapperName = "__llvm_orc_SimpleExecutorDylibManager_lookup_wrapper"; +const char *SimpleExecutorDylibManagerResolveWrapperName = + "__llvm_orc_SimpleExecutorDylibManager_resolve_wrapper"; const char *SimpleExecutorMemoryManagerInstanceName = "__llvm_orc_SimpleExecutorMemoryManager_Instance"; diff --git a/llvm/lib/ExecutionEngine/Orc/TargetProcess/CMakeLists.txt b/llvm/lib/ExecutionEngine/Orc/TargetProcess/CMakeLists.txt index 9f3abac156adb..927558649eb4d 100644 --- a/llvm/lib/ExecutionEngine/Orc/TargetProcess/CMakeLists.txt +++ b/llvm/lib/ExecutionEngine/Orc/TargetProcess/CMakeLists.txt @@ -15,6 +15,7 @@ endif() add_llvm_component_library(LLVMOrcTargetProcess ExecutorSharedMemoryMapperService.cpp DefaultHostBootstrapValues.cpp + ExecutorResolver.cpp JITLoaderGDB.cpp JITLoaderPerf.cpp JITLoaderVTune.cpp diff --git a/llvm/lib/ExecutionEngine/Orc/TargetProcess/ExecutorResolver.cpp b/llvm/lib/ExecutionEngine/Orc/TargetProcess/ExecutorResolver.cpp new file mode 100644 index 0000000000000..8ce4721caeeea --- /dev/null +++ b/llvm/lib/ExecutionEngine/Orc/TargetProcess/ExecutorResolver.cpp @@ -0,0 +1,47 @@ + +#include "llvm/ExecutionEngine/Orc/TargetProcess/ExecutorResolver.h" + +#include "llvm/Support/DynamicLibrary.h" +#include "llvm/Support/Error.h" + +namespace llvm::orc { + +void DylibSymbolResolver::resolveAsync( + const RemoteSymbolLookupSet &L, + ExecutorResolver::YieldResolveResultFn &&OnResolve) { + std::vector Result; + auto DL = sys::DynamicLibrary(Handle.toPtr()); + + for (const auto &E : L) { + if (E.Name.empty()) { + if (E.Required) + OnResolve( + make_error("Required address for empty symbol \"\"", + inconvertibleErrorCode())); + else + Result.emplace_back(); + } else { + + const char *DemangledSymName = E.Name.c_str(); +#ifdef __APPLE__ + if (E.Name.front() != '_') + OnResolve(make_error(Twine("MachO symbol \"") + E.Name + + "\" missing leading '_'", + inconvertibleErrorCode())); + ++DemangledSymName; +#endif + + void *Addr = DL.getAddressOfSymbol(DemangledSymName); + if (!Addr && E.Required) + Result.emplace_back(); + else + // FIXME: determine accurate JITSymbolFlags. + Result.emplace_back(ExecutorSymbolDef{ExecutorAddr::fromPtr(Addr), + JITSymbolFlags::Exported}); + } + } + + OnResolve(std::move(Result)); +} + +} // end namespace llvm::orc \ No newline at end of file diff --git a/llvm/lib/ExecutionEngine/Orc/TargetProcess/SimpleExecutorDylibManager.cpp b/llvm/lib/ExecutionEngine/Orc/TargetProcess/SimpleExecutorDylibManager.cpp index db6f20130db9e..877943f25ccfe 100644 --- a/llvm/lib/ExecutionEngine/Orc/TargetProcess/SimpleExecutorDylibManager.cpp +++ b/llvm/lib/ExecutionEngine/Orc/TargetProcess/SimpleExecutorDylibManager.cpp @@ -10,6 +10,10 @@ #include "llvm/ExecutionEngine/Orc/Shared/OrcRTBridge.h" +#include "llvm/Support/MSVCErrorWorkarounds.h" + +#include + #define DEBUG_TYPE "orc" namespace llvm { @@ -35,8 +39,9 @@ SimpleExecutorDylibManager::open(const std::string &Path, uint64_t Mode) { std::lock_guard Lock(M); auto H = ExecutorAddr::fromPtr(DL.getOSSpecificHandle()); + Resolvers.push_back(std::make_unique(H)); Dylibs.insert(DL.getOSSpecificHandle()); - return H; + return ExecutorAddr::fromPtr(Resolvers.back().get()); } Expected> @@ -96,6 +101,8 @@ void SimpleExecutorDylibManager::addBootstrapSymbols( ExecutorAddr::fromPtr(&openWrapper); M[rt::SimpleExecutorDylibManagerLookupWrapperName] = ExecutorAddr::fromPtr(&lookupWrapper); + M[rt::SimpleExecutorDylibManagerResolveWrapperName] = + ExecutorAddr::fromPtr(&resolveWrapper); } llvm::orc::shared::CWrapperFunctionResult @@ -118,6 +125,25 @@ SimpleExecutorDylibManager::lookupWrapper(const char *ArgData, size_t ArgSize) { .release(); } +llvm::orc::shared::CWrapperFunctionResult +SimpleExecutorDylibManager::resolveWrapper(const char *ArgData, + size_t ArgSize) { + using ResolveResult = ExecutorResolver::ResolveResult; + return shared::WrapperFunction< + rt::SPSSimpleExecutorDylibManagerResolveSignature>:: + handle(ArgData, ArgSize, + [](ExecutorAddr Obj, RemoteSymbolLookupSet L) -> ResolveResult { + using TmpResult = MSVCPExpected>; + std::promise P; + auto F = P.get_future(); + Obj.toPtr()->resolveAsync( + std::move(L), + [&](TmpResult R) { P.set_value(std::move(R)); }); + return F.get(); + }) + .release(); +} + } // namespace rt_bootstrap } // end namespace orc } // end namespace llvm From a382b972c5723cc06fe10bf81020af9f6637e6dc Mon Sep 17 00:00:00 2001 From: SahilPatidar Date: Thu, 5 Jun 2025 11:12:31 +0530 Subject: [PATCH 2/8] Fix format --- .../llvm/ExecutionEngine/Orc/EPCGenericDylibManager.h | 4 ++-- .../ExecutionEngine/Orc/TargetProcess/ExecutorResolver.h | 8 ++++---- .../Orc/EPCDynamicLibrarySearchGenerator.cpp | 4 ++-- .../Orc/TargetProcess/ExecutorResolver.cpp | 4 ++-- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/llvm/include/llvm/ExecutionEngine/Orc/EPCGenericDylibManager.h b/llvm/include/llvm/ExecutionEngine/Orc/EPCGenericDylibManager.h index 66073a8111f71..d70592f61e12b 100644 --- a/llvm/include/llvm/ExecutionEngine/Orc/EPCGenericDylibManager.h +++ b/llvm/include/llvm/ExecutionEngine/Orc/EPCGenericDylibManager.h @@ -69,8 +69,8 @@ class EPCGenericDylibManager { return RF.get(); } - using SymbolLookupCompleteFn = unique_function>)>; + using SymbolLookupCompleteFn = + unique_function>)>; /// Looks up symbols within the given dylib. LLVM_ABI void lookupAsync(tpctypes::DylibHandle H, diff --git a/llvm/include/llvm/ExecutionEngine/Orc/TargetProcess/ExecutorResolver.h b/llvm/include/llvm/ExecutionEngine/Orc/TargetProcess/ExecutorResolver.h index 45dbd753bac55..e09954444d6ab 100644 --- a/llvm/include/llvm/ExecutionEngine/Orc/TargetProcess/ExecutorResolver.h +++ b/llvm/include/llvm/ExecutionEngine/Orc/TargetProcess/ExecutorResolver.h @@ -34,11 +34,11 @@ class ExecutorResolver { class DylibSymbolResolver : public ExecutorResolver { public: - DylibSymbolResolver(tpctypes::DylibHandle H) - : Handle(H) {} + DylibSymbolResolver(tpctypes::DylibHandle H) : Handle(H) {} - void resolveAsync(const RemoteSymbolLookupSet &L, - ExecutorResolver::YieldResolveResultFn &&OnResolve) override; + void + resolveAsync(const RemoteSymbolLookupSet &L, + ExecutorResolver::YieldResolveResultFn &&OnResolve) override; private: tpctypes::DylibHandle Handle; diff --git a/llvm/lib/ExecutionEngine/Orc/EPCDynamicLibrarySearchGenerator.cpp b/llvm/lib/ExecutionEngine/Orc/EPCDynamicLibrarySearchGenerator.cpp index 702a91b755155..1bb88491b6720 100644 --- a/llvm/lib/ExecutionEngine/Orc/EPCDynamicLibrarySearchGenerator.cpp +++ b/llvm/lib/ExecutionEngine/Orc/EPCDynamicLibrarySearchGenerator.cpp @@ -92,8 +92,8 @@ Error EPCDynamicLibrarySearchGenerator::tryToGenerate( } LLVM_DEBUG({ - dbgs() << "EPCDynamicLibrarySearchGenerator lookup returned " - << NewSyms << "\n"; + dbgs() << "EPCDynamicLibrarySearchGenerator lookup returned " << NewSyms + << "\n"; }); if (NewSyms.empty()) diff --git a/llvm/lib/ExecutionEngine/Orc/TargetProcess/ExecutorResolver.cpp b/llvm/lib/ExecutionEngine/Orc/TargetProcess/ExecutorResolver.cpp index 8ce4721caeeea..b3a051be74aa1 100644 --- a/llvm/lib/ExecutionEngine/Orc/TargetProcess/ExecutorResolver.cpp +++ b/llvm/lib/ExecutionEngine/Orc/TargetProcess/ExecutorResolver.cpp @@ -36,8 +36,8 @@ void DylibSymbolResolver::resolveAsync( Result.emplace_back(); else // FIXME: determine accurate JITSymbolFlags. - Result.emplace_back(ExecutorSymbolDef{ExecutorAddr::fromPtr(Addr), - JITSymbolFlags::Exported}); + Result.push_back( + {ExecutorAddr::fromPtr(Addr), JITSymbolFlags::Exported}); } } From b752a6547d6e640e232e2851452fdc13ebfc1b7e Mon Sep 17 00:00:00 2001 From: SahilPatidar Date: Fri, 6 Jun 2025 14:38:03 +0530 Subject: [PATCH 3/8] Fix minor issue --- .../Orc/EPCDynamicLibrarySearchGenerator.cpp | 29 +++++++------------ .../Orc/TargetProcess/ExecutorResolver.cpp | 11 +++---- 2 files changed, 17 insertions(+), 23 deletions(-) diff --git a/llvm/lib/ExecutionEngine/Orc/EPCDynamicLibrarySearchGenerator.cpp b/llvm/lib/ExecutionEngine/Orc/EPCDynamicLibrarySearchGenerator.cpp index 1bb88491b6720..59d66b271bb09 100644 --- a/llvm/lib/ExecutionEngine/Orc/EPCDynamicLibrarySearchGenerator.cpp +++ b/llvm/lib/ExecutionEngine/Orc/EPCDynamicLibrarySearchGenerator.cpp @@ -79,32 +79,25 @@ Error EPCDynamicLibrarySearchGenerator::tryToGenerate( assert(Result->front().size() == LookupSymbols.size() && "Result has incorrect number of elements"); - const std::vector &Syms = Result->front(); - size_t SymIdx = 0; - SymbolNameSet MissingSymbols; - SymbolMap NewSyms; - for (auto &[Name, Flags] : LookupSymbols) { - auto Sym = Syms[SymIdx++]; - if (Sym.getAddress()) - NewSyms[Name] = Sym; - else if (LLVM_UNLIKELY(Flags == SymbolLookupFlags::RequiredSymbol)) - MissingSymbols.insert(Name); + SymbolMap NewSymbols; + auto ResultI = Result->front().begin(); + for (auto &KV : LookupSymbols) { + if (ResultI->getAddress()) + NewSymbols[KV.first] = *ResultI; + ++ResultI; } LLVM_DEBUG({ - dbgs() << "EPCDynamicLibrarySearchGenerator lookup returned " << NewSyms - << "\n"; + dbgs() << "EPCDynamicLibrarySearchGenerator lookup returned " + << NewSymbols << "\n"; }); - if (NewSyms.empty()) + // If there were no resolved symbols bail out. + if (NewSymbols.empty()) return LS.continueLookup(Error::success()); - if (LLVM_UNLIKELY(!MissingSymbols.empty())) - return LS.continueLookup(make_error( - this->EPC.getSymbolStringPool(), std::move(MissingSymbols))); - // Define resolved symbols. - Error Err = addAbsolutes(JD, std::move(NewSyms)); + Error Err = addAbsolutes(JD, std::move(NewSymbols)); LS.continueLookup(std::move(Err)); }); diff --git a/llvm/lib/ExecutionEngine/Orc/TargetProcess/ExecutorResolver.cpp b/llvm/lib/ExecutionEngine/Orc/TargetProcess/ExecutorResolver.cpp index b3a051be74aa1..c69ce86fb0787 100644 --- a/llvm/lib/ExecutionEngine/Orc/TargetProcess/ExecutorResolver.cpp +++ b/llvm/lib/ExecutionEngine/Orc/TargetProcess/ExecutorResolver.cpp @@ -33,11 +33,12 @@ void DylibSymbolResolver::resolveAsync( void *Addr = DL.getAddressOfSymbol(DemangledSymName); if (!Addr && E.Required) - Result.emplace_back(); - else - // FIXME: determine accurate JITSymbolFlags. - Result.push_back( - {ExecutorAddr::fromPtr(Addr), JITSymbolFlags::Exported}); + OnResolve(make_error(Twine("Missing definition for ") + + DemangledSymName, + inconvertibleErrorCode())); + + // FIXME: determine accurate JITSymbolFlags. + Result.push_back({ExecutorAddr::fromPtr(Addr), JITSymbolFlags::Exported}); } } From 2045e0ca2b63b4e0fbdf27bcd93d13926c7aacc4 Mon Sep 17 00:00:00 2001 From: SahilPatidar Date: Mon, 9 Jun 2025 09:36:56 +0530 Subject: [PATCH 4/8] Refactor code to return Optional --- .../Orc/EPCGenericDylibManager.h | 10 +++++----- .../ExecutionEngine/Orc/Shared/OrcRTBridge.h | 6 +++--- .../Orc/Shared/TargetProcessControlTypes.h | 2 +- .../Orc/TargetProcess/ExecutorResolver.h | 2 +- .../Orc/EPCDebugObjectRegistrar.cpp | 4 +++- .../Orc/EPCDynamicLibrarySearchGenerator.cpp | 17 ++++++++++++----- .../Orc/EPCGenericDylibManager.cpp | 6 ++++-- .../Orc/ExecutorResolutionGenerator.cpp | 13 +++++++------ .../Orc/LookupAndRecordAddrs.cpp | 7 ++++--- .../Orc/SelfExecutorProcessControl.cpp | 18 +++++++----------- .../Orc/TargetProcess/ExecutorResolver.cpp | 13 ++++++------- .../SimpleExecutorDylibManager.cpp | 3 ++- llvm/tools/lli/ForwardingMemoryManager.h | 7 +++++-- .../Orc/ObjectLinkingLayerTest.cpp | 4 ++-- 14 files changed, 62 insertions(+), 50 deletions(-) diff --git a/llvm/include/llvm/ExecutionEngine/Orc/EPCGenericDylibManager.h b/llvm/include/llvm/ExecutionEngine/Orc/EPCGenericDylibManager.h index d70592f61e12b..d64f7e7c0cb3b 100644 --- a/llvm/include/llvm/ExecutionEngine/Orc/EPCGenericDylibManager.h +++ b/llvm/include/llvm/ExecutionEngine/Orc/EPCGenericDylibManager.h @@ -52,25 +52,25 @@ class EPCGenericDylibManager { LLVM_ABI Expected open(StringRef Path, uint64_t Mode); /// Looks up symbols within the given dylib. - Expected> + Expected lookup(tpctypes::DylibHandle H, const SymbolLookupSet &Lookup) { - std::promise>> RP; + std::promise> RP; auto RF = RP.get_future(); lookupAsync(H, Lookup, [&RP](auto R) { RP.set_value(std::move(R)); }); return RF.get(); } /// Looks up symbols within the given dylib. - Expected> + Expected lookup(tpctypes::DylibHandle H, const RemoteSymbolLookupSet &Lookup) { - std::promise>> RP; + std::promise> RP; auto RF = RP.get_future(); lookupAsync(H, Lookup, [&RP](auto R) { RP.set_value(std::move(R)); }); return RF.get(); } using SymbolLookupCompleteFn = - unique_function>)>; + unique_function)>; /// Looks up symbols within the given dylib. LLVM_ABI void lookupAsync(tpctypes::DylibHandle H, diff --git a/llvm/include/llvm/ExecutionEngine/Orc/Shared/OrcRTBridge.h b/llvm/include/llvm/ExecutionEngine/Orc/Shared/OrcRTBridge.h index cceb8abe35bfa..8dbff346e2f51 100644 --- a/llvm/include/llvm/ExecutionEngine/Orc/Shared/OrcRTBridge.h +++ b/llvm/include/llvm/ExecutionEngine/Orc/Shared/OrcRTBridge.h @@ -72,9 +72,9 @@ using SPSSimpleExecutorDylibManagerLookupSignature = shared::SPSExecutorAddr, shared::SPSExecutorAddr, shared::SPSRemoteSymbolLookupSet); -using SPSSimpleExecutorDylibManagerResolveSignature = - shared::SPSExpected>( - shared::SPSExecutorAddr, shared::SPSRemoteSymbolLookupSet); +using SPSSimpleExecutorDylibManagerResolveSignature = shared::SPSExpected< + shared::SPSSequence>>( + shared::SPSExecutorAddr, shared::SPSRemoteSymbolLookupSet); using SPSSimpleExecutorMemoryManagerReserveSignature = shared::SPSExpected(shared::SPSExecutorAddr, diff --git a/llvm/include/llvm/ExecutionEngine/Orc/Shared/TargetProcessControlTypes.h b/llvm/include/llvm/ExecutionEngine/Orc/Shared/TargetProcessControlTypes.h index 0d118318b5ece..28ff322556cd7 100644 --- a/llvm/include/llvm/ExecutionEngine/Orc/Shared/TargetProcessControlTypes.h +++ b/llvm/include/llvm/ExecutionEngine/Orc/Shared/TargetProcessControlTypes.h @@ -118,7 +118,7 @@ using DylibHandle = ExecutorAddr; /// dylib in the target process. using ResolverHandle = ExecutorAddr; -using LookupResult = std::vector; +using LookupResult = std::vector>; } // end namespace tpctypes diff --git a/llvm/include/llvm/ExecutionEngine/Orc/TargetProcess/ExecutorResolver.h b/llvm/include/llvm/ExecutionEngine/Orc/TargetProcess/ExecutorResolver.h index e09954444d6ab..2c5e98c7312b9 100644 --- a/llvm/include/llvm/ExecutionEngine/Orc/TargetProcess/ExecutorResolver.h +++ b/llvm/include/llvm/ExecutionEngine/Orc/TargetProcess/ExecutorResolver.h @@ -23,7 +23,7 @@ namespace llvm::orc { class ExecutorResolver { public: - using ResolveResult = Expected>; + using ResolveResult = Expected>>; using YieldResolveResultFn = unique_function; virtual ~ExecutorResolver() = default; diff --git a/llvm/lib/ExecutionEngine/Orc/EPCDebugObjectRegistrar.cpp b/llvm/lib/ExecutionEngine/Orc/EPCDebugObjectRegistrar.cpp index 9f7d517d481d4..c4517a8c82f14 100644 --- a/llvm/lib/ExecutionEngine/Orc/EPCDebugObjectRegistrar.cpp +++ b/llvm/lib/ExecutionEngine/Orc/EPCDebugObjectRegistrar.cpp @@ -41,8 +41,10 @@ Expected> createJITLoaderGDBRegistrar( assert(Result->size() == 1 && "Unexpected number of dylibs in result"); assert((*Result)[0].size() == 1 && "Unexpected number of addresses in result"); + assert((*Result)[0][0].has_value() && + "Expected a valid address in the lookup result"); - ExecutorAddr RegisterAddr = (*Result)[0][0].getAddress(); + ExecutorAddr RegisterAddr = (*Result)[0][0]->getAddress(); return std::make_unique(ES, RegisterAddr); } diff --git a/llvm/lib/ExecutionEngine/Orc/EPCDynamicLibrarySearchGenerator.cpp b/llvm/lib/ExecutionEngine/Orc/EPCDynamicLibrarySearchGenerator.cpp index 59d66b271bb09..8177b5ed069b0 100644 --- a/llvm/lib/ExecutionEngine/Orc/EPCDynamicLibrarySearchGenerator.cpp +++ b/llvm/lib/ExecutionEngine/Orc/EPCDynamicLibrarySearchGenerator.cpp @@ -79,12 +79,15 @@ Error EPCDynamicLibrarySearchGenerator::tryToGenerate( assert(Result->front().size() == LookupSymbols.size() && "Result has incorrect number of elements"); + auto SymsIt = Result->front().begin(); + SymbolNameSet MissingSymbols; SymbolMap NewSymbols; - auto ResultI = Result->front().begin(); - for (auto &KV : LookupSymbols) { - if (ResultI->getAddress()) - NewSymbols[KV.first] = *ResultI; - ++ResultI; + for (auto &[Name, Flags] : LookupSymbols) { + const auto &Sym = *SymsIt++; + if (Sym && Sym->getAddress()) + NewSymbols[Name] = *Sym; + else if (LLVM_UNLIKELY(!Sym && Flags == SymbolLookupFlags::RequiredSymbol)) + MissingSymbols.insert(Name); } LLVM_DEBUG({ @@ -96,6 +99,10 @@ Error EPCDynamicLibrarySearchGenerator::tryToGenerate( if (NewSymbols.empty()) return LS.continueLookup(Error::success()); + if (LLVM_UNLIKELY(!MissingSymbols.empty())) + return LS.continueLookup(make_error( + this->EPC.getSymbolStringPool(), std::move(MissingSymbols))); + // Define resolved symbols. Error Err = addAbsolutes(JD, std::move(NewSymbols)); diff --git a/llvm/lib/ExecutionEngine/Orc/EPCGenericDylibManager.cpp b/llvm/lib/ExecutionEngine/Orc/EPCGenericDylibManager.cpp index 7c7335e6a3128..ded9b93746317 100644 --- a/llvm/lib/ExecutionEngine/Orc/EPCGenericDylibManager.cpp +++ b/llvm/lib/ExecutionEngine/Orc/EPCGenericDylibManager.cpp @@ -89,7 +89,8 @@ void EPCGenericDylibManager::lookupAsync(tpctypes::DylibHandle H, SAs.Resolve, [Complete = std::move(Complete)]( Error SerializationErr, - Expected> Result) mutable { + Expected>> + Result) mutable { if (SerializationErr) { cantFail(Result.takeError()); Complete(std::move(SerializationErr)); @@ -107,7 +108,8 @@ void EPCGenericDylibManager::lookupAsync(tpctypes::DylibHandle H, SAs.Resolve, [Complete = std::move(Complete)]( Error SerializationErr, - Expected> Result) mutable { + Expected>> + Result) mutable { if (SerializationErr) { cantFail(Result.takeError()); Complete(std::move(SerializationErr)); diff --git a/llvm/lib/ExecutionEngine/Orc/ExecutorResolutionGenerator.cpp b/llvm/lib/ExecutionEngine/Orc/ExecutorResolutionGenerator.cpp index c8f8257e23330..15cebb273558b 100644 --- a/llvm/lib/ExecutionEngine/Orc/ExecutorResolutionGenerator.cpp +++ b/llvm/lib/ExecutionEngine/Orc/ExecutorResolutionGenerator.cpp @@ -62,15 +62,16 @@ Error ExecutorResolutionGenerator::tryToGenerate( assert(Result->front().size() == LookupSymbols.size() && "Result has incorrect number of elements"); - const std::vector &Syms = Result->front(); - size_t SymIdx = 0; + // const tpctypes::LookupResult &Syms = Result->front(); + // size_t SymIdx = 0; + auto Syms = Result->front().begin(); SymbolNameSet MissingSymbols; SymbolMap NewSyms; for (auto &[Name, Flags] : LookupSymbols) { - auto Sym = Syms[SymIdx++]; - if (Sym.getAddress()) - NewSyms[Name] = Sym; - else if (LLVM_UNLIKELY(Flags == SymbolLookupFlags::RequiredSymbol)) + const auto &Sym = *Syms++; + if (Sym && Sym->getAddress()) + NewSyms[Name] = *Sym; + else if (LLVM_UNLIKELY(!Sym && Flags == SymbolLookupFlags::RequiredSymbol)) MissingSymbols.insert(Name); } diff --git a/llvm/lib/ExecutionEngine/Orc/LookupAndRecordAddrs.cpp b/llvm/lib/ExecutionEngine/Orc/LookupAndRecordAddrs.cpp index 78169a28ed63b..42d630d690864 100644 --- a/llvm/lib/ExecutionEngine/Orc/LookupAndRecordAddrs.cpp +++ b/llvm/lib/ExecutionEngine/Orc/LookupAndRecordAddrs.cpp @@ -72,9 +72,10 @@ Error lookupAndRecordAddrs( return make_error("Error in lookup result elements", inconvertibleErrorCode()); - for (unsigned I = 0; I != Pairs.size(); ++I) - *Pairs[I].second = Result->front()[I].getAddress(); - + for (unsigned I = 0; I != Pairs.size(); ++I) { + if (Result->front()[I]) + *Pairs[I].second = Result->front()[I]->getAddress(); + } return Error::success(); } diff --git a/llvm/lib/ExecutionEngine/Orc/SelfExecutorProcessControl.cpp b/llvm/lib/ExecutionEngine/Orc/SelfExecutorProcessControl.cpp index 78045f1491f04..f8a2bd36dc10d 100644 --- a/llvm/lib/ExecutionEngine/Orc/SelfExecutorProcessControl.cpp +++ b/llvm/lib/ExecutionEngine/Orc/SelfExecutorProcessControl.cpp @@ -91,22 +91,18 @@ void SelfExecutorProcessControl::lookupSymbolsAsync( for (auto &Elem : Request) { sys::DynamicLibrary Dylib(Elem.Handle.toPtr()); - R.push_back(std::vector()); + R.push_back(tpctypes::LookupResult()); 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()); - if (!Addr && KV.second == SymbolLookupFlags::RequiredSymbol) { - // FIXME: Collect all failing symbols before erroring out. - SymbolNameVector MissingSymbols; - MissingSymbols.push_back(Sym); - return Complete( - make_error(SSP, std::move(MissingSymbols))); - } - // FIXME: determine accurate JITSymbolFlags. - R.back().push_back( - {ExecutorAddr::fromPtr(Addr), JITSymbolFlags::Exported}); + if (!Addr && KV.second == SymbolLookupFlags::RequiredSymbol) + R.back().emplace_back(); + else + // FIXME: determine accurate JITSymbolFlags. + R.back().emplace_back(ExecutorSymbolDef(ExecutorAddr::fromPtr(Addr), + JITSymbolFlags::Exported)); } } diff --git a/llvm/lib/ExecutionEngine/Orc/TargetProcess/ExecutorResolver.cpp b/llvm/lib/ExecutionEngine/Orc/TargetProcess/ExecutorResolver.cpp index c69ce86fb0787..6054d8673036a 100644 --- a/llvm/lib/ExecutionEngine/Orc/TargetProcess/ExecutorResolver.cpp +++ b/llvm/lib/ExecutionEngine/Orc/TargetProcess/ExecutorResolver.cpp @@ -9,7 +9,7 @@ namespace llvm::orc { void DylibSymbolResolver::resolveAsync( const RemoteSymbolLookupSet &L, ExecutorResolver::YieldResolveResultFn &&OnResolve) { - std::vector Result; + std::vector> Result; auto DL = sys::DynamicLibrary(Handle.toPtr()); for (const auto &E : L) { @@ -33,12 +33,11 @@ void DylibSymbolResolver::resolveAsync( void *Addr = DL.getAddressOfSymbol(DemangledSymName); if (!Addr && E.Required) - OnResolve(make_error(Twine("Missing definition for ") + - DemangledSymName, - inconvertibleErrorCode())); - - // FIXME: determine accurate JITSymbolFlags. - Result.push_back({ExecutorAddr::fromPtr(Addr), JITSymbolFlags::Exported}); + Result.emplace_back(); + else + // FIXME: determine accurate JITSymbolFlags. + Result.emplace_back(ExecutorSymbolDef(ExecutorAddr::fromPtr(Addr), + JITSymbolFlags::Exported)); } } diff --git a/llvm/lib/ExecutionEngine/Orc/TargetProcess/SimpleExecutorDylibManager.cpp b/llvm/lib/ExecutionEngine/Orc/TargetProcess/SimpleExecutorDylibManager.cpp index 877943f25ccfe..5458b49dbf5d6 100644 --- a/llvm/lib/ExecutionEngine/Orc/TargetProcess/SimpleExecutorDylibManager.cpp +++ b/llvm/lib/ExecutionEngine/Orc/TargetProcess/SimpleExecutorDylibManager.cpp @@ -133,7 +133,8 @@ SimpleExecutorDylibManager::resolveWrapper(const char *ArgData, rt::SPSSimpleExecutorDylibManagerResolveSignature>:: handle(ArgData, ArgSize, [](ExecutorAddr Obj, RemoteSymbolLookupSet L) -> ResolveResult { - using TmpResult = MSVCPExpected>; + using TmpResult = + MSVCPExpected>>; std::promise P; auto F = P.get_future(); Obj.toPtr()->resolveAsync( diff --git a/llvm/tools/lli/ForwardingMemoryManager.h b/llvm/tools/lli/ForwardingMemoryManager.h index e5c10d672ccfb..d193befc0682d 100644 --- a/llvm/tools/lli/ForwardingMemoryManager.h +++ b/llvm/tools/lli/ForwardingMemoryManager.h @@ -109,8 +109,11 @@ class RemoteResolver : public LegacyJITSymbolResolver { if (Syms->size() != 1) return make_error("Unexpected remote lookup result", inconvertibleErrorCode()); - return JITSymbol(Syms->front().getAddress().getValue(), - Syms->front().getFlags()); + if (!Syms->front()) + return make_error("Expected valid address", + inconvertibleErrorCode()); + return JITSymbol(Syms->front()->getAddress().getValue(), + Syms->front()->getFlags()); } else return Syms.takeError(); } diff --git a/llvm/unittests/ExecutionEngine/Orc/ObjectLinkingLayerTest.cpp b/llvm/unittests/ExecutionEngine/Orc/ObjectLinkingLayerTest.cpp index 8a6549b1b594e..5ff3e26f35296 100644 --- a/llvm/unittests/ExecutionEngine/Orc/ObjectLinkingLayerTest.cpp +++ b/llvm/unittests/ExecutionEngine/Orc/ObjectLinkingLayerTest.cpp @@ -301,7 +301,7 @@ TEST(ObjectLinkingLayerSearchGeneratorTest, AbsoluteSymbolsObjectLayer) { void lookupSymbolsAsync(ArrayRef Request, SymbolLookupCompleteFn Complete) override { - std::vector Result; + std::vector> Result; EXPECT_EQ(Request.size(), 1u); for (auto &LR : Request) { EXPECT_EQ(LR.Symbols.size(), 1u); @@ -309,7 +309,7 @@ TEST(ObjectLinkingLayerSearchGeneratorTest, AbsoluteSymbolsObjectLayer) { if (*Sym.first == "_testFunc") { ExecutorSymbolDef Def{ExecutorAddr::fromPtr((void *)0x1000), JITSymbolFlags::Exported}; - Result.push_back(Def); + Result.emplace_back(Def); } else { ADD_FAILURE() << "unexpected symbol request " << *Sym.first; } From 81fd920f48fc039edc181816020c9ad0d9186ffb Mon Sep 17 00:00:00 2001 From: SahilPatidar Date: Thu, 12 Jun 2025 14:21:20 +0530 Subject: [PATCH 5/8] Fix format --- .../llvm/ExecutionEngine/Orc/EPCGenericDylibManager.h | 8 ++++---- .../Orc/EPCDynamicLibrarySearchGenerator.cpp | 3 ++- .../ExecutionEngine/Orc/ExecutorResolutionGenerator.cpp | 3 ++- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/llvm/include/llvm/ExecutionEngine/Orc/EPCGenericDylibManager.h b/llvm/include/llvm/ExecutionEngine/Orc/EPCGenericDylibManager.h index d64f7e7c0cb3b..440a3a375a5ce 100644 --- a/llvm/include/llvm/ExecutionEngine/Orc/EPCGenericDylibManager.h +++ b/llvm/include/llvm/ExecutionEngine/Orc/EPCGenericDylibManager.h @@ -52,8 +52,8 @@ class EPCGenericDylibManager { LLVM_ABI Expected open(StringRef Path, uint64_t Mode); /// Looks up symbols within the given dylib. - Expected - lookup(tpctypes::DylibHandle H, const SymbolLookupSet &Lookup) { + Expected lookup(tpctypes::DylibHandle H, + const SymbolLookupSet &Lookup) { std::promise> RP; auto RF = RP.get_future(); lookupAsync(H, Lookup, [&RP](auto R) { RP.set_value(std::move(R)); }); @@ -61,8 +61,8 @@ class EPCGenericDylibManager { } /// Looks up symbols within the given dylib. - Expected - lookup(tpctypes::DylibHandle H, const RemoteSymbolLookupSet &Lookup) { + Expected lookup(tpctypes::DylibHandle H, + const RemoteSymbolLookupSet &Lookup) { std::promise> RP; auto RF = RP.get_future(); lookupAsync(H, Lookup, [&RP](auto R) { RP.set_value(std::move(R)); }); diff --git a/llvm/lib/ExecutionEngine/Orc/EPCDynamicLibrarySearchGenerator.cpp b/llvm/lib/ExecutionEngine/Orc/EPCDynamicLibrarySearchGenerator.cpp index 8177b5ed069b0..1e83c07f4bdb1 100644 --- a/llvm/lib/ExecutionEngine/Orc/EPCDynamicLibrarySearchGenerator.cpp +++ b/llvm/lib/ExecutionEngine/Orc/EPCDynamicLibrarySearchGenerator.cpp @@ -86,7 +86,8 @@ Error EPCDynamicLibrarySearchGenerator::tryToGenerate( const auto &Sym = *SymsIt++; if (Sym && Sym->getAddress()) NewSymbols[Name] = *Sym; - else if (LLVM_UNLIKELY(!Sym && Flags == SymbolLookupFlags::RequiredSymbol)) + else if (LLVM_UNLIKELY(!Sym && + Flags == SymbolLookupFlags::RequiredSymbol)) MissingSymbols.insert(Name); } diff --git a/llvm/lib/ExecutionEngine/Orc/ExecutorResolutionGenerator.cpp b/llvm/lib/ExecutionEngine/Orc/ExecutorResolutionGenerator.cpp index 15cebb273558b..e5b0bd3dbc5c3 100644 --- a/llvm/lib/ExecutionEngine/Orc/ExecutorResolutionGenerator.cpp +++ b/llvm/lib/ExecutionEngine/Orc/ExecutorResolutionGenerator.cpp @@ -71,7 +71,8 @@ Error ExecutorResolutionGenerator::tryToGenerate( const auto &Sym = *Syms++; if (Sym && Sym->getAddress()) NewSyms[Name] = *Sym; - else if (LLVM_UNLIKELY(!Sym && Flags == SymbolLookupFlags::RequiredSymbol)) + else if (LLVM_UNLIKELY(!Sym && + Flags == SymbolLookupFlags::RequiredSymbol)) MissingSymbols.insert(Name); } From 8c4f0384abd2608fd658cd5e3eb5caac40461b63 Mon Sep 17 00:00:00 2001 From: SahilPatidar Date: Tue, 5 Aug 2025 12:41:19 +0530 Subject: [PATCH 6/8] Remove lookup implementation --- .../Orc/EPCGenericDylibManager.h | 1 - .../ExecutionEngine/Orc/Shared/OrcRTBridge.h | 6 --- .../SimpleExecutorDylibManager.h | 5 -- .../Orc/EPCGenericDylibManager.cpp | 1 - .../Orc/Shared/OrcRTBridge.cpp | 2 - .../SimpleExecutorDylibManager.cpp | 50 ------------------- 6 files changed, 65 deletions(-) diff --git a/llvm/include/llvm/ExecutionEngine/Orc/EPCGenericDylibManager.h b/llvm/include/llvm/ExecutionEngine/Orc/EPCGenericDylibManager.h index 440a3a375a5ce..7c995a727e348 100644 --- a/llvm/include/llvm/ExecutionEngine/Orc/EPCGenericDylibManager.h +++ b/llvm/include/llvm/ExecutionEngine/Orc/EPCGenericDylibManager.h @@ -34,7 +34,6 @@ class EPCGenericDylibManager { struct SymbolAddrs { ExecutorAddr Instance; ExecutorAddr Open; - ExecutorAddr Lookup; ExecutorAddr Resolve; }; diff --git a/llvm/include/llvm/ExecutionEngine/Orc/Shared/OrcRTBridge.h b/llvm/include/llvm/ExecutionEngine/Orc/Shared/OrcRTBridge.h index 8dbff346e2f51..99ba456e66c85 100644 --- a/llvm/include/llvm/ExecutionEngine/Orc/Shared/OrcRTBridge.h +++ b/llvm/include/llvm/ExecutionEngine/Orc/Shared/OrcRTBridge.h @@ -25,7 +25,6 @@ namespace rt { LLVM_ABI extern const char *SimpleExecutorDylibManagerInstanceName; LLVM_ABI extern const char *SimpleExecutorDylibManagerOpenWrapperName; -LLVM_ABI extern const char *SimpleExecutorDylibManagerLookupWrapperName; LLVM_ABI extern const char *SimpleExecutorDylibManagerResolveWrapperName; LLVM_ABI extern const char *SimpleExecutorMemoryManagerInstanceName; @@ -67,11 +66,6 @@ using SPSSimpleExecutorDylibManagerOpenSignature = shared::SPSExpected(shared::SPSExecutorAddr, shared::SPSString, uint64_t); -using SPSSimpleExecutorDylibManagerLookupSignature = - shared::SPSExpected>( - shared::SPSExecutorAddr, shared::SPSExecutorAddr, - shared::SPSRemoteSymbolLookupSet); - using SPSSimpleExecutorDylibManagerResolveSignature = shared::SPSExpected< shared::SPSSequence>>( shared::SPSExecutorAddr, shared::SPSRemoteSymbolLookupSet); diff --git a/llvm/include/llvm/ExecutionEngine/Orc/TargetProcess/SimpleExecutorDylibManager.h b/llvm/include/llvm/ExecutionEngine/Orc/TargetProcess/SimpleExecutorDylibManager.h index e809d8c7fdee5..7526a29dc1066 100644 --- a/llvm/include/llvm/ExecutionEngine/Orc/TargetProcess/SimpleExecutorDylibManager.h +++ b/llvm/include/llvm/ExecutionEngine/Orc/TargetProcess/SimpleExecutorDylibManager.h @@ -40,8 +40,6 @@ class LLVM_ABI SimpleExecutorDylibManager : public ExecutorBootstrapService { virtual ~SimpleExecutorDylibManager(); Expected open(const std::string &Path, uint64_t Mode); - Expected> - lookup(tpctypes::DylibHandle H, const RemoteSymbolLookupSet &L); Error shutdown() override; void addBootstrapSymbols(StringMap &M) override; @@ -52,9 +50,6 @@ class LLVM_ABI SimpleExecutorDylibManager : public ExecutorBootstrapService { static llvm::orc::shared::CWrapperFunctionResult openWrapper(const char *ArgData, size_t ArgSize); - static llvm::orc::shared::CWrapperFunctionResult - lookupWrapper(const char *ArgData, size_t ArgSize); - static llvm::orc::shared::CWrapperFunctionResult resolveWrapper(const char *ArgData, size_t ArgSize); diff --git a/llvm/lib/ExecutionEngine/Orc/EPCGenericDylibManager.cpp b/llvm/lib/ExecutionEngine/Orc/EPCGenericDylibManager.cpp index ded9b93746317..1f19d178039e5 100644 --- a/llvm/lib/ExecutionEngine/Orc/EPCGenericDylibManager.cpp +++ b/llvm/lib/ExecutionEngine/Orc/EPCGenericDylibManager.cpp @@ -66,7 +66,6 @@ EPCGenericDylibManager::CreateWithDefaultBootstrapSymbols( if (auto Err = EPC.getBootstrapSymbols( {{SAs.Instance, rt::SimpleExecutorDylibManagerInstanceName}, {SAs.Open, rt::SimpleExecutorDylibManagerOpenWrapperName}, - {SAs.Lookup, rt::SimpleExecutorDylibManagerLookupWrapperName}, {SAs.Resolve, rt::SimpleExecutorDylibManagerResolveWrapperName}})) return std::move(Err); return EPCGenericDylibManager(EPC, std::move(SAs)); diff --git a/llvm/lib/ExecutionEngine/Orc/Shared/OrcRTBridge.cpp b/llvm/lib/ExecutionEngine/Orc/Shared/OrcRTBridge.cpp index 102875c3f113a..26e8f5382da0e 100644 --- a/llvm/lib/ExecutionEngine/Orc/Shared/OrcRTBridge.cpp +++ b/llvm/lib/ExecutionEngine/Orc/Shared/OrcRTBridge.cpp @@ -16,8 +16,6 @@ const char *SimpleExecutorDylibManagerInstanceName = "__llvm_orc_SimpleExecutorDylibManager_Instance"; const char *SimpleExecutorDylibManagerOpenWrapperName = "__llvm_orc_SimpleExecutorDylibManager_open_wrapper"; -const char *SimpleExecutorDylibManagerLookupWrapperName = - "__llvm_orc_SimpleExecutorDylibManager_lookup_wrapper"; const char *SimpleExecutorDylibManagerResolveWrapperName = "__llvm_orc_SimpleExecutorDylibManager_resolve_wrapper"; diff --git a/llvm/lib/ExecutionEngine/Orc/TargetProcess/SimpleExecutorDylibManager.cpp b/llvm/lib/ExecutionEngine/Orc/TargetProcess/SimpleExecutorDylibManager.cpp index 5458b49dbf5d6..52bb55d209e56 100644 --- a/llvm/lib/ExecutionEngine/Orc/TargetProcess/SimpleExecutorDylibManager.cpp +++ b/llvm/lib/ExecutionEngine/Orc/TargetProcess/SimpleExecutorDylibManager.cpp @@ -44,44 +44,6 @@ SimpleExecutorDylibManager::open(const std::string &Path, uint64_t Mode) { return ExecutorAddr::fromPtr(Resolvers.back().get()); } -Expected> -SimpleExecutorDylibManager::lookup(tpctypes::DylibHandle H, - const RemoteSymbolLookupSet &L) { - std::vector Result; - auto DL = sys::DynamicLibrary(H.toPtr()); - - for (const auto &E : L) { - if (E.Name.empty()) { - if (E.Required) - return make_error("Required address for empty symbol \"\"", - inconvertibleErrorCode()); - else - Result.push_back(ExecutorSymbolDef()); - } else { - - const char *DemangledSymName = E.Name.c_str(); -#ifdef __APPLE__ - if (E.Name.front() != '_') - return make_error(Twine("MachO symbol \"") + E.Name + - "\" missing leading '_'", - inconvertibleErrorCode()); - ++DemangledSymName; -#endif - - void *Addr = DL.getAddressOfSymbol(DemangledSymName); - if (!Addr && E.Required) - return make_error(Twine("Missing definition for ") + - DemangledSymName, - inconvertibleErrorCode()); - - // FIXME: determine accurate JITSymbolFlags. - Result.push_back({ExecutorAddr::fromPtr(Addr), JITSymbolFlags::Exported}); - } - } - - return Result; -} - Error SimpleExecutorDylibManager::shutdown() { DylibSet DS; @@ -99,8 +61,6 @@ void SimpleExecutorDylibManager::addBootstrapSymbols( M[rt::SimpleExecutorDylibManagerInstanceName] = ExecutorAddr::fromPtr(this); M[rt::SimpleExecutorDylibManagerOpenWrapperName] = ExecutorAddr::fromPtr(&openWrapper); - M[rt::SimpleExecutorDylibManagerLookupWrapperName] = - ExecutorAddr::fromPtr(&lookupWrapper); M[rt::SimpleExecutorDylibManagerResolveWrapperName] = ExecutorAddr::fromPtr(&resolveWrapper); } @@ -115,16 +75,6 @@ SimpleExecutorDylibManager::openWrapper(const char *ArgData, size_t ArgSize) { .release(); } -llvm::orc::shared::CWrapperFunctionResult -SimpleExecutorDylibManager::lookupWrapper(const char *ArgData, size_t ArgSize) { - return shared:: - WrapperFunction::handle( - ArgData, ArgSize, - shared::makeMethodWrapperHandler( - &SimpleExecutorDylibManager::lookup)) - .release(); -} - llvm::orc::shared::CWrapperFunctionResult SimpleExecutorDylibManager::resolveWrapper(const char *ArgData, size_t ArgSize) { From d193aac878c185f1f6658a8e8bb0dca84282360b Mon Sep 17 00:00:00 2001 From: SahilPatidar Date: Sat, 23 Aug 2025 16:57:18 +0530 Subject: [PATCH 7/8] Replace assertion with explicit error return --- llvm/lib/ExecutionEngine/Orc/EPCDebugObjectRegistrar.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/llvm/lib/ExecutionEngine/Orc/EPCDebugObjectRegistrar.cpp b/llvm/lib/ExecutionEngine/Orc/EPCDebugObjectRegistrar.cpp index c4517a8c82f14..08bef37b06c82 100644 --- a/llvm/lib/ExecutionEngine/Orc/EPCDebugObjectRegistrar.cpp +++ b/llvm/lib/ExecutionEngine/Orc/EPCDebugObjectRegistrar.cpp @@ -41,8 +41,11 @@ Expected> createJITLoaderGDBRegistrar( assert(Result->size() == 1 && "Unexpected number of dylibs in result"); assert((*Result)[0].size() == 1 && "Unexpected number of addresses in result"); - assert((*Result)[0][0].has_value() && - "Expected a valid address in the lookup result"); + + if (!(*Result)[0][0].has_value()) + return make_error( + "Expected a valid address in the lookup result", + inconvertibleErrorCode()); ExecutorAddr RegisterAddr = (*Result)[0][0]->getAddress(); return std::make_unique(ES, RegisterAddr); From 71378fb6fa64bfb5be91f38f36c7052f1f09953d Mon Sep 17 00:00:00 2001 From: SahilPatidar Date: Mon, 15 Sep 2025 16:23:16 +0530 Subject: [PATCH 8/8] Remove typo comment --- .../llvm/ExecutionEngine/Orc/ExecutorResolutionGenerator.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/llvm/include/llvm/ExecutionEngine/Orc/ExecutorResolutionGenerator.h b/llvm/include/llvm/ExecutionEngine/Orc/ExecutorResolutionGenerator.h index 987e5082597a4..9b972edf3e18c 100644 --- a/llvm/include/llvm/ExecutionEngine/Orc/ExecutorResolutionGenerator.h +++ b/llvm/include/llvm/ExecutionEngine/Orc/ExecutorResolutionGenerator.h @@ -1,5 +1,3 @@ - -// LLVM_EXECUTIONENGINE_ORC_EXECUTORRESOLUTIONGENERATOR_H //===----- ExecutorResolver.h - Resolve symbols in executor -----*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.