66//
77// ===----------------------------------------------------------------------===//
88
9- #include " DependencyScanner .h"
9+ #include " DependencyScannerImpl .h"
1010#include " clang/Basic/DiagnosticFrontend.h"
1111#include " clang/Basic/DiagnosticSerialization.h"
1212#include " clang/Frontend/FrontendActions.h"
@@ -42,32 +42,6 @@ class DependencyConsumerForwarder : public DependencyFileGenerator {
4242 DependencyConsumer &C;
4343};
4444
45- class ScanningDependencyDirectivesGetter : public DependencyDirectivesGetter {
46- DependencyScanningWorkerFilesystem *DepFS;
47-
48- public:
49- ScanningDependencyDirectivesGetter (FileManager &FileMgr) : DepFS(nullptr ) {
50- FileMgr.getVirtualFileSystem ().visit ([&](llvm::vfs::FileSystem &FS) {
51- auto *DFS = llvm::dyn_cast<DependencyScanningWorkerFilesystem>(&FS);
52- if (DFS) {
53- assert (!DepFS && " Found multiple scanning VFSs" );
54- DepFS = DFS;
55- }
56- });
57- assert (DepFS && " Did not find scanning VFS" );
58- }
59-
60- std::unique_ptr<DependencyDirectivesGetter>
61- cloneFor (FileManager &FileMgr) override {
62- return std::make_unique<ScanningDependencyDirectivesGetter>(FileMgr);
63- }
64-
65- std::optional<ArrayRef<dependency_directives_scan::Directive>>
66- operator ()(FileEntryRef File) override {
67- return DepFS->getDirectiveTokens (File.getName ());
68- }
69- };
70-
7145static bool checkHeaderSearchPaths (const HeaderSearchOptions &HSOpts,
7246 const HeaderSearchOptions &ExistingHSOpts,
7347 DiagnosticsEngine *Diags,
@@ -207,6 +181,42 @@ class PrebuiltModuleListener : public ASTReaderListener {
207181 const ArrayRef<StringRef> StableDirs;
208182};
209183
184+ // / Visit the given prebuilt module and collect all of the modules it
185+ // / transitively imports and contributing input files.
186+ static bool visitPrebuiltModule (StringRef PrebuiltModuleFilename,
187+ CompilerInstance &CI,
188+ PrebuiltModuleFilesT &ModuleFiles,
189+ PrebuiltModulesAttrsMap &PrebuiltModulesASTMap,
190+ DiagnosticsEngine &Diags,
191+ const ArrayRef<StringRef> StableDirs) {
192+ // List of module files to be processed.
193+ llvm::SmallVector<std::string> Worklist;
194+
195+ PrebuiltModuleListener Listener (ModuleFiles, Worklist, PrebuiltModulesASTMap,
196+ CI.getHeaderSearchOpts (), CI.getLangOpts (),
197+ Diags, StableDirs);
198+
199+ Listener.visitModuleFile (PrebuiltModuleFilename,
200+ serialization::MK_ExplicitModule);
201+ if (ASTReader::readASTFileControlBlock (
202+ PrebuiltModuleFilename, CI.getFileManager (), CI.getModuleCache (),
203+ CI.getPCHContainerReader (),
204+ /* FindModuleFileExtensions=*/ false , Listener,
205+ /* ValidateDiagnosticOptions=*/ false , ASTReader::ARR_OutOfDate))
206+ return true ;
207+
208+ while (!Worklist.empty ()) {
209+ Listener.visitModuleFile (Worklist.back (), serialization::MK_ExplicitModule);
210+ if (ASTReader::readASTFileControlBlock (
211+ Worklist.pop_back_val (), CI.getFileManager (), CI.getModuleCache (),
212+ CI.getPCHContainerReader (),
213+ /* FindModuleFileExtensions=*/ false , Listener,
214+ /* ValidateDiagnosticOptions=*/ false ))
215+ return true ;
216+ }
217+ return false ;
218+ }
219+
210220// / Transform arbitrary file name into an object-like file name.
211221static std::string makeObjFileName (StringRef FileName) {
212222 SmallString<128 > ObjFileName (FileName);
@@ -297,42 +307,31 @@ static void canonicalizeDefines(PreprocessorOptions &PPOpts) {
297307 std::swap (PPOpts.Macros , NewMacros);
298308}
299309
300- // / Visit the given prebuilt module and collect all of the modules it
301- // / transitively imports and contributing input files.
302- static bool visitPrebuiltModule (StringRef PrebuiltModuleFilename,
303- CompilerInstance &CI,
304- PrebuiltModuleFilesT &ModuleFiles,
305- PrebuiltModulesAttrsMap &PrebuiltModulesASTMap,
306- DiagnosticsEngine &Diags,
307- const ArrayRef<StringRef> StableDirs) {
308- // List of module files to be processed.
309- llvm::SmallVector<std::string> Worklist;
310-
311- PrebuiltModuleListener Listener (ModuleFiles, Worklist, PrebuiltModulesASTMap,
312- CI.getHeaderSearchOpts (), CI.getLangOpts (),
313- Diags, StableDirs);
310+ class ScanningDependencyDirectivesGetter : public DependencyDirectivesGetter {
311+ DependencyScanningWorkerFilesystem *DepFS;
314312
315- Listener.visitModuleFile (PrebuiltModuleFilename,
316- serialization::MK_ExplicitModule);
317- if (ASTReader::readASTFileControlBlock (
318- PrebuiltModuleFilename, CI.getFileManager (), CI.getModuleCache (),
319- CI.getPCHContainerReader (),
320- /* FindModuleFileExtensions=*/ false , Listener,
321- /* ValidateDiagnosticOptions=*/ false , ASTReader::ARR_OutOfDate))
322- return true ;
313+ public:
314+ ScanningDependencyDirectivesGetter (FileManager &FileMgr) : DepFS(nullptr ) {
315+ FileMgr.getVirtualFileSystem ().visit ([&](llvm::vfs::FileSystem &FS) {
316+ auto *DFS = llvm::dyn_cast<DependencyScanningWorkerFilesystem>(&FS);
317+ if (DFS) {
318+ assert (!DepFS && " Found multiple scanning VFSs" );
319+ DepFS = DFS;
320+ }
321+ });
322+ assert (DepFS && " Did not find scanning VFS" );
323+ }
323324
324- while (!Worklist.empty ()) {
325- Listener.visitModuleFile (Worklist.back (), serialization::MK_ExplicitModule);
326- if (ASTReader::readASTFileControlBlock (
327- Worklist.pop_back_val (), CI.getFileManager (), CI.getModuleCache (),
328- CI.getPCHContainerReader (),
329- /* FindModuleFileExtensions=*/ false , Listener,
330- /* ValidateDiagnosticOptions=*/ false ))
331- return true ;
325+ std::unique_ptr<DependencyDirectivesGetter>
326+ cloneFor (FileManager &FileMgr) override {
327+ return std::make_unique<ScanningDependencyDirectivesGetter>(FileMgr);
332328 }
333- return false ;
334- }
335329
330+ std::optional<ArrayRef<dependency_directives_scan::Directive>>
331+ operator ()(FileEntryRef File) override {
332+ return DepFS->getDirectiveTokens (File.getName ());
333+ }
334+ };
336335} // namespace
337336
338337// / Sanitize diagnostic options for dependency scan.
@@ -523,4 +522,4 @@ bool DependencyScanningAction::runInvocation(
523522 setLastCC1Arguments (std::move (OriginalInvocation));
524523
525524 return Result;
526- }
525+ }
0 commit comments