@@ -100,6 +100,7 @@ DependencyScanningFilesystemSharedCache::
100100DependencyScanningFilesystemSharedCache::CacheShard &
101101DependencyScanningFilesystemSharedCache::getShardForFilename (
102102 StringRef Filename) const {
103+ assert (llvm::sys::path::is_absolute_gnu (Filename));
103104 return CacheShards[llvm::hash_value (Filename) % NumShards];
104105}
105106
@@ -113,6 +114,7 @@ DependencyScanningFilesystemSharedCache::getShardForUID(
113114const CachedFileSystemEntry *
114115DependencyScanningFilesystemSharedCache::CacheShard::findEntryByFilename (
115116 StringRef Filename) const {
117+ assert (llvm::sys::path::is_absolute_gnu (Filename));
116118 std::lock_guard<std::mutex> LockGuard (CacheLock);
117119 auto It = EntriesByFilename.find (Filename);
118120 return It == EntriesByFilename.end () ? nullptr : It->getValue ();
@@ -190,6 +192,14 @@ static bool shouldCacheStatFailures(StringRef Filename) {
190192 return shouldScanForDirectivesBasedOnExtension (Filename);
191193}
192194
195+ DependencyScanningWorkerFilesystem::DependencyScanningWorkerFilesystem (
196+ DependencyScanningFilesystemSharedCache &SharedCache,
197+ IntrusiveRefCntPtr<llvm::vfs::FileSystem> FS)
198+ : ProxyFileSystem(std::move(FS)), SharedCache(SharedCache),
199+ WorkingDirForCacheLookup(llvm::errc::invalid_argument) {
200+ updateWorkingDirForCacheLookup ();
201+ }
202+
193203bool DependencyScanningWorkerFilesystem::shouldScanForDirectives (
194204 StringRef Filename) {
195205 return shouldScanForDirectivesBasedOnExtension (Filename);
@@ -216,44 +226,62 @@ DependencyScanningWorkerFilesystem::findEntryByFilenameWithWriteThrough(
216226}
217227
218228llvm::ErrorOr<const CachedFileSystemEntry &>
219- DependencyScanningWorkerFilesystem::computeAndStoreResult (StringRef Filename) {
220- llvm::ErrorOr<llvm::vfs::Status> Stat = getUnderlyingFS ().status (Filename);
229+ DependencyScanningWorkerFilesystem::computeAndStoreResult (
230+ StringRef OriginalFilename, StringRef FilenameForLookup) {
231+ llvm::ErrorOr<llvm::vfs::Status> Stat =
232+ getUnderlyingFS ().status (OriginalFilename);
221233 if (!Stat) {
222- if (!shouldCacheStatFailures (Filename ))
234+ if (!shouldCacheStatFailures (OriginalFilename ))
223235 return Stat.getError ();
224236 const auto &Entry =
225- getOrEmplaceSharedEntryForFilename (Filename , Stat.getError ());
226- return insertLocalEntryForFilename (Filename , Entry);
237+ getOrEmplaceSharedEntryForFilename (FilenameForLookup , Stat.getError ());
238+ return insertLocalEntryForFilename (FilenameForLookup , Entry);
227239 }
228240
229241 if (const auto *Entry = findSharedEntryByUID (*Stat))
230- return insertLocalEntryForFilename (Filename , *Entry);
242+ return insertLocalEntryForFilename (FilenameForLookup , *Entry);
231243
232244 auto TEntry =
233- Stat->isDirectory () ? TentativeEntry (*Stat) : readFile (Filename );
245+ Stat->isDirectory () ? TentativeEntry (*Stat) : readFile (OriginalFilename );
234246
235247 const CachedFileSystemEntry *SharedEntry = [&]() {
236248 if (TEntry) {
237249 const auto &UIDEntry = getOrEmplaceSharedEntryForUID (std::move (*TEntry));
238- return &getOrInsertSharedEntryForFilename (Filename , UIDEntry);
250+ return &getOrInsertSharedEntryForFilename (FilenameForLookup , UIDEntry);
239251 }
240- return &getOrEmplaceSharedEntryForFilename (Filename, TEntry.getError ());
252+ return &getOrEmplaceSharedEntryForFilename (FilenameForLookup,
253+ TEntry.getError ());
241254 }();
242255
243- return insertLocalEntryForFilename (Filename , *SharedEntry);
256+ return insertLocalEntryForFilename (FilenameForLookup , *SharedEntry);
244257}
245258
246259llvm::ErrorOr<EntryRef>
247260DependencyScanningWorkerFilesystem::getOrCreateFileSystemEntry (
248- StringRef Filename, bool DisableDirectivesScanning) {
249- if (const auto *Entry = findEntryByFilenameWithWriteThrough (Filename))
250- return scanForDirectivesIfNecessary (*Entry, Filename,
261+ StringRef OriginalFilename, bool DisableDirectivesScanning) {
262+ StringRef FilenameForLookup;
263+ SmallString<256 > PathBuf;
264+ if (llvm::sys::path::is_absolute_gnu (OriginalFilename)) {
265+ FilenameForLookup = OriginalFilename;
266+ } else if (!WorkingDirForCacheLookup) {
267+ return WorkingDirForCacheLookup.getError ();
268+ } else {
269+ StringRef RelFilename = OriginalFilename;
270+ RelFilename.consume_front (" ./" );
271+ PathBuf = *WorkingDirForCacheLookup;
272+ llvm::sys::path::append (PathBuf, RelFilename);
273+ FilenameForLookup = PathBuf.str ();
274+ }
275+ assert (llvm::sys::path::is_absolute_gnu (FilenameForLookup));
276+ if (const auto *Entry =
277+ findEntryByFilenameWithWriteThrough (FilenameForLookup))
278+ return scanForDirectivesIfNecessary (*Entry, OriginalFilename,
251279 DisableDirectivesScanning)
252280 .unwrapError ();
253- auto MaybeEntry = computeAndStoreResult (Filename );
281+ auto MaybeEntry = computeAndStoreResult (OriginalFilename, FilenameForLookup );
254282 if (!MaybeEntry)
255283 return MaybeEntry.getError ();
256- return scanForDirectivesIfNecessary (*MaybeEntry, Filename ,
284+ return scanForDirectivesIfNecessary (*MaybeEntry, OriginalFilename ,
257285 DisableDirectivesScanning)
258286 .unwrapError ();
259287}
@@ -331,3 +359,24 @@ DependencyScanningWorkerFilesystem::openFileForRead(const Twine &Path) {
331359 return Result.getError ();
332360 return DepScanFile::create (Result.get ());
333361}
362+
363+ std::error_code DependencyScanningWorkerFilesystem::setCurrentWorkingDirectory (
364+ const Twine &Path) {
365+ std::error_code EC = ProxyFileSystem::setCurrentWorkingDirectory (Path);
366+ updateWorkingDirForCacheLookup ();
367+ return EC;
368+ }
369+
370+ void DependencyScanningWorkerFilesystem::updateWorkingDirForCacheLookup () {
371+ llvm::ErrorOr<std::string> CWD =
372+ getUnderlyingFS ().getCurrentWorkingDirectory ();
373+ if (!CWD) {
374+ WorkingDirForCacheLookup = CWD.getError ();
375+ } else if (!llvm::sys::path::is_absolute_gnu (*CWD)) {
376+ WorkingDirForCacheLookup = llvm::errc::invalid_argument;
377+ } else {
378+ WorkingDirForCacheLookup = *CWD;
379+ }
380+ assert (!WorkingDirForCacheLookup ||
381+ llvm::sys::path::is_absolute_gnu (*WorkingDirForCacheLookup));
382+ }
0 commit comments