@@ -96,6 +96,7 @@ DependencyScanningFilesystemSharedCache::
96
96
DependencyScanningFilesystemSharedCache::CacheShard &
97
97
DependencyScanningFilesystemSharedCache::getShardForFilename (
98
98
StringRef Filename) const {
99
+ assert (llvm::sys::path::is_absolute_gnu (Filename));
99
100
return CacheShards[llvm::hash_value (Filename) % NumShards];
100
101
}
101
102
@@ -109,6 +110,7 @@ DependencyScanningFilesystemSharedCache::getShardForUID(
109
110
const CachedFileSystemEntry *
110
111
DependencyScanningFilesystemSharedCache::CacheShard::findEntryByFilename (
111
112
StringRef Filename) const {
113
+ assert (llvm::sys::path::is_absolute_gnu (Filename));
112
114
std::lock_guard<std::mutex> LockGuard (CacheLock);
113
115
auto It = EntriesByFilename.find (Filename);
114
116
return It == EntriesByFilename.end () ? nullptr : It->getValue ();
@@ -189,6 +191,14 @@ static bool shouldCacheStatFailures(StringRef Filename) {
189
191
return shouldScanForDirectivesBasedOnExtension (Filename);
190
192
}
191
193
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
+
192
202
bool DependencyScanningWorkerFilesystem::shouldScanForDirectives (
193
203
StringRef Filename) {
194
204
return shouldScanForDirectivesBasedOnExtension (Filename);
@@ -215,44 +225,62 @@ DependencyScanningWorkerFilesystem::findEntryByFilenameWithWriteThrough(
215
225
}
216
226
217
227
llvm::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);
220
232
if (!Stat) {
221
- if (!shouldCacheStatFailures (Filename ))
233
+ if (!shouldCacheStatFailures (OriginalFilename ))
222
234
return Stat.getError ();
223
235
const auto &Entry =
224
- getOrEmplaceSharedEntryForFilename (Filename , Stat.getError ());
225
- return insertLocalEntryForFilename (Filename , Entry);
236
+ getOrEmplaceSharedEntryForFilename (FilenameForLookup , Stat.getError ());
237
+ return insertLocalEntryForFilename (FilenameForLookup , Entry);
226
238
}
227
239
228
240
if (const auto *Entry = findSharedEntryByUID (*Stat))
229
- return insertLocalEntryForFilename (Filename , *Entry);
241
+ return insertLocalEntryForFilename (FilenameForLookup , *Entry);
230
242
231
243
auto TEntry =
232
- Stat->isDirectory () ? TentativeEntry (*Stat) : readFile (Filename );
244
+ Stat->isDirectory () ? TentativeEntry (*Stat) : readFile (OriginalFilename );
233
245
234
246
const CachedFileSystemEntry *SharedEntry = [&]() {
235
247
if (TEntry) {
236
248
const auto &UIDEntry = getOrEmplaceSharedEntryForUID (std::move (*TEntry));
237
- return &getOrInsertSharedEntryForFilename (Filename , UIDEntry);
249
+ return &getOrInsertSharedEntryForFilename (FilenameForLookup , UIDEntry);
238
250
}
239
- return &getOrEmplaceSharedEntryForFilename (Filename, TEntry.getError ());
251
+ return &getOrEmplaceSharedEntryForFilename (FilenameForLookup,
252
+ TEntry.getError ());
240
253
}();
241
254
242
- return insertLocalEntryForFilename (Filename , *SharedEntry);
255
+ return insertLocalEntryForFilename (FilenameForLookup , *SharedEntry);
243
256
}
244
257
245
258
llvm::ErrorOr<EntryRef>
246
259
DependencyScanningWorkerFilesystem::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,
250
278
DisableDirectivesScanning)
251
279
.unwrapError ();
252
- auto MaybeEntry = computeAndStoreResult (Filename );
280
+ auto MaybeEntry = computeAndStoreResult (OriginalFilename, FilenameForLookup );
253
281
if (!MaybeEntry)
254
282
return MaybeEntry.getError ();
255
- return scanForDirectivesIfNecessary (*MaybeEntry, Filename ,
283
+ return scanForDirectivesIfNecessary (*MaybeEntry, OriginalFilename ,
256
284
DisableDirectivesScanning)
257
285
.unwrapError ();
258
286
}
@@ -330,3 +358,24 @@ DependencyScanningWorkerFilesystem::openFileForRead(const Twine &Path) {
330
358
return Result.getError ();
331
359
return DepScanFile::create (Result.get ());
332
360
}
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