1*226efd35SChris Lattner //===--- FileSystemStatCache.cpp - Caching for 'stat' calls ---------------===//
2*226efd35SChris Lattner //
3*226efd35SChris Lattner //                     The LLVM Compiler Infrastructure
4*226efd35SChris Lattner //
5*226efd35SChris Lattner // This file is distributed under the University of Illinois Open Source
6*226efd35SChris Lattner // License. See LICENSE.TXT for details.
7*226efd35SChris Lattner //
8*226efd35SChris Lattner //===----------------------------------------------------------------------===//
9*226efd35SChris Lattner //
10*226efd35SChris Lattner //  This file defines the FileSystemStatCache interface.
11*226efd35SChris Lattner //
12*226efd35SChris Lattner //===----------------------------------------------------------------------===//
13*226efd35SChris Lattner 
14*226efd35SChris Lattner #include "clang/Basic/FileSystemStatCache.h"
15*226efd35SChris Lattner #include "llvm/System/Path.h"
16*226efd35SChris Lattner using namespace clang;
17*226efd35SChris Lattner 
18*226efd35SChris Lattner MemorizeStatCalls::LookupResult
19*226efd35SChris Lattner MemorizeStatCalls::getStat(const char *Path, struct stat &StatBuf) {
20*226efd35SChris Lattner   LookupResult Result = statChained(Path, StatBuf);
21*226efd35SChris Lattner 
22*226efd35SChris Lattner   // If the chained cache didn't know anything about the file, do the stat now
23*226efd35SChris Lattner   // so we can record the result.
24*226efd35SChris Lattner   if (Result == CacheMiss)
25*226efd35SChris Lattner     Result = ::stat(Path, &StatBuf) ? CacheHitMissing : CacheHitExists;
26*226efd35SChris Lattner 
27*226efd35SChris Lattner 
28*226efd35SChris Lattner   // Do not cache failed stats, it is easy to construct common inconsistent
29*226efd35SChris Lattner   // situations if we do, and they are not important for PCH performance (which
30*226efd35SChris Lattner   // currently only needs the stats to construct the initial FileManager
31*226efd35SChris Lattner   // entries).
32*226efd35SChris Lattner   if (Result == CacheHitMissing)
33*226efd35SChris Lattner     return Result;
34*226efd35SChris Lattner 
35*226efd35SChris Lattner   // Cache file 'stat' results and directories with absolutely paths.
36*226efd35SChris Lattner   if (!S_ISDIR(StatBuf.st_mode) || llvm::sys::Path(Path).isAbsolute())
37*226efd35SChris Lattner     StatCalls[Path] = StatResult(Result, StatBuf);
38*226efd35SChris Lattner 
39*226efd35SChris Lattner   return Result;
40*226efd35SChris Lattner }
41