diff options
Diffstat (limited to 'clang/lib/Tooling/DependencyScanning/DependencyScanningFilesystem.cpp')
-rw-r--r-- | clang/lib/Tooling/DependencyScanning/DependencyScanningFilesystem.cpp | 43 |
1 files changed, 28 insertions, 15 deletions
diff --git a/clang/lib/Tooling/DependencyScanning/DependencyScanningFilesystem.cpp b/clang/lib/Tooling/DependencyScanning/DependencyScanningFilesystem.cpp index 1c10b7d727a5..40e8bd2b8776 100644 --- a/clang/lib/Tooling/DependencyScanning/DependencyScanningFilesystem.cpp +++ b/clang/lib/Tooling/DependencyScanning/DependencyScanningFilesystem.cpp @@ -99,8 +99,7 @@ CachedFileSystemEntry::createDirectoryEntry(llvm::vfs::Status &&Stat) { return Result; } -DependencyScanningFilesystemSharedCache:: - DependencyScanningFilesystemSharedCache() { +DependencyScanningFilesystemSharedCache::SingleCache::SingleCache() { // This heuristic was chosen using a empirical testing on a // reasonably high core machine (iMacPro 18 cores / 36 threads). The cache // sharding gives a performance edge by reducing the lock contention. @@ -111,18 +110,20 @@ DependencyScanningFilesystemSharedCache:: CacheShards = std::make_unique<CacheShard[]>(NumShards); } -/// Returns a cache entry for the corresponding key. -/// -/// A new cache entry is created if the key is not in the cache. This is a -/// thread safe call. DependencyScanningFilesystemSharedCache::SharedFileSystemEntry & -DependencyScanningFilesystemSharedCache::get(StringRef Key) { +DependencyScanningFilesystemSharedCache::SingleCache::get(StringRef Key) { CacheShard &Shard = CacheShards[llvm::hash_value(Key) % NumShards]; std::unique_lock<std::mutex> LockGuard(Shard.CacheLock); auto It = Shard.Cache.try_emplace(Key); return It.first->getValue(); } +DependencyScanningFilesystemSharedCache::SharedFileSystemEntry & +DependencyScanningFilesystemSharedCache::get(StringRef Key, bool Minimized) { + SingleCache &Cache = Minimized ? CacheMinimized : CacheOriginal; + return Cache.get(Key); +} + /// Whitelist file extensions that should be minimized, treating no extension as /// a source file that should be minimized. /// @@ -149,20 +150,32 @@ static bool shouldCacheStatFailures(StringRef Filename) { return shouldMinimize(Filename); // Only cache stat failures on source files. } +void DependencyScanningWorkerFilesystem::ignoreFile(StringRef RawFilename) { + llvm::SmallString<256> Filename; + llvm::sys::path::native(RawFilename, Filename); + IgnoredFiles.insert(Filename); +} + +bool DependencyScanningWorkerFilesystem::shouldIgnoreFile( + StringRef RawFilename) { + llvm::SmallString<256> Filename; + llvm::sys::path::native(RawFilename, Filename); + return IgnoredFiles.contains(Filename); +} + llvm::ErrorOr<const CachedFileSystemEntry *> DependencyScanningWorkerFilesystem::getOrCreateFileSystemEntry( const StringRef Filename) { - if (const CachedFileSystemEntry *Entry = getCachedEntry(Filename)) { + bool ShouldMinimize = !shouldIgnoreFile(Filename) && shouldMinimize(Filename); + + if (const auto *Entry = Cache.getCachedEntry(Filename, ShouldMinimize)) return Entry; - } // FIXME: Handle PCM/PCH files. // FIXME: Handle module map files. - bool KeepOriginalSource = IgnoredFiles.count(Filename) || - !shouldMinimize(Filename); DependencyScanningFilesystemSharedCache::SharedFileSystemEntry - &SharedCacheEntry = SharedCache.get(Filename); + &SharedCacheEntry = SharedCache.get(Filename, ShouldMinimize); const CachedFileSystemEntry *Result; { std::unique_lock<std::mutex> LockGuard(SharedCacheEntry.ValueLock); @@ -184,15 +197,15 @@ DependencyScanningWorkerFilesystem::getOrCreateFileSystemEntry( CacheEntry = CachedFileSystemEntry::createDirectoryEntry( std::move(*MaybeStatus)); else - CacheEntry = CachedFileSystemEntry::createFileEntry( - Filename, FS, !KeepOriginalSource); + CacheEntry = CachedFileSystemEntry::createFileEntry(Filename, FS, + ShouldMinimize); } Result = &CacheEntry; } // Store the result in the local cache. - setCachedEntry(Filename, Result); + Cache.setCachedEntry(Filename, ShouldMinimize, Result); return Result; } |