From: Chris Lattner Date: Tue, 23 Nov 2010 19:56:39 +0000 (+0000) Subject: factor the "cache miss" handling code out of FM into a static X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=11aa4b03b054cb9d3c201bba5632241145865e29;p=clang factor the "cache miss" handling code out of FM into a static method in FileSystemStatCache. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@120037 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/FileSystemStatCache.h b/include/clang/Basic/FileSystemStatCache.h index bcfa52dd86..7bb3706793 100644 --- a/include/clang/Basic/FileSystemStatCache.h +++ b/include/clang/Basic/FileSystemStatCache.h @@ -36,8 +36,21 @@ public: CacheHitMissing, //< We know that the file doesn't exist. CacheMiss //< We don't know anything about the file. }; - - virtual LookupResult getStat(const char *Path, struct stat &StatBuf) = 0; + + /// FileSystemStatCache::get - Get the 'stat' information for the specified + /// path, using the cache to accellerate it if possible. This returns true if + /// the path does not exist or false if it exists. + static bool get(const char *Path, struct stat &StatBuf, + FileSystemStatCache *Cache) { + LookupResult R = CacheMiss; + + if (Cache) + R = Cache->getStat(Path, StatBuf); + + if (R == FileSystemStatCache::CacheMiss) + return ::stat(Path, &StatBuf); + return R == FileSystemStatCache::CacheHitMissing; + } /// \brief Sets the next stat call cache in the chain of stat caches. /// Takes ownership of the given stat cache. @@ -54,6 +67,8 @@ public: FileSystemStatCache *takeNextStatCache() { return NextStatCache.take(); } protected: + virtual LookupResult getStat(const char *Path, struct stat &StatBuf) = 0; + LookupResult statChained(const char *Path, struct stat &StatBuf) { if (FileSystemStatCache *Next = getNextStatCache()) return Next->getStat(Path, StatBuf); diff --git a/lib/Basic/FileManager.cpp b/lib/Basic/FileManager.cpp index b884388c0b..7bb67689bf 100644 --- a/lib/Basic/FileManager.cpp +++ b/lib/Basic/FileManager.cpp @@ -306,14 +306,12 @@ const FileEntry *FileManager::getFile(llvm::StringRef Filename) { // Nope, there isn't. Check to see if the file exists. struct stat StatBuf; - //llvm::errs() << "STATING: " << Filename; if (getStatValue(InterndFileName, StatBuf) || // Error stat'ing. S_ISDIR(StatBuf.st_mode)) { // A directory? - // If this file doesn't exist, we leave a null in FileEntries for this path. - //llvm::errs() << ": Not existing\n"; + // If this file doesn't exist, we leave NON_EXISTENT_FILE in FileEntries for + // this path so subsequent queries get the negative result. return 0; } - //llvm::errs() << ": exists\n"; // It exists. See if we have already opened a file with the same inode. // This occurs when one dir is symlinked to another, for example. @@ -416,28 +414,15 @@ getBufferForFile(llvm::StringRef Filename, std::string *ErrorStr) { /// cache to accellerate it if possible. This returns true if the path does not /// exist or false if it exists. bool FileManager::getStatValue(const char *Path, struct stat &StatBuf) { - FileSystemStatCache::LookupResult Result = FileSystemStatCache::CacheMiss; - // FIXME: FileSystemOpts shouldn't be passed in here, all paths should be // absolute! - if (FileSystemOpts.WorkingDir.empty()) { - if (StatCache.get()) - Result = StatCache->getStat(Path, StatBuf); - - if (Result == FileSystemStatCache::CacheMiss) - return ::stat(Path, &StatBuf); - return Result == FileSystemStatCache::CacheHitMissing; - } + if (FileSystemOpts.WorkingDir.empty()) + return FileSystemStatCache::get(Path, StatBuf, StatCache.get()); llvm::sys::Path FilePath(Path); FixupRelativePath(FilePath, FileSystemOpts); - - if (StatCache.get()) - Result = StatCache->getStat(FilePath.c_str(), StatBuf); - - if (Result == FileSystemStatCache::CacheMiss) - return ::stat(FilePath.c_str(), &StatBuf); - return Result == FileSystemStatCache::CacheHitMissing; + + return FileSystemStatCache::get(FilePath.c_str(), StatBuf, StatCache.get()); }