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