summaryrefslogtreecommitdiffstats
path: root/clang/lib/Basic/FileSystemStatCache.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2010-11-23 19:19:34 +0000
committerChris Lattner <sabre@nondot.org>2010-11-23 19:19:34 +0000
commit226efd356c6c98a4de2880e6090aa2f05b459fc5 (patch)
tree10f7d47ea7136c139ac252d3b9f7e0215c766b61 /clang/lib/Basic/FileSystemStatCache.cpp
parente5cb2787667ffd67f831dac78abe8c3acd046f9e (diff)
downloadbcm5719-llvm-226efd356c6c98a4de2880e6090aa2f05b459fc5.tar.gz
bcm5719-llvm-226efd356c6c98a4de2880e6090aa2f05b459fc5.zip
rework the stat cache, pulling it out of FileManager.h into
its own header and giving it some more structure. No functionality change. llvm-svn: 120030
Diffstat (limited to 'clang/lib/Basic/FileSystemStatCache.cpp')
-rw-r--r--clang/lib/Basic/FileSystemStatCache.cpp40
1 files changed, 40 insertions, 0 deletions
diff --git a/clang/lib/Basic/FileSystemStatCache.cpp b/clang/lib/Basic/FileSystemStatCache.cpp
new file mode 100644
index 00000000000..8fd31d5dfc0
--- /dev/null
+++ b/clang/lib/Basic/FileSystemStatCache.cpp
@@ -0,0 +1,40 @@
+//===--- FileSystemStatCache.cpp - Caching for 'stat' calls ---------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file defines the FileSystemStatCache interface.
+//
+//===----------------------------------------------------------------------===//
+
+#include "clang/Basic/FileSystemStatCache.h"
+#include "llvm/System/Path.h"
+using namespace clang;
+
+MemorizeStatCalls::LookupResult
+MemorizeStatCalls::getStat(const char *Path, struct stat &StatBuf) {
+ LookupResult Result = statChained(Path, StatBuf);
+
+ // If the chained cache didn't know anything about the file, do the stat now
+ // so we can record the result.
+ if (Result == CacheMiss)
+ Result = ::stat(Path, &StatBuf) ? CacheHitMissing : CacheHitExists;
+
+
+ // Do not cache failed stats, it is easy to construct common inconsistent
+ // situations if we do, and they are not important for PCH performance (which
+ // currently only needs the stats to construct the initial FileManager
+ // entries).
+ if (Result == CacheHitMissing)
+ return Result;
+
+ // Cache file 'stat' results and directories with absolutely paths.
+ if (!S_ISDIR(StatBuf.st_mode) || llvm::sys::Path(Path).isAbsolute())
+ StatCalls[Path] = StatResult(Result, StatBuf);
+
+ return Result;
+}
OpenPOWER on IntegriCloud