[clang] 4fdb10b - [clang][modules] Allow specifying thread-safe module cache (#179510)
via cfe-commits
cfe-commits at lists.llvm.org
Wed Feb 4 09:25:31 PST 2026
Author: Jan Svoboda
Date: 2026-02-04T09:25:26-08:00
New Revision: 4fdb10b052b29a4160f25fdfaebda9c5d8734408
URL: https://github.com/llvm/llvm-project/commit/4fdb10b052b29a4160f25fdfaebda9c5d8734408
DIFF: https://github.com/llvm/llvm-project/commit/4fdb10b052b29a4160f25fdfaebda9c5d8734408.diff
LOG: [clang][modules] Allow specifying thread-safe module cache (#179510)
This PR adds new member to `CompilerInstance::ThreadSafeCloneConfig` to
allow using a different `ModuleCache` instance in the cloned
`CompilerInstance`. This is done so that the original and the clone
can't concurrently work on the same `InMemoryModuleCache`, which is not
thread safe. This will be made use of shortly from the dependency
scanner along with the single-module-parse-mode to compile modules
asynchronously/concurrently.
This also fixes an old comment that incorrectly claimed that
`CompilerInstance`'s constructor is responsible for finalizing
`InMemoryModuleCache` buffers, which is no longer the case.
Added:
Modified:
clang/include/clang/Frontend/CompilerInstance.h
clang/lib/Frontend/CompilerInstance.cpp
Removed:
################################################################################
diff --git a/clang/include/clang/Frontend/CompilerInstance.h b/clang/include/clang/Frontend/CompilerInstance.h
index a3a4c7e55b72b..217efa3fe756e 100644
--- a/clang/include/clang/Frontend/CompilerInstance.h
+++ b/clang/include/clang/Frontend/CompilerInstance.h
@@ -872,20 +872,24 @@ class CompilerInstance : public ModuleLoader {
class ThreadSafeCloneConfig {
IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS;
DiagnosticConsumer &DiagConsumer;
+ std::shared_ptr<ModuleCache> ModCache;
std::shared_ptr<ModuleDependencyCollector> ModuleDepCollector;
public:
ThreadSafeCloneConfig(
IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS,
- DiagnosticConsumer &DiagConsumer,
+ DiagnosticConsumer &DiagConsumer, std::shared_ptr<ModuleCache> ModCache,
std::shared_ptr<ModuleDependencyCollector> ModuleDepCollector = nullptr)
: VFS(std::move(VFS)), DiagConsumer(DiagConsumer),
+ ModCache(std::move(ModCache)),
ModuleDepCollector(std::move(ModuleDepCollector)) {
assert(this->VFS && "Clone config requires non-null VFS");
+ assert(this->ModCache && "Clone config requires non-null ModuleCache");
}
IntrusiveRefCntPtr<llvm::vfs::FileSystem> getVFS() const { return VFS; }
DiagnosticConsumer &getDiagConsumer() const { return DiagConsumer; }
+ std::shared_ptr<ModuleCache> getModuleCache() const { return ModCache; }
std::shared_ptr<ModuleDependencyCollector> getModuleDepCollector() const {
return ModuleDepCollector;
}
diff --git a/clang/lib/Frontend/CompilerInstance.cpp b/clang/lib/Frontend/CompilerInstance.cpp
index ae17e5467c712..ec4e80832b963 100644
--- a/clang/lib/Frontend/CompilerInstance.cpp
+++ b/clang/lib/Frontend/CompilerInstance.cpp
@@ -1167,12 +1167,16 @@ std::unique_ptr<CompilerInstance> CompilerInstance::cloneForModuleCompileImpl(
Invocation->computeContextHash() &&
"Module hash mismatch!");
- // Construct a compiler instance that will be used to actually create the
- // module. Since we're sharing an in-memory module cache,
- // CompilerInstance::CompilerInstance is responsible for finalizing the
- // buffers to prevent use-after-frees.
+ std::shared_ptr<ModuleCache> ModCache;
+ if (ThreadSafeConfig) {
+ ModCache = ThreadSafeConfig->getModuleCache();
+ } else {
+ ModCache = this->ModCache;
+ }
+
+ // Construct a compiler instance that will be used to create the module.
auto InstancePtr = std::make_unique<CompilerInstance>(
- std::move(Invocation), getPCHContainerOperations(), ModCache);
+ std::move(Invocation), getPCHContainerOperations(), std::move(ModCache));
auto &Instance = *InstancePtr;
auto &Inv = Instance.getInvocation();
More information about the cfe-commits
mailing list