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//
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
3841private:
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+
115146class ModuleDependencyScanner {
116147public:
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+
137201private:
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
0 commit comments