1
- // ===--- ModuleDependencyScanner.h - Import Swift modules --------*- C++
2
- // -*-===//
1
+ // ===--- ModuleDependencyScanner.h - Import Swift modules ------*- C++ -*-===//
3
2
//
4
3
// This source file is part of the Swift.org open source project
5
4
//
16
15
#include " swift/AST/ModuleDependencies.h"
17
16
#include " swift/Frontend/ModuleInterfaceLoader.h"
18
17
#include " swift/Serialization/ScanningLoaders.h"
18
+ #include " clang/Tooling/DependencyScanning/DependencyScanningTool.h"
19
19
#include " llvm/CAS/CASReference.h"
20
20
#include " llvm/Support/ThreadPool.h"
21
21
@@ -33,7 +33,10 @@ class ModuleDependencyScanningWorker {
33
33
SwiftDependencyScanningService &globalScanningService,
34
34
const CompilerInvocation &ScanCompilerInvocation,
35
35
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);
37
40
38
41
private:
39
42
// / Retrieve the module dependencies for the Clang module with the given name.
@@ -97,7 +100,7 @@ class ModuleDependencyScanningWorker {
97
100
std::shared_ptr<llvm::cas::ObjectStore> CAS;
98
101
std::shared_ptr<llvm::cas::ActionCache> ActionCache;
99
102
// / File prefix mapper.
100
- std::shared_ptr< llvm::PrefixMapper> PrefixMapper;
103
+ llvm::PrefixMapper * PrefixMapper;
101
104
102
105
// Base command line invocation for clang scanner queries (both module and header)
103
106
std::vector<std::string> clangScanningBaseCommandLineArgs;
@@ -112,13 +115,43 @@ class ModuleDependencyScanningWorker {
112
115
friend class ModuleDependencyScanner ;
113
116
};
114
117
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
+
115
146
class ModuleDependencyScanner {
116
147
public:
117
148
ModuleDependencyScanner (SwiftDependencyScanningService &ScanningService,
118
149
const CompilerInvocation &ScanCompilerInvocation,
119
150
const SILOptions &SILOptions,
120
151
ASTContext &ScanASTContext,
121
152
DependencyTracker &DependencyTracker,
153
+ std::shared_ptr<llvm::cas::ObjectStore> CAS,
154
+ std::shared_ptr<llvm::cas::ActionCache> ActionCache,
122
155
DiagnosticEngine &diags, bool ParallelScan);
123
156
124
157
// / Identify the scanner invocation's main module's dependencies
@@ -134,6 +167,37 @@ class ModuleDependencyScanner {
134
167
// / How many filesystem lookups were performed by the scanner
135
168
unsigned getNumLookups () { return NumLookups; }
136
169
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
+
137
201
private:
138
202
// / Main routine that computes imported module dependency transitive
139
203
// / closure for the given module.
@@ -222,8 +286,13 @@ class ModuleDependencyScanner {
222
286
unsigned NumThreads;
223
287
std::list<std::unique_ptr<ModuleDependencyScanningWorker>> Workers;
224
288
llvm::DefaultThreadPool ScanningThreadPool;
289
+ // CAS instance.
290
+ std::shared_ptr<llvm::cas::ObjectStore> CAS;
291
+ std::shared_ptr<llvm::cas::ActionCache> ActionCache;
225
292
// / 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;
227
296
// / Protect worker access.
228
297
std::mutex WorkersLock;
229
298
// / Count of filesystem queries performed
0 commit comments