1 //===- FileSystemStatCache.h - Caching for 'stat' calls ---------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
11 /// Defines the FileSystemStatCache interface.
13 //===----------------------------------------------------------------------===//
15 #ifndef LLVM_CLANG_BASIC_FILESYSTEMSTATCACHE_H
16 #define LLVM_CLANG_BASIC_FILESYSTEMSTATCACHE_H
18 #include "clang/Basic/LLVM.h"
19 #include "llvm/ADT/StringMap.h"
20 #include "llvm/ADT/StringRef.h"
21 #include "llvm/Support/Allocator.h"
22 #include "llvm/Support/FileSystem.h"
38 // FIXME: should probably replace this with vfs::Status
43 llvm::sys::fs::UniqueID UniqueID;
44 bool IsDirectory = false;
45 bool IsNamedPipe = false;
48 // FIXME: remove this when files support multiple names
49 bool IsVFSMapped = false;
54 /// Abstract interface for introducing a FileManager cache for 'stat'
55 /// system calls, which is used by precompiled and pretokenized headers to
56 /// improve performance.
57 class FileSystemStatCache {
58 virtual void anchor();
61 std::unique_ptr<FileSystemStatCache> NextStatCache;
64 virtual ~FileSystemStatCache() = default;
67 /// We know the file exists and its cached stat data.
70 /// We know that the file doesn't exist.
74 /// Get the 'stat' information for the specified path, using the cache
75 /// to accelerate it if possible.
77 /// \returns \c true if the path does not exist or \c false if it exists.
79 /// If isFile is true, then this lookup should only return success for files
80 /// (not directories). If it is false this lookup should only return
81 /// success for directories (not files). On a successful file lookup, the
82 /// implementation can optionally fill in \p F with a valid \p File object and
83 /// the client guarantees that it will close it.
84 static bool get(StringRef Path, FileData &Data, bool isFile,
85 std::unique_ptr<vfs::File> *F, FileSystemStatCache *Cache,
88 /// Sets the next stat call cache in the chain of stat caches.
89 /// Takes ownership of the given stat cache.
90 void setNextStatCache(std::unique_ptr<FileSystemStatCache> Cache) {
91 NextStatCache = std::move(Cache);
94 /// Retrieve the next stat call cache in the chain.
95 FileSystemStatCache *getNextStatCache() { return NextStatCache.get(); }
97 /// Retrieve the next stat call cache in the chain, transferring
98 /// ownership of this cache (and, transitively, all of the remaining caches)
100 std::unique_ptr<FileSystemStatCache> takeNextStatCache() {
101 return std::move(NextStatCache);
105 // FIXME: The pointer here is a non-owning/optional reference to the
106 // unique_ptr. Optional<unique_ptr<vfs::File>&> might be nicer, but
107 // Optional needs some work to support references so this isn't possible yet.
108 virtual LookupResult getStat(StringRef Path, FileData &Data, bool isFile,
109 std::unique_ptr<vfs::File> *F,
110 vfs::FileSystem &FS) = 0;
112 LookupResult statChained(StringRef Path, FileData &Data, bool isFile,
113 std::unique_ptr<vfs::File> *F, vfs::FileSystem &FS) {
114 if (FileSystemStatCache *Next = getNextStatCache())
115 return Next->getStat(Path, Data, isFile, F, FS);
117 // If we hit the end of the list of stat caches to try, just compute and
118 // return it without a cache.
119 return get(Path, Data, isFile, F, nullptr, FS) ? CacheMissing : CacheExists;
123 /// A stat "cache" that can be used by FileManager to keep
124 /// track of the results of stat() calls that occur throughout the
125 /// execution of the front end.
126 class MemorizeStatCalls : public FileSystemStatCache {
128 /// The set of stat() calls that have been seen.
129 llvm::StringMap<FileData, llvm::BumpPtrAllocator> StatCalls;
132 llvm::StringMap<FileData, llvm::BumpPtrAllocator>::const_iterator;
134 iterator begin() const { return StatCalls.begin(); }
135 iterator end() const { return StatCalls.end(); }
137 LookupResult getStat(StringRef Path, FileData &Data, bool isFile,
138 std::unique_ptr<vfs::File> *F,
139 vfs::FileSystem &FS) override;
144 #endif // LLVM_CLANG_BASIC_FILESYSTEMSTATCACHE_H