From 2e695a5932015bb4a72550f37116cf7f0ee1c16b Mon Sep 17 00:00:00 2001 From: SahilPatidar Date: Tue, 4 Nov 2025 20:26:33 +0530 Subject: [PATCH 1/2] [ORC][LibraryResolver] Fix ensureFilterBuilt assertion failure and architecture compatibility check --- .../Orc/TargetProcess/LibraryResolver.h | 15 +++++++++++++-- .../Orc/TargetProcess/LibraryResolver.cpp | 15 +++++++-------- .../Orc/TargetProcess/LibraryScanner.cpp | 2 +- 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/llvm/include/llvm/ExecutionEngine/Orc/TargetProcess/LibraryResolver.h b/llvm/include/llvm/ExecutionEngine/Orc/TargetProcess/LibraryResolver.h index 7cc78d4be2792..bb42cf926a503 100644 --- a/llvm/include/llvm/ExecutionEngine/Orc/TargetProcess/LibraryResolver.h +++ b/llvm/include/llvm/ExecutionEngine/Orc/TargetProcess/LibraryResolver.h @@ -211,6 +211,17 @@ class LibraryManager { return FilteredView(Libraries.begin(), Libraries.end(), S, K); } + std::vector> getLibraries(LibState S, + PathType K) const { + std::vector> Outs; + std::shared_lock Lock(Mtx); + for (const auto &[_, Entry] : Libraries) { + if (Entry->getKind() == K && Entry->getState() == S) + Outs.push_back(Entry); + } + return Outs; + } + void forEachLibrary(const LibraryVisitor &visitor) const { std::unique_lock Lock(Mtx); for (const auto &[_, entry] : Libraries) { @@ -220,14 +231,14 @@ class LibraryManager { } bool isLoaded(StringRef Path) const { - std::unique_lock Lock(Mtx); + std::shared_lock Lock(Mtx); if (auto It = Libraries.find(Path.str()); It != Libraries.end()) return It->second->getState() == LibState::Loaded; return false; } bool isQueried(StringRef Path) const { - std::unique_lock Lock(Mtx); + std::shared_lock Lock(Mtx); if (auto It = Libraries.find(Path.str()); It != Libraries.end()) return It->second->getState() == LibState::Queried; return false; diff --git a/llvm/lib/ExecutionEngine/Orc/TargetProcess/LibraryResolver.cpp b/llvm/lib/ExecutionEngine/Orc/TargetProcess/LibraryResolver.cpp index 35da82a10306a..93c29360b7e3b 100644 --- a/llvm/lib/ExecutionEngine/Orc/TargetProcess/LibraryResolver.cpp +++ b/llvm/lib/ExecutionEngine/Orc/TargetProcess/LibraryResolver.cpp @@ -226,19 +226,18 @@ void LibraryResolver::resolveSymbolsInLibrary( return EnumerateResult::Continue; }, Opts); + }; + if (!Lib.hasFilter()) { + LLVM_DEBUG(dbgs() << "Building filter for library: " << Lib.getFullPath() + << "\n";); + enumerateSymbolsIfNeeded(); if (DiscoveredSymbols.empty()) { LLVM_DEBUG(dbgs() << " No symbols and remove library : " << Lib.getFullPath() << "\n";); LibMgr.removeLibrary(Lib.getFullPath()); return; } - }; - - if (!Lib.hasFilter()) { - LLVM_DEBUG(dbgs() << "Building filter for library: " << Lib.getFullPath() - << "\n";); - enumerateSymbolsIfNeeded(); SmallVector SymbolVec; SymbolVec.reserve(DiscoveredSymbols.size()); for (const auto &KV : DiscoveredSymbols) @@ -288,8 +287,8 @@ void LibraryResolver::searchSymbolsInLibraries( SymbolSearchContext Ctx(Q); while (!Ctx.allResolved()) { - - for (auto &Lib : LibMgr.getView(S, K)) { + auto Libs = LibMgr.getLibraries(S, K); + for (auto &Lib : Libs) { if (Ctx.hasSearched(Lib.get())) continue; diff --git a/llvm/lib/ExecutionEngine/Orc/TargetProcess/LibraryScanner.cpp b/llvm/lib/ExecutionEngine/Orc/TargetProcess/LibraryScanner.cpp index d93f68622fcc2..32f6dbefb8480 100644 --- a/llvm/lib/ExecutionEngine/Orc/TargetProcess/LibraryScanner.cpp +++ b/llvm/lib/ExecutionEngine/Orc/TargetProcess/LibraryScanner.cpp @@ -50,7 +50,7 @@ void handleError(Error Err, StringRef context = "") { } bool ObjectFileLoader::isArchitectureCompatible(const object::ObjectFile &Obj) { - Triple HostTriple(sys::getDefaultTargetTriple()); + Triple HostTriple(sys::getProcessTriple()); Triple ObjTriple = Obj.makeTriple(); LLVM_DEBUG({ From 3d6042f59ebe8be79a8bd6affc82205741ca637c Mon Sep 17 00:00:00 2001 From: SahilPatidar Date: Wed, 5 Nov 2025 15:54:54 +0530 Subject: [PATCH 2/2] Refactor and improve getLibrary --- .../Orc/TargetProcess/LibraryResolver.h | 16 ++++++++----- .../Orc/TargetProcess/LibraryResolver.cpp | 24 +++++++++---------- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/llvm/include/llvm/ExecutionEngine/Orc/TargetProcess/LibraryResolver.h b/llvm/include/llvm/ExecutionEngine/Orc/TargetProcess/LibraryResolver.h index bb42cf926a503..fc41641fd5cff 100644 --- a/llvm/include/llvm/ExecutionEngine/Orc/TargetProcess/LibraryResolver.h +++ b/llvm/include/llvm/ExecutionEngine/Orc/TargetProcess/LibraryResolver.h @@ -211,15 +211,19 @@ class LibraryManager { return FilteredView(Libraries.begin(), Libraries.end(), S, K); } - std::vector> getLibraries(LibState S, - PathType K) const { - std::vector> Outs; + using LibraryFilterFn = std::function; + void getLibraries(LibState S, PathType K, + std::vector> &Outs, + LibraryFilterFn Filter = nullptr) const { std::shared_lock Lock(Mtx); for (const auto &[_, Entry] : Libraries) { - if (Entry->getKind() == K && Entry->getState() == S) - Outs.push_back(Entry); + const auto &Info = *Entry; + if (Info.getKind() != K || Info.getState() != S) + continue; + if (Filter && !Filter(Info)) + continue; + Outs.push_back(Entry); } - return Outs; } void forEachLibrary(const LibraryVisitor &visitor) const { diff --git a/llvm/lib/ExecutionEngine/Orc/TargetProcess/LibraryResolver.cpp b/llvm/lib/ExecutionEngine/Orc/TargetProcess/LibraryResolver.cpp index 93c29360b7e3b..7e1d5285463c7 100644 --- a/llvm/lib/ExecutionEngine/Orc/TargetProcess/LibraryResolver.cpp +++ b/llvm/lib/ExecutionEngine/Orc/TargetProcess/LibraryResolver.cpp @@ -184,9 +184,9 @@ class SymbolSearchContext { public: SymbolSearchContext(SymbolQuery &Q) : Q(Q) {} - bool hasSearched(LibraryInfo *Lib) const { return Searched.count(Lib); } + bool hasSearched(const LibraryInfo *Lib) const { return Searched.count(Lib); } - void markSearched(LibraryInfo *Lib) { Searched.insert(Lib); } + void markSearched(const LibraryInfo *Lib) { Searched.insert(Lib); } inline bool allResolved() const { return Q.allResolved(); } @@ -194,7 +194,7 @@ class SymbolSearchContext { private: SymbolQuery &Q; - DenseSet Searched; + DenseSet Searched; }; void LibraryResolver::resolveSymbolsInLibrary( @@ -287,11 +287,15 @@ void LibraryResolver::searchSymbolsInLibraries( SymbolSearchContext Ctx(Q); while (!Ctx.allResolved()) { - auto Libs = LibMgr.getLibraries(S, K); - for (auto &Lib : Libs) { - if (Ctx.hasSearched(Lib.get())) - continue; + std::vector> Libs; + LibMgr.getLibraries(S, K, Libs, [&](const LibraryInfo &Lib) { + return !Ctx.hasSearched(&Lib); + }); + + if (Libs.empty() && !scanLibrariesIfNeeded(K, scanBatchSize)) + break; // no more new libs to scan + for (auto &Lib : Libs) { // can use Async here? resolveSymbolsInLibrary(*Lib, Ctx.query(), Config.Options); Ctx.markSearched(Lib.get()); @@ -299,12 +303,6 @@ void LibraryResolver::searchSymbolsInLibraries( if (Ctx.allResolved()) return; } - - if (Ctx.allResolved()) - return; - - if (!scanLibrariesIfNeeded(K, scanBatchSize)) - break; // no more new libs to scan } };