[llvm] [ORC][LibraryResolver] Fix ensureFilterBuilt assertion failure and concurrency issue. (PR #166510)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Nov 5 02:29:57 PST 2025
https://github.com/SahilPatidar updated https://github.com/llvm/llvm-project/pull/166510
>From 2e695a5932015bb4a72550f37116cf7f0ee1c16b Mon Sep 17 00:00:00 2001
From: SahilPatidar <patidarsahil2001 at gmail.com>
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<std::shared_ptr<LibraryInfo>> getLibraries(LibState S,
+ PathType K) const {
+ std::vector<std::shared_ptr<LibraryInfo>> Outs;
+ std::shared_lock<std::shared_mutex> 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<std::shared_mutex> Lock(Mtx);
for (const auto &[_, entry] : Libraries) {
@@ -220,14 +231,14 @@ class LibraryManager {
}
bool isLoaded(StringRef Path) const {
- std::unique_lock<std::shared_mutex> Lock(Mtx);
+ std::shared_lock<std::shared_mutex> 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<std::shared_mutex> Lock(Mtx);
+ std::shared_lock<std::shared_mutex> 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<StringRef> 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 <patidarsahil2001 at gmail.com>
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<std::shared_ptr<LibraryInfo>> getLibraries(LibState S,
- PathType K) const {
- std::vector<std::shared_ptr<LibraryInfo>> Outs;
+ using LibraryFilterFn = std::function<bool(const LibraryInfo &)>;
+ void getLibraries(LibState S, PathType K,
+ std::vector<std::shared_ptr<LibraryInfo>> &Outs,
+ LibraryFilterFn Filter = nullptr) const {
std::shared_lock<std::shared_mutex> 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<LibraryInfo *> Searched;
+ DenseSet<const LibraryInfo *> 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<std::shared_ptr<LibraryInfo>> 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
}
};
More information about the llvm-commits
mailing list