diff --git a/clang/include/clang/Lex/DependencyDirectivesScanner.h b/clang/include/clang/Lex/DependencyDirectivesScanner.h --- a/clang/include/clang/Lex/DependencyDirectivesScanner.h +++ b/clang/include/clang/Lex/DependencyDirectivesScanner.h @@ -71,24 +71,6 @@ Directive(DirectiveKind K, int Offset) : Kind(K), Offset(Offset) {} }; -/// Simplified token range to track the range of a potentially skippable PP -/// directive. -struct SkippedRange { - /// Offset into the output byte stream of where the skipped directive begins. - int Offset; - - /// The number of bytes that can be skipped before the preprocessing must - /// resume. - int Length; -}; - -/// Computes the potential source ranges that can be skipped by the preprocessor -/// when skipping a directive like #if, #ifdef or #elsif. -/// -/// \returns false on success, true on error. -bool computeSkippedRanges(ArrayRef Input, - llvm::SmallVectorImpl &Range); - } // end namespace dependency_directives_scan /// Minimize the input down to the preprocessor directives that might have diff --git a/clang/include/clang/Lex/Preprocessor.h b/clang/include/clang/Lex/Preprocessor.h --- a/clang/include/clang/Lex/Preprocessor.h +++ b/clang/include/clang/Lex/Preprocessor.h @@ -29,7 +29,6 @@ #include "clang/Lex/ModuleLoader.h" #include "clang/Lex/ModuleMap.h" #include "clang/Lex/PPCallbacks.h" -#include "clang/Lex/PreprocessorExcludedConditionalDirectiveSkipMapping.h" #include "clang/Lex/Token.h" #include "clang/Lex/TokenLexer.h" #include "llvm/ADT/ArrayRef.h" @@ -2585,14 +2584,6 @@ void emitMacroDeprecationWarning(const Token &Identifier) const; void emitRestrictExpansionWarning(const Token &Identifier) const; void emitFinalMacroWarning(const Token &Identifier, bool IsUndef) const; - - Optional - getSkippedRangeForExcludedConditionalBlock(SourceLocation HashLoc); - - /// Contains the currently active skipped range mappings for skipping excluded - /// conditional directives. - ExcludedPreprocessorDirectiveSkipMapping - *ExcludedConditionalDirectiveSkipMappings; }; /// Abstract base class that describes a handler that will receive diff --git a/clang/include/clang/Lex/PreprocessorExcludedConditionalDirectiveSkipMapping.h b/clang/include/clang/Lex/PreprocessorExcludedConditionalDirectiveSkipMapping.h deleted file mode 100644 --- a/clang/include/clang/Lex/PreprocessorExcludedConditionalDirectiveSkipMapping.h +++ /dev/null @@ -1,30 +0,0 @@ -//===- PreprocessorExcludedConditionalDirectiveSkipMapping.h - --*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_CLANG_LEX_PREPROCESSOREXCLUDEDCONDITIONALDIRECTIVESKIPMAPPING_H -#define LLVM_CLANG_LEX_PREPROCESSOREXCLUDEDCONDITIONALDIRECTIVESKIPMAPPING_H - -#include "clang/Basic/LLVM.h" -#include "llvm/ADT/DenseMap.h" -#include "llvm/Support/MemoryBuffer.h" - -namespace clang { - -/// A mapping from an offset into a buffer to the number of bytes that can be -/// skipped by the preprocessor when skipping over excluded conditional -/// directive ranges. -using PreprocessorSkippedRangeMapping = llvm::DenseMap; - -/// The datastructure that holds the mapping between the active memory buffers -/// and the individual skip mappings. -using ExcludedPreprocessorDirectiveSkipMapping = - llvm::DenseMap; - -} // end namespace clang - -#endif // LLVM_CLANG_LEX_PREPROCESSOREXCLUDEDCONDITIONALDIRECTIVESKIPMAPPING_H diff --git a/clang/include/clang/Lex/PreprocessorOptions.h b/clang/include/clang/Lex/PreprocessorOptions.h --- a/clang/include/clang/Lex/PreprocessorOptions.h +++ b/clang/include/clang/Lex/PreprocessorOptions.h @@ -11,7 +11,6 @@ #include "clang/Basic/BitmaskEnum.h" #include "clang/Basic/LLVM.h" -#include "clang/Lex/PreprocessorExcludedConditionalDirectiveSkipMapping.h" #include "llvm/ADT/StringRef.h" #include "llvm/ADT/StringSet.h" #include @@ -200,14 +199,6 @@ /// build it again. std::shared_ptr FailedModules; - /// Contains the currently active skipped range mappings for skipping excluded - /// conditional directives. - /// - /// The pointer is passed to the Preprocessor when it's constructed. The - /// pointer is unowned, the client is responsible for its lifetime. - ExcludedPreprocessorDirectiveSkipMapping - *ExcludedConditionalDirectiveSkipMappings = nullptr; - /// Set up preprocessor for RunAnalysis action. bool SetUpStaticAnalyzer = false; diff --git a/clang/include/clang/Tooling/DependencyScanning/DependencyScanningFilesystem.h b/clang/include/clang/Tooling/DependencyScanning/DependencyScanningFilesystem.h --- a/clang/include/clang/Tooling/DependencyScanning/DependencyScanningFilesystem.h +++ b/clang/include/clang/Tooling/DependencyScanning/DependencyScanningFilesystem.h @@ -10,7 +10,6 @@ #define LLVM_CLANG_TOOLING_DEPENDENCYSCANNING_DEPENDENCYSCANNINGFILESYSTEM_H #include "clang/Basic/LLVM.h" -#include "clang/Lex/PreprocessorExcludedConditionalDirectiveSkipMapping.h" #include "llvm/ADT/DenseSet.h" #include "llvm/ADT/StringMap.h" #include "llvm/Support/Allocator.h" @@ -37,9 +36,6 @@ std::unique_ptr MinimizedStorage; /// Accessor to the directive tokens that's atomic to avoid data races. std::atomic MinimizedAccess; - /// Skipped range mapping of the minimized contents. - /// This is initialized iff `MinimizedAccess != nullptr`. - PreprocessorSkippedRangeMapping PPSkippedRangeMapping; }; /// An in-memory representation of a file system entity that is of interest to @@ -111,15 +107,6 @@ return MaybeStat->getUniqueID(); } - /// \returns The mapping between location -> distance that is used to speed up - /// the block skipping in the preprocessor. - const PreprocessorSkippedRangeMapping &getPPSkippedRangeMapping() const { - assert(!isError() && "error"); - assert(!isDirectory() && "not a file"); - assert(Contents && "contents not initialized"); - return Contents->PPSkippedRangeMapping; - } - /// \returns The data structure holding both contents and directive tokens. CachedFileContents *getCachedContents() const { assert(!isError() && "error"); @@ -271,10 +258,6 @@ StringRef getContents() const { return Minimized ? Entry.getDirectiveTokens() : Entry.getOriginalContents(); } - - const PreprocessorSkippedRangeMapping *getPPSkippedRangeMapping() const { - return Minimized ? &Entry.getPPSkippedRangeMapping() : nullptr; - } }; /// A virtual file system optimized for the dependency discovery. @@ -290,10 +273,8 @@ public: DependencyScanningWorkerFilesystem( DependencyScanningFilesystemSharedCache &SharedCache, - IntrusiveRefCntPtr FS, - ExcludedPreprocessorDirectiveSkipMapping &PPSkipMappings) - : ProxyFileSystem(std::move(FS)), SharedCache(SharedCache), - PPSkipMappings(PPSkipMappings) {} + IntrusiveRefCntPtr FS) + : ProxyFileSystem(std::move(FS)), SharedCache(SharedCache) {} llvm::ErrorOr status(const Twine &Path) override; llvm::ErrorOr> @@ -396,10 +377,6 @@ /// The local cache is used by the worker thread to cache file system queries /// locally instead of querying the global cache every time. DependencyScanningFilesystemLocalCache LocalCache; - /// The mapping structure which records information about the - /// excluded conditional directive skip mappings that are used by the - /// currently active preprocessor. - ExcludedPreprocessorDirectiveSkipMapping &PPSkipMappings; /// The set of files that should not be scanned for PP directives. llvm::DenseSet NotToBeScanned; }; diff --git a/clang/include/clang/Tooling/DependencyScanning/DependencyScanningWorker.h b/clang/include/clang/Tooling/DependencyScanning/DependencyScanningWorker.h --- a/clang/include/clang/Tooling/DependencyScanning/DependencyScanningWorker.h +++ b/clang/include/clang/Tooling/DependencyScanning/DependencyScanningWorker.h @@ -13,7 +13,6 @@ #include "clang/Basic/FileManager.h" #include "clang/Basic/LLVM.h" #include "clang/Frontend/PCHContainerOperations.h" -#include "clang/Lex/PreprocessorExcludedConditionalDirectiveSkipMapping.h" #include "clang/Tooling/DependencyScanning/DependencyScanningService.h" #include "clang/Tooling/DependencyScanning/ModuleDepCollector.h" #include "llvm/Support/Error.h" @@ -69,7 +68,6 @@ private: std::shared_ptr PCHContainerOps; - ExcludedPreprocessorDirectiveSkipMapping PPSkipMappings; /// The physical filesystem overlaid by `InMemoryFS`. llvm::IntrusiveRefCntPtr RealFS; diff --git a/clang/lib/Lex/DependencyDirectivesScanner.cpp b/clang/lib/Lex/DependencyDirectivesScanner.cpp --- a/clang/lib/Lex/DependencyDirectivesScanner.cpp +++ b/clang/lib/Lex/DependencyDirectivesScanner.cpp @@ -933,56 +933,6 @@ return Error; } -bool clang::dependency_directives_scan::computeSkippedRanges( - ArrayRef Input, llvm::SmallVectorImpl &Range) { - struct IfElseDirective { - enum DirectiveKind { - If, // if/ifdef/ifndef - Else // elif/elifdef/elifndef, else - }; - int Offset; - DirectiveKind Kind; - }; - llvm::SmallVector Offsets; - for (const Directive &T : Input) { - switch (T.Kind) { - case pp_if: - case pp_ifdef: - case pp_ifndef: - Offsets.push_back({T.Offset, IfElseDirective::If}); - break; - - case pp_elif: - case pp_elifdef: - case pp_elifndef: - case pp_else: { - if (Offsets.empty()) - return true; - int PreviousOffset = Offsets.back().Offset; - Range.push_back({PreviousOffset, T.Offset - PreviousOffset}); - Offsets.push_back({T.Offset, IfElseDirective::Else}); - break; - } - - case pp_endif: { - if (Offsets.empty()) - return true; - int PreviousOffset = Offsets.back().Offset; - Range.push_back({PreviousOffset, T.Offset - PreviousOffset}); - do { - IfElseDirective::DirectiveKind Kind = Offsets.pop_back_val().Kind; - if (Kind == IfElseDirective::If) - break; - } while (!Offsets.empty()); - break; - } - default: - break; - } - } - return false; -} - bool clang::scanSourceForDependencyDirectives( StringRef Input, SmallVectorImpl &Output, SmallVectorImpl &Directives, DiagnosticsEngine *Diags, diff --git a/clang/lib/Lex/PPDirectives.cpp b/clang/lib/Lex/PPDirectives.cpp --- a/clang/lib/Lex/PPDirectives.cpp +++ b/clang/lib/Lex/PPDirectives.cpp @@ -398,41 +398,6 @@ return DiscardUntilEndOfDirective().getEnd(); } -Optional Preprocessor::getSkippedRangeForExcludedConditionalBlock( - SourceLocation HashLoc) { - if (!ExcludedConditionalDirectiveSkipMappings) - return None; - if (!HashLoc.isFileID()) - return None; - - std::pair HashFileOffset = - SourceMgr.getDecomposedLoc(HashLoc); - Optional Buf = - SourceMgr.getBufferOrNone(HashFileOffset.first); - if (!Buf) - return None; - auto It = - ExcludedConditionalDirectiveSkipMappings->find(Buf->getBufferStart()); - if (It == ExcludedConditionalDirectiveSkipMappings->end()) - return None; - - const PreprocessorSkippedRangeMapping &SkippedRanges = *It->getSecond(); - // Check if the offset of '#' is mapped in the skipped ranges. - auto MappingIt = SkippedRanges.find(HashFileOffset.second); - if (MappingIt == SkippedRanges.end()) - return None; - - unsigned BytesToSkip = MappingIt->getSecond(); - unsigned CurLexerBufferOffset = CurLexer->getCurrentBufferOffset(); - assert(CurLexerBufferOffset >= HashFileOffset.second && - "lexer is before the hash?"); - // Take into account the fact that the lexer has already advanced, so the - // number of bytes to skip must be adjusted. - unsigned LengthDiff = CurLexerBufferOffset - HashFileOffset.second; - assert(BytesToSkip >= LengthDiff && "lexer is after the skipped range?"); - return BytesToSkip - LengthDiff; -} - /// SkipExcludedConditionalBlock - We just read a \#if or related directive and /// decided that the subsequent tokens are in the \#if'd out portion of the /// file. Lex the rest of the file, until we see an \#endif. If @@ -459,11 +424,6 @@ // disabling warnings, etc. CurPPLexer->LexingRawMode = true; Token Tok; - if (auto SkipLength = - getSkippedRangeForExcludedConditionalBlock(HashTokenLoc)) { - // Skip to the next '#endif' / '#else' / '#elif'. - CurLexer->skipOver(*SkipLength); - } SourceLocation endLoc; while (true) { CurLexer->Lex(Tok); diff --git a/clang/lib/Lex/Preprocessor.cpp b/clang/lib/Lex/Preprocessor.cpp --- a/clang/lib/Lex/Preprocessor.cpp +++ b/clang/lib/Lex/Preprocessor.cpp @@ -158,11 +158,6 @@ if (this->PPOpts->GeneratePreamble) PreambleConditionalStack.startRecording(); - ExcludedConditionalDirectiveSkipMappings = - this->PPOpts->ExcludedConditionalDirectiveSkipMappings; - if (ExcludedConditionalDirectiveSkipMappings) - ExcludedConditionalDirectiveSkipMappings->clear(); - MaxTokens = LangOpts.MaxTokens; } diff --git a/clang/lib/Tooling/DependencyScanning/DependencyScanningFilesystem.cpp b/clang/lib/Tooling/DependencyScanning/DependencyScanningFilesystem.cpp --- a/clang/lib/Tooling/DependencyScanning/DependencyScanningFilesystem.cpp +++ b/clang/lib/Tooling/DependencyScanning/DependencyScanningFilesystem.cpp @@ -77,22 +77,6 @@ assert(MinimizedFileContents.data()[MinimizedFileContents.size()] == '\0' && "not null terminated contents"); - // Compute the skipped PP ranges that speedup skipping over inactive - // preprocessor blocks. - llvm::SmallVector SkippedRanges; - dependency_directives_scan::computeSkippedRanges(Tokens, SkippedRanges); - PreprocessorSkippedRangeMapping Mapping; - for (const auto &Range : SkippedRanges) { - if (Range.Length < 16) { - // Ignore small ranges as non-profitable. - // FIXME: This is a heuristic, its worth investigating the tradeoffs - // when it should be applied. - continue; - } - Mapping[Range.Offset] = Range.Length; - } - Contents->PPSkippedRangeMapping = std::move(Mapping); - Contents->MinimizedStorage = std::make_unique( std::move(MinimizedFileContents)); // This function performed double-checked locking using `MinimizedAccess`. @@ -307,9 +291,7 @@ llvm::vfs::Status Stat) : Buffer(std::move(Buffer)), Stat(std::move(Stat)) {} - static llvm::ErrorOr> - create(EntryRef Entry, - ExcludedPreprocessorDirectiveSkipMapping &PPSkipMappings); + static llvm::ErrorOr> create(EntryRef Entry); llvm::ErrorOr status() override { return Stat; } @@ -329,8 +311,7 @@ } // end anonymous namespace llvm::ErrorOr> -DepScanFile::create(EntryRef Entry, - ExcludedPreprocessorDirectiveSkipMapping &PPSkipMappings) { +DepScanFile::create(EntryRef Entry) { assert(!Entry.isError() && "error"); if (Entry.isDirectory()) @@ -342,10 +323,6 @@ /*RequiresNullTerminator=*/false), Entry.getStatus()); - const auto *EntrySkipMappings = Entry.getPPSkippedRangeMapping(); - if (EntrySkipMappings && !EntrySkipMappings->empty()) - PPSkipMappings[Result->Buffer->getBufferStart()] = EntrySkipMappings; - return llvm::ErrorOr>( std::unique_ptr(std::move(Result))); } @@ -358,5 +335,5 @@ llvm::ErrorOr Result = getOrCreateFileSystemEntry(Filename); if (!Result) return Result.getError(); - return DepScanFile::create(Result.get(), PPSkipMappings); + return DepScanFile::create(Result.get()); } diff --git a/clang/lib/Tooling/DependencyScanning/DependencyScanningWorker.cpp b/clang/lib/Tooling/DependencyScanning/DependencyScanningWorker.cpp --- a/clang/lib/Tooling/DependencyScanning/DependencyScanningWorker.cpp +++ b/clang/lib/Tooling/DependencyScanning/DependencyScanningWorker.cpp @@ -137,12 +137,11 @@ DependencyScanningAction( StringRef WorkingDirectory, DependencyConsumer &Consumer, llvm::IntrusiveRefCntPtr DepFS, - ExcludedPreprocessorDirectiveSkipMapping &PPSkipMappings, ScanningOutputFormat Format, bool OptimizeArgs, llvm::Optional ModuleName = None) : WorkingDirectory(WorkingDirectory), Consumer(Consumer), - DepFS(std::move(DepFS)), PPSkipMappings(PPSkipMappings), Format(Format), - OptimizeArgs(OptimizeArgs), ModuleName(ModuleName) {} + DepFS(std::move(DepFS)), Format(Format), OptimizeArgs(OptimizeArgs), + ModuleName(ModuleName) {} bool runInvocation(std::shared_ptr Invocation, FileManager *FileMgr, @@ -201,11 +200,6 @@ // filesystem. FileMgr->setVirtualFileSystem(createVFSFromCompilerInvocation( ScanInstance.getInvocation(), ScanInstance.getDiagnostics(), DepFS)); - - // Pass the skip mappings which should speed up excluded conditional block - // skipping in the preprocessor. - ScanInstance.getPreprocessorOpts() - .ExcludedConditionalDirectiveSkipMappings = &PPSkipMappings; } // Create the dependency collector that will collect the produced @@ -262,7 +256,6 @@ StringRef WorkingDirectory; DependencyConsumer &Consumer; llvm::IntrusiveRefCntPtr DepFS; - ExcludedPreprocessorDirectiveSkipMapping &PPSkipMappings; ScanningOutputFormat Format; bool OptimizeArgs; llvm::Optional ModuleName; @@ -289,7 +282,7 @@ if (Service.getMode() == ScanningMode::DependencyDirectivesScan) DepFS = new DependencyScanningWorkerFilesystem(Service.getSharedCache(), - RealFS, PPSkipMappings); + RealFS); if (Service.canReuseFileManager()) Files = new FileManager(FileSystemOptions(), RealFS); } @@ -340,8 +333,8 @@ return runWithDiags(CreateAndPopulateDiagOpts(FinalCCommandLine).release(), [&](DiagnosticConsumer &DC, DiagnosticOptions &DiagOpts) { DependencyScanningAction Action( - WorkingDirectory, Consumer, DepFS, PPSkipMappings, - Format, OptimizeArgs, ModuleName); + WorkingDirectory, Consumer, DepFS, Format, + OptimizeArgs, ModuleName); // Create an invocation that uses the underlying file // system to ensure that any file system requests that // are made by the driver do not go through the diff --git a/clang/unittests/Lex/DependencyDirectivesScannerTest.cpp b/clang/unittests/Lex/DependencyDirectivesScannerTest.cpp --- a/clang/unittests/Lex/DependencyDirectivesScannerTest.cpp +++ b/clang/unittests/Lex/DependencyDirectivesScannerTest.cpp @@ -801,69 +801,4 @@ EXPECT_EQ(Directives[2].Kind, dependency_directives_scan::cxx_module_decl); } -TEST(MinimizeSourceToDependencyDirectivesTest, SkippedPPRangesBasic) { - SmallString<128> Out; - SmallVector Directives; - StringRef Source = "#ifndef GUARD\n" - "#define GUARD\n" - "void foo();\n" - "#endif\n"; - ASSERT_FALSE(minimizeSourceToDependencyDirectives(Source, Out, Directives)); - SmallVector Ranges; - ASSERT_FALSE(computeSkippedRanges(Directives, Ranges)); - EXPECT_EQ(Ranges.size(), 1u); - EXPECT_EQ(Ranges[0].Offset, 0); - EXPECT_EQ(Ranges[0].Length, (int)Out.find("#endif")); -} - -TEST(MinimizeSourceToDependencyDirectivesTest, SkippedPPRangesBasicElifdef) { - SmallString<128> Out; - SmallVector Directives; - StringRef Source = "#ifdef BLAH\n" - "void skip();\n" - "#elifdef BLAM\n" - "void skip();\n" - "#elifndef GUARD\n" - "#define GUARD\n" - "void foo();\n" - "#endif\n"; - ASSERT_FALSE(minimizeSourceToDependencyDirectives(Source, Out, Directives)); - SmallVector Ranges; - ASSERT_FALSE(computeSkippedRanges(Directives, Ranges)); - EXPECT_EQ(Ranges.size(), 3u); - EXPECT_EQ(Ranges[0].Offset, 0); - EXPECT_EQ(Ranges[0].Length, (int)Out.find("#elifdef")); - EXPECT_EQ(Ranges[1].Offset, (int)Out.find("#elifdef")); - EXPECT_EQ(Ranges[1].Offset + Ranges[1].Length, (int)Out.find("#elifndef")); - EXPECT_EQ(Ranges[2].Offset, (int)Out.find("#elifndef")); - EXPECT_EQ(Ranges[2].Offset + Ranges[2].Length, (int)Out.rfind("#endif")); -} - -TEST(MinimizeSourceToDependencyDirectivesTest, SkippedPPRangesNested) { - SmallString<128> Out; - SmallVector Directives; - StringRef Source = "#ifndef GUARD\n" - "#define GUARD\n" - "#if FOO\n" - "#include hello\n" - "#elif BAR\n" - "#include bye\n" - "#endif\n" - "#else\n" - "#include nothing\n" - "#endif\n"; - ASSERT_FALSE(minimizeSourceToDependencyDirectives(Source, Out, Directives)); - SmallVector Ranges; - ASSERT_FALSE(computeSkippedRanges(Directives, Ranges)); - EXPECT_EQ(Ranges.size(), 4u); - EXPECT_EQ(Ranges[0].Offset, (int)Out.find("#if FOO")); - EXPECT_EQ(Ranges[0].Offset + Ranges[0].Length, (int)Out.find("#elif")); - EXPECT_EQ(Ranges[1].Offset, (int)Out.find("#elif BAR")); - EXPECT_EQ(Ranges[1].Offset + Ranges[1].Length, (int)Out.find("#endif")); - EXPECT_EQ(Ranges[2].Offset, 0); - EXPECT_EQ(Ranges[2].Length, (int)Out.find("#else")); - EXPECT_EQ(Ranges[3].Offset, (int)Out.find("#else")); - EXPECT_EQ(Ranges[3].Offset + Ranges[3].Length, (int)Out.rfind("#endif")); -} - } // end anonymous namespace diff --git a/clang/unittests/Tooling/DependencyScannerTest.cpp b/clang/unittests/Tooling/DependencyScannerTest.cpp --- a/clang/unittests/Tooling/DependencyScannerTest.cpp +++ b/clang/unittests/Tooling/DependencyScannerTest.cpp @@ -212,8 +212,7 @@ "// hi there!\n")); DependencyScanningFilesystemSharedCache SharedCache; - ExcludedPreprocessorDirectiveSkipMapping Mappings; - DependencyScanningWorkerFilesystem DepFS(SharedCache, VFS, Mappings); + DependencyScanningWorkerFilesystem DepFS(SharedCache, VFS); DepFS.enableDirectivesScanningOfAllFiles(); // Let's be explicit for clarity. auto StatusMinimized0 = DepFS.status("/mod.h"); @@ -235,8 +234,7 @@ "// hi there!\n")); DependencyScanningFilesystemSharedCache SharedCache; - ExcludedPreprocessorDirectiveSkipMapping Mappings; - DependencyScanningWorkerFilesystem DepFS(SharedCache, VFS, Mappings); + DependencyScanningWorkerFilesystem DepFS(SharedCache, VFS); DepFS.disableDirectivesScanning("/mod.h"); auto StatusFull0 = DepFS.status("/mod.h");