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(); _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
