[clang] [clang] Enable making the `CompilerInstance` module dependency collector thread-safe (PR #137227)
Jan Svoboda via cfe-commits
cfe-commits at lists.llvm.org
Thu Apr 24 11:27:39 PDT 2025
https://github.com/jansvoboda11 created https://github.com/llvm/llvm-project/pull/137227
The same principle as #135473, #135737, #136178, #136601 & #137059.
>From 30fb74c3ff1197a6e1d7cdc8ff52fa2d2c0d9c33 Mon Sep 17 00:00:00 2001
From: Jan Svoboda <jan_svoboda at apple.com>
Date: Thu, 24 Apr 2025 11:26:17 -0700
Subject: [PATCH] [clang] Enable making the `CompilerInstance` module
dependency collector thread-safe
The same principle as #135473, #135737, #136178, #136601 & #137059.
---
clang/include/clang/Frontend/CompilerInstance.h | 13 ++++++++++---
clang/lib/Frontend/CompilerInstance.cpp | 12 ++++++++----
2 files changed, 18 insertions(+), 7 deletions(-)
diff --git a/clang/include/clang/Frontend/CompilerInstance.h b/clang/include/clang/Frontend/CompilerInstance.h
index 8c91a2a86cfcd..b5b4de03e45f1 100644
--- a/clang/include/clang/Frontend/CompilerInstance.h
+++ b/clang/include/clang/Frontend/CompilerInstance.h
@@ -839,16 +839,23 @@ class CompilerInstance : public ModuleLoader {
class ThreadSafeCloneConfig {
IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS;
DiagnosticConsumer &DiagConsumer;
+ std::shared_ptr<ModuleDependencyCollector> ModuleDepCollector;
public:
- ThreadSafeCloneConfig(IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS,
- DiagnosticConsumer &DiagConsumer)
- : VFS(std::move(VFS)), DiagConsumer(DiagConsumer) {
+ ThreadSafeCloneConfig(
+ IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS,
+ DiagnosticConsumer &DiagConsumer,
+ std::shared_ptr<ModuleDependencyCollector> ModuleDepCollector = nullptr)
+ : VFS(std::move(VFS)), DiagConsumer(DiagConsumer),
+ ModuleDepCollector(std::move(ModuleDepCollector)) {
assert(this->VFS && "Clone config requires non-null VFS");
}
IntrusiveRefCntPtr<llvm::vfs::FileSystem> getVFS() const { return VFS; }
DiagnosticConsumer &getDiagConsumer() const { return DiagConsumer; }
+ std::shared_ptr<ModuleDependencyCollector> getModuleDepCollector() const {
+ return ModuleDepCollector;
+ }
};
private:
diff --git a/clang/lib/Frontend/CompilerInstance.cpp b/clang/lib/Frontend/CompilerInstance.cpp
index 1526ea53add7d..58a01459f3c64 100644
--- a/clang/lib/Frontend/CompilerInstance.cpp
+++ b/clang/lib/Frontend/CompilerInstance.cpp
@@ -1257,10 +1257,14 @@ std::unique_ptr<CompilerInstance> CompilerInstance::cloneForModuleCompileImpl(
Instance.GetDependencyDirectives =
GetDependencyDirectives->cloneFor(Instance.getFileManager());
- // If we're collecting module dependencies, we need to share a collector
- // between all of the module CompilerInstances. Other than that, we don't
- // want to produce any dependency output from the module build.
- Instance.setModuleDepCollector(getModuleDepCollector());
+ if (ThreadSafeConfig) {
+ Instance.setModuleDepCollector(ThreadSafeConfig->getModuleDepCollector());
+ } else {
+ // If we're collecting module dependencies, we need to share a collector
+ // between all of the module CompilerInstances. Other than that, we don't
+ // want to produce any dependency output from the module build.
+ Instance.setModuleDepCollector(getModuleDepCollector());
+ }
Inv.getDependencyOutputOpts() = DependencyOutputOptions();
return InstancePtr;
More information about the cfe-commits
mailing list