@@ -96,6 +96,7 @@ DependencyScanningFilesystemSharedCache::
9696DependencyScanningFilesystemSharedCache::CacheShard &
9797DependencyScanningFilesystemSharedCache::getShardForFilename (
9898 StringRef Filename) const {
99+ assert (llvm::sys::path::is_absolute_gnu (Filename));
99100 return CacheShards[llvm::hash_value (Filename) % NumShards];
100101}
101102
@@ -109,6 +110,7 @@ DependencyScanningFilesystemSharedCache::getShardForUID(
109110const CachedFileSystemEntry *
110111DependencyScanningFilesystemSharedCache::CacheShard::findEntryByFilename (
111112 StringRef Filename) const {
113+ assert (llvm::sys::path::is_absolute_gnu (Filename));
112114 std::lock_guard<std::mutex> LockGuard (CacheLock);
113115 auto It = EntriesByFilename.find (Filename);
114116 return It == EntriesByFilename.end () ? nullptr : It->getValue ();
@@ -189,6 +191,14 @@ static bool shouldCacheStatFailures(StringRef Filename) {
189191 return shouldScanForDirectivesBasedOnExtension (Filename);
190192}
191193
194+ DependencyScanningWorkerFilesystem::DependencyScanningWorkerFilesystem (
195+ DependencyScanningFilesystemSharedCache &SharedCache,
196+ IntrusiveRefCntPtr<llvm::vfs::FileSystem> FS)
197+ : ProxyFileSystem(std::move(FS)), SharedCache(SharedCache),
198+ WorkingDirForCacheLookup(llvm::errc::invalid_argument) {
199+ updateWorkingDirForCacheLookup ();
200+ }
201+
192202bool DependencyScanningWorkerFilesystem::shouldScanForDirectives (
193203 StringRef Filename) {
194204 return shouldScanForDirectivesBasedOnExtension (Filename);
@@ -215,44 +225,62 @@ DependencyScanningWorkerFilesystem::findEntryByFilenameWithWriteThrough(
215225}
216226
217227llvm::ErrorOr<const CachedFileSystemEntry &>
218- DependencyScanningWorkerFilesystem::computeAndStoreResult (StringRef Filename) {
219- llvm::ErrorOr<llvm::vfs::Status> Stat = getUnderlyingFS ().status (Filename);
228+ DependencyScanningWorkerFilesystem::computeAndStoreResult (
229+ StringRef OriginalFilename, StringRef FilenameForLookup) {
230+ llvm::ErrorOr<llvm::vfs::Status> Stat =
231+ getUnderlyingFS ().status (OriginalFilename);
220232 if (!Stat) {
221- if (!shouldCacheStatFailures (Filename ))
233+ if (!shouldCacheStatFailures (OriginalFilename ))
222234 return Stat.getError ();
223235 const auto &Entry =
224- getOrEmplaceSharedEntryForFilename (Filename , Stat.getError ());
225- return insertLocalEntryForFilename (Filename , Entry);
236+ getOrEmplaceSharedEntryForFilename (FilenameForLookup , Stat.getError ());
237+ return insertLocalEntryForFilename (FilenameForLookup , Entry);
226238 }
227239
228240 if (const auto *Entry = findSharedEntryByUID (*Stat))
229- return insertLocalEntryForFilename (Filename , *Entry);
241+ return insertLocalEntryForFilename (FilenameForLookup , *Entry);
230242
231243 auto TEntry =
232- Stat->isDirectory () ? TentativeEntry (*Stat) : readFile (Filename );
244+ Stat->isDirectory () ? TentativeEntry (*Stat) : readFile (OriginalFilename );
233245
234246 const CachedFileSystemEntry *SharedEntry = [&]() {
235247 if (TEntry) {
236248 const auto &UIDEntry = getOrEmplaceSharedEntryForUID (std::move (*TEntry));
237- return &getOrInsertSharedEntryForFilename (Filename , UIDEntry);
249+ return &getOrInsertSharedEntryForFilename (FilenameForLookup , UIDEntry);
238250 }
239- return &getOrEmplaceSharedEntryForFilename (Filename, TEntry.getError ());
251+ return &getOrEmplaceSharedEntryForFilename (FilenameForLookup,
252+ TEntry.getError ());
240253 }();
241254
242- return insertLocalEntryForFilename (Filename , *SharedEntry);
255+ return insertLocalEntryForFilename (FilenameForLookup , *SharedEntry);
243256}
244257
245258llvm::ErrorOr<EntryRef>
246259DependencyScanningWorkerFilesystem::getOrCreateFileSystemEntry (
247- StringRef Filename, bool DisableDirectivesScanning) {
248- if (const auto *Entry = findEntryByFilenameWithWriteThrough (Filename))
249- return scanForDirectivesIfNecessary (*Entry, Filename,
260+ StringRef OriginalFilename, bool DisableDirectivesScanning) {
261+ StringRef FilenameForLookup;
262+ SmallString<256 > PathBuf;
263+ if (llvm::sys::path::is_absolute_gnu (OriginalFilename)) {
264+ FilenameForLookup = OriginalFilename;
265+ } else if (!WorkingDirForCacheLookup) {
266+ return WorkingDirForCacheLookup.getError ();
267+ } else {
268+ StringRef RelFilename = OriginalFilename;
269+ RelFilename.consume_front (" ./" );
270+ PathBuf = *WorkingDirForCacheLookup;
271+ llvm::sys::path::append (PathBuf, RelFilename);
272+ FilenameForLookup = PathBuf.str ();
273+ }
274+ assert (llvm::sys::path::is_absolute_gnu (FilenameForLookup));
275+ if (const auto *Entry =
276+ findEntryByFilenameWithWriteThrough (FilenameForLookup))
277+ return scanForDirectivesIfNecessary (*Entry, OriginalFilename,
250278 DisableDirectivesScanning)
251279 .unwrapError ();
252- auto MaybeEntry = computeAndStoreResult (Filename );
280+ auto MaybeEntry = computeAndStoreResult (OriginalFilename, FilenameForLookup );
253281 if (!MaybeEntry)
254282 return MaybeEntry.getError ();
255- return scanForDirectivesIfNecessary (*MaybeEntry, Filename ,
283+ return scanForDirectivesIfNecessary (*MaybeEntry, OriginalFilename ,
256284 DisableDirectivesScanning)
257285 .unwrapError ();
258286}
@@ -330,3 +358,24 @@ DependencyScanningWorkerFilesystem::openFileForRead(const Twine &Path) {
330358 return Result.getError ();
331359 return DepScanFile::create (Result.get ());
332360}
361+
362+ std::error_code DependencyScanningWorkerFilesystem::setCurrentWorkingDirectory (
363+ const Twine &Path) {
364+ std::error_code EC = ProxyFileSystem::setCurrentWorkingDirectory (Path);
365+ updateWorkingDirForCacheLookup ();
366+ return EC;
367+ }
368+
369+ void DependencyScanningWorkerFilesystem::updateWorkingDirForCacheLookup () {
370+ llvm::ErrorOr<std::string> CWD =
371+ getUnderlyingFS ().getCurrentWorkingDirectory ();
372+ if (!CWD) {
373+ WorkingDirForCacheLookup = CWD.getError ();
374+ } else if (!llvm::sys::path::is_absolute_gnu (*CWD)) {
375+ WorkingDirForCacheLookup = llvm::errc::invalid_argument;
376+ } else {
377+ WorkingDirForCacheLookup = *CWD;
378+ }
379+ assert (!WorkingDirForCacheLookup ||
380+ llvm::sys::path::is_absolute_gnu (*WorkingDirForCacheLookup));
381+ }
0 commit comments