Skip to content

Commit 2a18922

Browse files
[Caching] Move per-query CAS state out of the SwiftDependencyScanningService
Move per-query state out of ScanningService. There is still a check to make sure the CASOptions are matching between queries because of the requirement on clang scanner. Otherwise, the scanning service should contain no per-query information anymore. Resolves: #82490
1 parent 7460ce1 commit 2a18922

File tree

9 files changed

+270
-311
lines changed

9 files changed

+270
-311
lines changed

include/swift/AST/ModuleDependencies.h

Lines changed: 0 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -25,22 +25,13 @@
2525
#include "swift/Serialization/Validation.h"
2626
#include "clang/CAS/CASOptions.h"
2727
#include "clang/Tooling/DependencyScanning/DependencyScanningService.h"
28-
#include "clang/Tooling/DependencyScanning/DependencyScanningTool.h"
2928
#include "clang/Tooling/DependencyScanning/ModuleDepCollector.h"
3029
#include "llvm/ADT/ArrayRef.h"
3130
#include "llvm/ADT/DenseSet.h"
3231
#include "llvm/ADT/IntrusiveRefCntPtr.h"
3332
#include "llvm/ADT/StringSet.h"
34-
#include "llvm/CAS/ActionCache.h"
35-
#include "llvm/CAS/CASProvidingFileSystem.h"
36-
#include "llvm/CAS/CASReference.h"
3733
#include "llvm/CAS/CachingOnDiskFileSystem.h"
38-
#include "llvm/CAS/ObjectStore.h"
39-
#include "llvm/Support/Error.h"
40-
#include "llvm/Support/MemoryBuffer.h"
4134
#include "llvm/Support/Mutex.h"
42-
#include "llvm/Support/PrefixMapper.h"
43-
#include "llvm/Support/VirtualFileSystem.h"
4435
#include <optional>
4536
#include <string>
4637
#include <unordered_map>
@@ -945,34 +936,6 @@ using ModuleDependenciesKindMap =
945936
std::unordered_map<ModuleDependencyKind, ModuleNameToDependencyMap,
946937
ModuleDependencyKindHash>;
947938

948-
// MARK: SwiftDependencyTracker
949-
/// Track swift dependency
950-
class SwiftDependencyTracker {
951-
public:
952-
SwiftDependencyTracker(std::shared_ptr<llvm::cas::ObjectStore> CAS,
953-
llvm::PrefixMapper *Mapper,
954-
const CompilerInvocation &CI);
955-
956-
void startTracking(bool includeCommonDeps = true);
957-
void trackFile(const Twine &path);
958-
llvm::Expected<llvm::cas::ObjectProxy> createTreeFromDependencies();
959-
960-
private:
961-
llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> FS;
962-
std::shared_ptr<llvm::cas::ObjectStore> CAS;
963-
llvm::PrefixMapper *Mapper;
964-
965-
struct FileEntry {
966-
llvm::cas::ObjectRef FileRef;
967-
size_t Size;
968-
969-
FileEntry(llvm::cas::ObjectRef FileRef, size_t Size)
970-
: FileRef(FileRef), Size(Size) {}
971-
};
972-
llvm::StringMap<FileEntry> CommonFiles;
973-
std::map<std::string, FileEntry> TrackedFiles;
974-
};
975-
976939
// MARK: SwiftDependencyScanningService
977940
/// A carrier of state shared among possibly multiple invocations of the
978941
/// dependency scanner.
@@ -984,21 +947,6 @@ class SwiftDependencyScanningService {
984947
std::optional<clang::tooling::dependencies::DependencyScanningService>
985948
ClangScanningService;
986949

987-
/// CachingOnDiskFileSystem for dependency tracking.
988-
llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> CacheFS;
989-
990-
/// CAS Instance.
991-
std::shared_ptr<llvm::cas::ObjectStore> CAS;
992-
std::shared_ptr<llvm::cas::ActionCache> ActionCache;
993-
994-
/// File prefix mapper.
995-
std::shared_ptr<llvm::PrefixMapper> Mapper;
996-
997-
/// The global file system cache.
998-
std::optional<
999-
clang::tooling::dependencies::DependencyScanningFilesystemSharedCache>
1000-
SharedFilesystemCache;
1001-
1002950
/// Shared state mutual-exclusivity lock
1003951
mutable llvm::sys::SmartMutex<true> ScanningServiceGlobalLock;
1004952

@@ -1010,52 +958,6 @@ class SwiftDependencyScanningService {
1010958
operator=(const SwiftDependencyScanningService &) = delete;
1011959
virtual ~SwiftDependencyScanningService() {}
1012960

1013-
/// Query the service's filesystem cache
1014-
clang::tooling::dependencies::DependencyScanningFilesystemSharedCache &getSharedCache() {
1015-
assert(SharedFilesystemCache && "Expected a shared cache");
1016-
return *SharedFilesystemCache;
1017-
}
1018-
1019-
/// Query the service's filesystem cache
1020-
clang::tooling::dependencies::DependencyScanningFilesystemSharedCache &
1021-
getSharedFilesystemCache() {
1022-
assert(SharedFilesystemCache && "Expected a shared cache");
1023-
return *SharedFilesystemCache;
1024-
}
1025-
1026-
llvm::vfs::FileSystem &getSharedCachingFS() const {
1027-
assert(CacheFS && "Expect a CASFileSystem");
1028-
return *CacheFS;
1029-
}
1030-
1031-
llvm::cas::ObjectStore &getCAS() const {
1032-
assert(CAS && "Expect CAS available");
1033-
return *CAS;
1034-
}
1035-
1036-
std::optional<SwiftDependencyTracker>
1037-
createSwiftDependencyTracker(const CompilerInvocation &CI) {
1038-
if (!CAS)
1039-
return std::nullopt;
1040-
1041-
return SwiftDependencyTracker(CAS, Mapper.get(), CI);
1042-
}
1043-
1044-
llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem>
1045-
getClangScanningFS(ASTContext &ctx) const;
1046-
1047-
bool hasPathMapping() const {
1048-
return Mapper && !Mapper->getMappings().empty();
1049-
}
1050-
llvm::PrefixMapper *getPrefixMapper() const { return Mapper.get(); }
1051-
std::string remapPath(StringRef Path) const {
1052-
if (!Mapper)
1053-
return Path.str();
1054-
return Mapper->mapToString(Path);
1055-
}
1056-
1057-
bool hasCAS() const { return (bool)CAS; }
1058-
1059961
/// Setup caching service.
1060962
bool setupCachingDependencyScanningService(CompilerInstance &Instance);
1061963

include/swift/AST/ModuleLoader.h

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,6 @@
2424
#include "swift/Basic/LLVM.h"
2525
#include "swift/Basic/Located.h"
2626
#include "swift/Basic/SourceLoc.h"
27-
#include "clang/Basic/FileManager.h"
28-
#include "llvm/ADT/IntrusiveRefCntPtr.h"
2927
#include "llvm/ADT/SetVector.h"
3028
#include "llvm/ADT/StringSet.h"
3129
#include "llvm/ADT/TinyPtrVector.h"
@@ -38,11 +36,8 @@ class FileCollectorBase;
3836
class PrefixMapper;
3937
namespace vfs {
4038
class OutputBackend;
41-
}
42-
namespace cas {
43-
class CachingOnDiskFileSystem;
44-
}
45-
}
39+
} // namespace vfs
40+
} // namespace llvm
4641

4742
namespace clang {
4843
class DependencyCollector;

include/swift/DependencyScan/ModuleDependencyScanner.h

Lines changed: 74 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
//===--- ModuleDependencyScanner.h - Import Swift modules --------*- C++
2-
//-*-===//
1+
//===--- ModuleDependencyScanner.h - Import Swift modules ------*- C++ -*-===//
32
//
43
// This source file is part of the Swift.org open source project
54
//
@@ -16,6 +15,7 @@
1615
#include "swift/AST/ModuleDependencies.h"
1716
#include "swift/Frontend/ModuleInterfaceLoader.h"
1817
#include "swift/Serialization/ScanningLoaders.h"
18+
#include "clang/Tooling/DependencyScanning/DependencyScanningTool.h"
1919
#include "llvm/CAS/CASReference.h"
2020
#include "llvm/Support/ThreadPool.h"
2121

@@ -33,7 +33,10 @@ class ModuleDependencyScanningWorker {
3333
SwiftDependencyScanningService &globalScanningService,
3434
const CompilerInvocation &ScanCompilerInvocation,
3535
const SILOptions &SILOptions, ASTContext &ScanASTContext,
36-
DependencyTracker &DependencyTracker, DiagnosticEngine &diags);
36+
DependencyTracker &DependencyTracker,
37+
std::shared_ptr<llvm::cas::ObjectStore> CAS,
38+
std::shared_ptr<llvm::cas::ActionCache> ActionCache,
39+
llvm::PrefixMapper *mapper, DiagnosticEngine &diags);
3740

3841
private:
3942
/// Retrieve the module dependencies for the Clang module with the given name.
@@ -97,7 +100,7 @@ class ModuleDependencyScanningWorker {
97100
std::shared_ptr<llvm::cas::ObjectStore> CAS;
98101
std::shared_ptr<llvm::cas::ActionCache> ActionCache;
99102
/// File prefix mapper.
100-
std::shared_ptr<llvm::PrefixMapper> PrefixMapper;
103+
llvm::PrefixMapper *PrefixMapper;
101104

102105
// Base command line invocation for clang scanner queries (both module and header)
103106
std::vector<std::string> clangScanningBaseCommandLineArgs;
@@ -112,13 +115,43 @@ class ModuleDependencyScanningWorker {
112115
friend class ModuleDependencyScanner;
113116
};
114117

118+
// MARK: SwiftDependencyTracker
119+
/// Track swift dependency
120+
class SwiftDependencyTracker {
121+
public:
122+
SwiftDependencyTracker(std::shared_ptr<llvm::cas::ObjectStore> CAS,
123+
llvm::PrefixMapper *Mapper,
124+
const CompilerInvocation &CI);
125+
126+
void startTracking(bool includeCommonDeps = true);
127+
void trackFile(const Twine &path);
128+
llvm::Expected<llvm::cas::ObjectProxy> createTreeFromDependencies();
129+
130+
private:
131+
llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> FS;
132+
std::shared_ptr<llvm::cas::ObjectStore> CAS;
133+
llvm::PrefixMapper *Mapper;
134+
135+
struct FileEntry {
136+
llvm::cas::ObjectRef FileRef;
137+
size_t Size;
138+
139+
FileEntry(llvm::cas::ObjectRef FileRef, size_t Size)
140+
: FileRef(FileRef), Size(Size) {}
141+
};
142+
llvm::StringMap<FileEntry> CommonFiles;
143+
std::map<std::string, FileEntry> TrackedFiles;
144+
};
145+
115146
class ModuleDependencyScanner {
116147
public:
117148
ModuleDependencyScanner(SwiftDependencyScanningService &ScanningService,
118149
const CompilerInvocation &ScanCompilerInvocation,
119150
const SILOptions &SILOptions,
120151
ASTContext &ScanASTContext,
121152
DependencyTracker &DependencyTracker,
153+
std::shared_ptr<llvm::cas::ObjectStore> CAS,
154+
std::shared_ptr<llvm::cas::ActionCache> ActionCache,
122155
DiagnosticEngine &diags, bool ParallelScan);
123156

124157
/// Identify the scanner invocation's main module's dependencies
@@ -134,6 +167,37 @@ class ModuleDependencyScanner {
134167
/// How many filesystem lookups were performed by the scanner
135168
unsigned getNumLookups() { return NumLookups; }
136169

170+
/// CAS Dependency Tracker.
171+
std::optional<SwiftDependencyTracker>
172+
createSwiftDependencyTracker(const CompilerInvocation &CI) {
173+
if (!CAS)
174+
return std::nullopt;
175+
176+
return SwiftDependencyTracker(CAS, PrefixMapper.get(), CI);
177+
}
178+
179+
/// PrefixMapper for scanner.
180+
bool hasPathMapping() const {
181+
return PrefixMapper && !PrefixMapper->getMappings().empty();
182+
}
183+
llvm::PrefixMapper *getPrefixMapper() const { return PrefixMapper.get(); }
184+
std::string remapPath(StringRef Path) const {
185+
if (!PrefixMapper)
186+
return Path.str();
187+
return PrefixMapper->mapToString(Path);
188+
}
189+
190+
/// CAS options.
191+
llvm::cas::ObjectStore &getCAS() const {
192+
assert(CAS && "Expect CAS available");
193+
return *CAS;
194+
}
195+
196+
llvm::vfs::FileSystem &getSharedCachingFS() const {
197+
assert(CacheFS && "Expect CacheFS available");
198+
return *CacheFS;
199+
}
200+
137201
private:
138202
/// Main routine that computes imported module dependency transitive
139203
/// closure for the given module.
@@ -222,8 +286,13 @@ class ModuleDependencyScanner {
222286
unsigned NumThreads;
223287
std::list<std::unique_ptr<ModuleDependencyScanningWorker>> Workers;
224288
llvm::DefaultThreadPool ScanningThreadPool;
289+
// CAS instance.
290+
std::shared_ptr<llvm::cas::ObjectStore> CAS;
291+
std::shared_ptr<llvm::cas::ActionCache> ActionCache;
225292
/// File prefix mapper.
226-
std::shared_ptr<llvm::PrefixMapper> PrefixMapper;
293+
std::unique_ptr<llvm::PrefixMapper> PrefixMapper;
294+
/// CAS file system for loading file content.
295+
llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> CacheFS;
227296
/// Protect worker access.
228297
std::mutex WorkersLock;
229298
/// Count of filesystem queries performed

include/swift/DependencyScan/ScanDependencies.h

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@
2222

2323
namespace llvm {
2424
class StringSaver;
25+
namespace cas {
26+
class ObjectStore;
27+
} // namespace cas
2528
namespace vfs {
2629
class FileSystem;
2730
} // namespace vfs
@@ -77,18 +80,18 @@ namespace incremental {
7780
/// than the serialized dependency graph, it is considered invalidated and must
7881
/// be re-scanned.
7982
void validateInterModuleDependenciesCache(
80-
const SwiftDependencyScanningService &service,
8183
const ModuleDependencyID &rootModuleID, ModuleDependenciesCache &cache,
84+
std::shared_ptr<llvm::cas::ObjectStore> cas,
8285
const llvm::sys::TimePoint<> &cacheTimeStamp, llvm::vfs::FileSystem &fs,
8386
DiagnosticEngine &diags, bool emitRemarks = false);
8487

8588
/// Perform a postorder DFS to locate modules whose build recipe is out-of-date
8689
/// with respect to their inputs. Upon encountering such a module, add it to the
8790
/// set of invalidated modules, along with the path from the root to this
8891
/// module.
89-
void outOfDateModuleScan(const SwiftDependencyScanningService &service,
90-
const ModuleDependencyID &sourceModuleID,
92+
void outOfDateModuleScan(const ModuleDependencyID &sourceModuleID,
9193
const ModuleDependenciesCache &cache,
94+
std::shared_ptr<llvm::cas::ObjectStore> cas,
9295
const llvm::sys::TimePoint<> &cacheTimeStamp,
9396
llvm::vfs::FileSystem &fs, DiagnosticEngine &diags,
9497
bool emitRemarks, ModuleDependencyIDSet &visited,
@@ -97,8 +100,8 @@ void outOfDateModuleScan(const SwiftDependencyScanningService &service,
97100
/// Validate whether all inputs of a given module dependency
98101
/// are older than the cache serialization time.
99102
bool verifyModuleDependencyUpToDate(
100-
const SwiftDependencyScanningService &service,
101103
const ModuleDependencyID &moduleID, const ModuleDependenciesCache &cache,
104+
std::shared_ptr<llvm::cas::ObjectStore> cas,
102105
const llvm::sys::TimePoint<> &cacheTimeStamp, llvm::vfs::FileSystem &fs,
103106
DiagnosticEngine &diags, bool emitRemarks);
104107
} // end namespace incremental

0 commit comments

Comments
 (0)