Skip to content

Commit 42666e6

Browse files
committed
[clang][DepScan] Remove unused -ivfsoverlay files
`-ivfsoverlay` files are unused when building most modules. Enable removing them by, * adding a way to visit the filesystem tree with extensible RTTI to access each `RedirectingFileSystem`. * Adding tracking to `RedirectingFileSystem` to record when it actually redirects a file access. * Storing this information in each PCM. Usage tracking is only enabled when iterating over the source manager and affecting modulemaps. Here each path is stated to cause an access. During scanning these stats all hit the cache.
1 parent 2f490f9 commit 42666e6

26 files changed

+947
-79
lines changed

clang/include/clang/Basic/DiagnosticSerializationKinds.td

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,9 @@ def err_pch_diagopt_mismatch : Error<"%0 is currently enabled, but was not in "
4444
"the PCH file">;
4545
def err_pch_modulecache_mismatch : Error<"PCH was compiled with module cache "
4646
"path '%0', but the path is currently '%1'">;
47+
def err_pch_vfsoverlay_mismatch : Error<"PCH was compiled with different VFS overlay files than are currently in use">;
48+
def note_pch_vfsoverlay_files : Note<"%select{PCH|current translation unit}0 has the following VFS overlays:\n%1">;
49+
def note_pch_vfsoverlay_empty : Note<"%select{PCH|current translation unit}0 has no VFS overlays">;
4750

4851
def err_pch_version_too_old : Error<
4952
"PCH file uses an older PCH format that is no longer supported">;

clang/include/clang/Basic/FileManager.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,10 @@ class FileManager : public RefCountedBase<FileManager> {
248248
return FS;
249249
}
250250

251+
/// Enable or disable tracking of VFS usage. Used to not track full header
252+
/// search and implicit modulemap lookup.
253+
void trackVFSUsage(bool Active);
254+
251255
void setVirtualFileSystem(IntrusiveRefCntPtr<llvm::vfs::FileSystem> FS) {
252256
this->FS = std::move(FS);
253257
}

clang/include/clang/Lex/HeaderSearch.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -576,6 +576,13 @@ class HeaderSearch {
576576
/// Note: implicit module maps don't contribute to entry usage.
577577
std::vector<bool> computeUserEntryUsage() const;
578578

579+
/// Collect which HeaderSearchOptions::VFSOverlayFiles have been meaningfully
580+
/// used so far and mark their index with 'true' in the resulting bit vector.
581+
///
582+
/// Note: this ignores VFSs that redirect non-affecting files such as unused
583+
/// modulemaps.
584+
std::vector<bool> collectVFSUsageAndClear() const;
585+
579586
/// This method returns a HeaderMap for the specified
580587
/// FileEntry, uniquing them through the 'HeaderMaps' datastructure.
581588
const HeaderMap *CreateHeaderMap(FileEntryRef FE);

clang/include/clang/Lex/HeaderSearchOptions.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,10 @@ class HeaderSearchOptions {
263263
LLVM_PREFERRED_TYPE(bool)
264264
unsigned ModulesStrictContextHash : 1;
265265

266+
/// Whether to include ivfsoverlay usage information in written AST files.
267+
LLVM_PREFERRED_TYPE(bool)
268+
unsigned ModulesIncludeVFSUsage : 1;
269+
266270
HeaderSearchOptions(StringRef _Sysroot = "/")
267271
: Sysroot(_Sysroot), ModuleFormat("raw"), DisableModuleHash(false),
268272
ImplicitModuleMaps(false), ModuleMapFileHomeIsCwd(false),
@@ -277,7 +281,7 @@ class HeaderSearchOptions {
277281
ModulesSkipDiagnosticOptions(false),
278282
ModulesSkipHeaderSearchPaths(false),
279283
ModulesSkipPragmaDiagnosticMappings(false), ModulesHashContent(false),
280-
ModulesStrictContextHash(false) {}
284+
ModulesStrictContextHash(false), ModulesIncludeVFSUsage(false) {}
281285

282286
/// AddPath - Add the \p Path path to the specified \p Group list.
283287
void AddPath(StringRef Path, frontend::IncludeDirGroup Group,

clang/include/clang/Serialization/ASTBitCodes.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -405,6 +405,9 @@ enum UnhashedControlBlockRecordTypes {
405405

406406
/// Record code for the indices of used header search entries.
407407
HEADER_SEARCH_ENTRY_USAGE,
408+
409+
/// Record code for the indices of used VFSs.
410+
VFS_USAGE,
408411
};
409412

410413
/// Record code for extension blocks.

clang/include/clang/Serialization/ASTReader.h

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1780,12 +1780,13 @@ class ASTReader
17801780
/// Read the control block for the named AST file.
17811781
///
17821782
/// \returns true if an error occurred, false otherwise.
1783-
static bool readASTFileControlBlock(StringRef Filename, FileManager &FileMgr,
1784-
const InMemoryModuleCache &ModuleCache,
1785-
const PCHContainerReader &PCHContainerRdr,
1786-
bool FindModuleFileExtensions,
1787-
ASTReaderListener &Listener,
1788-
bool ValidateDiagnosticOptions);
1783+
static bool readASTFileControlBlock(
1784+
StringRef Filename, FileManager &FileMgr,
1785+
const InMemoryModuleCache &ModuleCache,
1786+
const PCHContainerReader &PCHContainerRdr, bool FindModuleFileExtensions,
1787+
ASTReaderListener &Listener, bool ValidateDiagnosticOptions,
1788+
unsigned ClientLoadCapabilities = ARR_ConfigurationMismatch |
1789+
ARR_OutOfDate);
17891790

17901791
/// Determine whether the given AST file is acceptable to load into a
17911792
/// translation unit with the given language and target options.
@@ -2270,6 +2271,9 @@ class ASTReader
22702271
SourceRange ReadSourceRange(ModuleFile &F, const RecordData &Record,
22712272
unsigned &Idx, LocSeq *Seq = nullptr);
22722273

2274+
static llvm::BitVector ReadBitVector(const RecordData &Record,
2275+
const StringRef Blob);
2276+
22732277
// Read a string
22742278
static std::string ReadString(const RecordDataImpl &Record, unsigned &Idx);
22752279

clang/include/clang/Serialization/ASTWriter.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -467,10 +467,10 @@ class ASTWriter : public ASTDeserializationListener,
467467
std::vector<SourceRange> NonAffectingRanges;
468468
std::vector<SourceLocation::UIntTy> NonAffectingOffsetAdjustments;
469469

470-
/// Collects input files that didn't affect compilation of the current module,
470+
/// Computes input files that didn't affect compilation of the current module,
471471
/// and initializes data structures necessary for leaving those files out
472472
/// during \c SourceManager serialization.
473-
void collectNonAffectingInputFiles();
473+
void computeNonAffectingInputFiles();
474474

475475
/// Returns an adjusted \c FileID, accounting for any non-affecting input
476476
/// files.

clang/include/clang/Serialization/ModuleFile.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,9 @@ class ModuleFile {
189189
/// The bit vector denoting usage of each header search entry (true = used).
190190
llvm::BitVector SearchPathUsage;
191191

192+
/// The bit vector denoting usage of each VFS entry (true = used).
193+
llvm::BitVector VFSUsage;
194+
192195
/// Whether this module has been directly imported by the
193196
/// user.
194197
bool DirectlyImported = false;

clang/include/clang/Tooling/DependencyScanning/DependencyScanningFilesystem.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -280,8 +280,12 @@ class EntryRef {
280280
/// This is not a thread safe VFS. A single instance is meant to be used only in
281281
/// one thread. Multiple instances are allowed to service multiple threads
282282
/// running in parallel.
283-
class DependencyScanningWorkerFilesystem : public llvm::vfs::ProxyFileSystem {
283+
class DependencyScanningWorkerFilesystem
284+
: public llvm::RTTIExtends<DependencyScanningWorkerFilesystem,
285+
llvm::vfs::ProxyFileSystem> {
284286
public:
287+
static const char ID;
288+
285289
DependencyScanningWorkerFilesystem(
286290
DependencyScanningFilesystemSharedCache &SharedCache,
287291
IntrusiveRefCntPtr<llvm::vfs::FileSystem> FS);

clang/include/clang/Tooling/DependencyScanning/DependencyScanningService.h

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,9 @@ enum class ScanningOutputFormat {
4545
P1689,
4646
};
4747

48+
#define DSS_LAST_BITMASK_ENUM(Id) \
49+
LLVM_MARK_AS_BITMASK_ENUM(Id), All = llvm::NextPowerOf2(Id) - 1
50+
4851
enum class ScanningOptimizations {
4952
None = 0,
5053

@@ -54,11 +57,15 @@ enum class ScanningOptimizations {
5457
/// Remove warnings from system modules.
5558
SystemWarnings = 2,
5659

57-
LLVM_MARK_AS_BITMASK_ENUM(SystemWarnings),
58-
All = HeaderSearch | SystemWarnings,
60+
/// Remove unused -ivfsoverlay arguments.
61+
VFS = 4,
62+
63+
DSS_LAST_BITMASK_ENUM(VFS),
5964
Default = All
6065
};
6166

67+
#undef DSS_LAST_BITMASK_ENUM
68+
6269
/// The dependency scanning service contains shared configuration and state that
6370
/// is used by the individual dependency scanning workers.
6471
class DependencyScanningService {

clang/lib/Basic/FileManager.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -363,6 +363,13 @@ llvm::Expected<FileEntryRef> FileManager::getSTDIN() {
363363
return *STDIN;
364364
}
365365

366+
void FileManager::trackVFSUsage(bool Active) {
367+
FS->visit([Active](llvm::vfs::FileSystem &FileSys) {
368+
if (auto *RFS = dyn_cast<llvm::vfs::RedirectingFileSystem>(&FileSys))
369+
RFS->setUsageTrackingActive(Active);
370+
});
371+
}
372+
366373
const FileEntry *FileManager::getVirtualFile(StringRef Filename, off_t Size,
367374
time_t ModificationTime) {
368375
return &getVirtualFileRef(Filename, Size, ModificationTime).getFileEntry();

clang/lib/Frontend/CompilerInvocation.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4763,6 +4763,7 @@ std::string CompilerInvocation::getModuleHash() const {
47634763
if (hsOpts.ModulesStrictContextHash) {
47644764
HBuilder.addRange(hsOpts.SystemHeaderPrefixes);
47654765
HBuilder.addRange(hsOpts.UserEntries);
4766+
HBuilder.addRange(hsOpts.VFSOverlayFiles);
47664767

47674768
const DiagnosticOptions &diagOpts = getDiagnosticOpts();
47684769
#define DIAGOPT(Name, Bits, Default) HBuilder.add(diagOpts.Name);

clang/lib/Lex/HeaderSearch.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,28 @@ std::vector<bool> HeaderSearch::computeUserEntryUsage() const {
141141
return UserEntryUsage;
142142
}
143143

144+
std::vector<bool> HeaderSearch::collectVFSUsageAndClear() const {
145+
std::vector<bool> VFSUsage;
146+
if (!getHeaderSearchOpts().ModulesIncludeVFSUsage)
147+
return VFSUsage;
148+
149+
llvm::vfs::FileSystem &RootFS = FileMgr.getVirtualFileSystem();
150+
// TODO: This only works if the `RedirectingFileSystem`s were all created by
151+
// `createVFSFromOverlayFiles`.
152+
RootFS.visit([&](llvm::vfs::FileSystem &FS) {
153+
if (auto *RFS = dyn_cast<llvm::vfs::RedirectingFileSystem>(&FS)) {
154+
VFSUsage.push_back(RFS->hasBeenUsed());
155+
RFS->clearHasBeenUsed();
156+
}
157+
});
158+
assert(VFSUsage.size() == getHeaderSearchOpts().VFSOverlayFiles.size() &&
159+
"A different number of RedirectingFileSystem's were present than "
160+
"-ivfsoverlay options passed to Clang!");
161+
// VFS visit order is the opposite of VFSOverlayFiles order.
162+
std::reverse(VFSUsage.begin(), VFSUsage.end());
163+
return VFSUsage;
164+
}
165+
144166
/// CreateHeaderMap - This method returns a HeaderMap for the specified
145167
/// FileEntry, uniquing them through the 'HeaderMaps' datastructure.
146168
const HeaderMap *HeaderSearch::CreateHeaderMap(FileEntryRef FE) {

clang/lib/Serialization/ASTReader.cpp

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4977,7 +4977,7 @@ ASTReader::ASTReadResult ASTReader::readUnhashedControlBlockImpl(
49774977
}
49784978
case HEADER_SEARCH_PATHS: {
49794979
bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
4980-
if (!AllowCompatibleConfigurationMismatch &&
4980+
if (Listener && !AllowCompatibleConfigurationMismatch &&
49814981
ParseHeaderSearchPaths(Record, Complain, *Listener))
49824982
Result = ConfigurationMismatch;
49834983
break;
@@ -4992,15 +4992,12 @@ ASTReader::ASTReadResult ASTReader::readUnhashedControlBlockImpl(
49924992
Record.begin(), Record.end());
49934993
break;
49944994
case HEADER_SEARCH_ENTRY_USAGE:
4995-
if (!F)
4996-
break;
4997-
unsigned Count = Record[0];
4998-
const char *Byte = Blob.data();
4999-
F->SearchPathUsage = llvm::BitVector(Count, false);
5000-
for (unsigned I = 0; I < Count; ++Byte)
5001-
for (unsigned Bit = 0; Bit < 8 && I < Count; ++Bit, ++I)
5002-
if (*Byte & (1 << Bit))
5003-
F->SearchPathUsage[I] = true;
4995+
if (F)
4996+
F->SearchPathUsage = ReadBitVector(Record, Blob);
4997+
break;
4998+
case VFS_USAGE:
4999+
if (F)
5000+
F->VFSUsage = ReadBitVector(Record, Blob);
50045001
break;
50055002
}
50065003
}
@@ -5398,7 +5395,8 @@ bool ASTReader::readASTFileControlBlock(
53985395
StringRef Filename, FileManager &FileMgr,
53995396
const InMemoryModuleCache &ModuleCache,
54005397
const PCHContainerReader &PCHContainerRdr, bool FindModuleFileExtensions,
5401-
ASTReaderListener &Listener, bool ValidateDiagnosticOptions) {
5398+
ASTReaderListener &Listener, bool ValidateDiagnosticOptions,
5399+
unsigned ClientLoadCapabilities) {
54025400
// Open the AST file.
54035401
std::unique_ptr<llvm::MemoryBuffer> OwnedBuffer;
54045402
llvm::MemoryBuffer *Buffer = ModuleCache.lookupPCM(Filename);
@@ -5453,7 +5451,7 @@ bool ASTReader::readASTFileControlBlock(
54535451
switch (Entry.ID) {
54545452
case OPTIONS_BLOCK_ID: {
54555453
std::string IgnoredSuggestedPredefines;
5456-
if (ReadOptionsBlock(Stream, ARR_ConfigurationMismatch | ARR_OutOfDate,
5454+
if (ReadOptionsBlock(Stream, ClientLoadCapabilities,
54575455
/*AllowCompatibleConfigurationMismatch*/ false,
54585456
Listener, IgnoredSuggestedPredefines) != Success)
54595457
return true;
@@ -5679,7 +5677,7 @@ bool ASTReader::readASTFileControlBlock(
56795677

56805678
// Scan for the UNHASHED_CONTROL_BLOCK_ID block.
56815679
if (readUnhashedControlBlockImpl(
5682-
nullptr, Bytes, ARR_ConfigurationMismatch | ARR_OutOfDate,
5680+
nullptr, Bytes, ClientLoadCapabilities,
56835681
/*AllowCompatibleConfigurationMismatch*/ false, &Listener,
56845682
ValidateDiagnosticOptions) != Success)
56855683
return true;
@@ -9316,6 +9314,18 @@ SourceRange ASTReader::ReadSourceRange(ModuleFile &F, const RecordData &Record,
93169314
return SourceRange(beg, end);
93179315
}
93189316

9317+
llvm::BitVector ASTReader::ReadBitVector(const RecordData &Record,
9318+
const StringRef Blob) {
9319+
unsigned Count = Record[0];
9320+
const char *Byte = Blob.data();
9321+
llvm::BitVector Ret = llvm::BitVector(Count, false);
9322+
for (unsigned I = 0; I < Count; ++Byte)
9323+
for (unsigned Bit = 0; Bit < 8 && I < Count; ++Bit, ++I)
9324+
if (*Byte & (1 << Bit))
9325+
Ret[I] = true;
9326+
return Ret;
9327+
}
9328+
93199329
/// Read a floating-point value
93209330
llvm::APFloat ASTRecordReader::readAPFloat(const llvm::fltSemantics &Sem) {
93219331
return llvm::APFloat(Sem, readAPInt());

clang/lib/Serialization/ASTWriter.cpp

Lines changed: 44 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1270,18 +1270,30 @@ void ASTWriter::writeUnhashedControlBlock(Preprocessor &PP,
12701270
WritePragmaDiagnosticMappings(Diags, /* isModule = */ WritingModule);
12711271

12721272
// Header search entry usage.
1273-
auto HSEntryUsage = PP.getHeaderSearchInfo().computeUserEntryUsage();
1274-
auto Abbrev = std::make_shared<BitCodeAbbrev>();
1275-
Abbrev->Add(BitCodeAbbrevOp(HEADER_SEARCH_ENTRY_USAGE));
1276-
Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // Number of bits.
1277-
Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Bit vector.
1278-
unsigned HSUsageAbbrevCode = Stream.EmitAbbrev(std::move(Abbrev));
12791273
{
1274+
auto HSEntryUsage = PP.getHeaderSearchInfo().computeUserEntryUsage();
1275+
auto Abbrev = std::make_shared<BitCodeAbbrev>();
1276+
Abbrev->Add(BitCodeAbbrevOp(HEADER_SEARCH_ENTRY_USAGE));
1277+
Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // Number of bits.
1278+
Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Bit vector.
1279+
unsigned HSUsageAbbrevCode = Stream.EmitAbbrev(std::move(Abbrev));
12801280
RecordData::value_type Record[] = {HEADER_SEARCH_ENTRY_USAGE,
12811281
HSEntryUsage.size()};
12821282
Stream.EmitRecordWithBlob(HSUsageAbbrevCode, Record, bytes(HSEntryUsage));
12831283
}
12841284

1285+
// VFS usage.
1286+
{
1287+
auto VFSUsage = PP.getHeaderSearchInfo().collectVFSUsageAndClear();
1288+
auto Abbrev = std::make_shared<BitCodeAbbrev>();
1289+
Abbrev->Add(BitCodeAbbrevOp(VFS_USAGE));
1290+
Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // Number of bits.
1291+
Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Bit vector.
1292+
unsigned VFSUsageAbbrevCode = Stream.EmitAbbrev(std::move(Abbrev));
1293+
RecordData::value_type Record[] = {VFS_USAGE, VFSUsage.size()};
1294+
Stream.EmitRecordWithBlob(VFSUsageAbbrevCode, Record, bytes(VFSUsage));
1295+
}
1296+
12851297
// Leave the options block.
12861298
Stream.ExitBlock();
12871299
UnhashedControlBlockRange.second = Stream.GetCurrentBitNo() >> 3;
@@ -4672,7 +4684,7 @@ static void AddLazyVectorDecls(ASTWriter &Writer, Vector &Vec,
46724684
}
46734685
}
46744686

4675-
void ASTWriter::collectNonAffectingInputFiles() {
4687+
void ASTWriter::computeNonAffectingInputFiles() {
46764688
SourceManager &SrcMgr = PP->getSourceManager();
46774689
unsigned N = SrcMgr.local_sloc_entry_size();
46784690

@@ -4732,6 +4744,30 @@ void ASTWriter::collectNonAffectingInputFiles() {
47324744
NonAffectingFileIDAdjustments.push_back(FileIDAdjustment);
47334745
NonAffectingOffsetAdjustments.push_back(OffsetAdjustment);
47344746
}
4747+
4748+
if (!PP->getHeaderSearchInfo().getHeaderSearchOpts().ModulesIncludeVFSUsage)
4749+
return;
4750+
4751+
FileManager &FileMgr = PP->getFileManager();
4752+
FileMgr.trackVFSUsage(true);
4753+
// Lookup the paths in the VFS to trigger `-ivfsoverlay` usage tracking.
4754+
for (StringRef Path :
4755+
PP->getHeaderSearchInfo().getHeaderSearchOpts().VFSOverlayFiles)
4756+
FileMgr.getVirtualFileSystem().exists(Path);
4757+
for (unsigned I = 1; I != N; ++I) {
4758+
if (IsSLocAffecting[I]) {
4759+
const SrcMgr::SLocEntry *SLoc = &SrcMgr.getLocalSLocEntry(I);
4760+
if (!SLoc->isFile())
4761+
continue;
4762+
const SrcMgr::FileInfo &File = SLoc->getFile();
4763+
const SrcMgr::ContentCache *Cache = &File.getContentCache();
4764+
if (!Cache->OrigEntry)
4765+
continue;
4766+
FileMgr.getVirtualFileSystem().exists(
4767+
Cache->OrigEntry->getNameAsRequested());
4768+
}
4769+
}
4770+
FileMgr.trackVFSUsage(false);
47354771
}
47364772

47374773
ASTFileSignature ASTWriter::WriteASTCore(Sema &SemaRef, StringRef isysroot,
@@ -4749,7 +4785,7 @@ ASTFileSignature ASTWriter::WriteASTCore(Sema &SemaRef, StringRef isysroot,
47494785

47504786
// This needs to be done very early, since everything that writes
47514787
// SourceLocations or FileIDs depends on it.
4752-
collectNonAffectingInputFiles();
4788+
computeNonAffectingInputFiles();
47534789

47544790
writeUnhashedControlBlock(PP, Context);
47554791

clang/lib/Tooling/DependencyScanning/DependencyScanningFilesystem.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,9 @@ static bool shouldCacheStatFailures(StringRef Filename) {
194194
DependencyScanningWorkerFilesystem::DependencyScanningWorkerFilesystem(
195195
DependencyScanningFilesystemSharedCache &SharedCache,
196196
IntrusiveRefCntPtr<llvm::vfs::FileSystem> FS)
197-
: ProxyFileSystem(std::move(FS)), SharedCache(SharedCache),
197+
: llvm::RTTIExtends<DependencyScanningWorkerFilesystem,
198+
llvm::vfs::ProxyFileSystem>(std::move(FS)),
199+
SharedCache(SharedCache),
198200
WorkingDirForCacheLookup(llvm::errc::invalid_argument) {
199201
updateWorkingDirForCacheLookup();
200202
}
@@ -379,3 +381,5 @@ void DependencyScanningWorkerFilesystem::updateWorkingDirForCacheLookup() {
379381
assert(!WorkingDirForCacheLookup ||
380382
llvm::sys::path::is_absolute_gnu(*WorkingDirForCacheLookup));
381383
}
384+
385+
const char DependencyScanningWorkerFilesystem::ID = 0;

0 commit comments

Comments
 (0)