15f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===--- FileManager.h - File System Probing and Caching --------*- C++ -*-===//
25f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
35f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//                     The LLVM Compiler Infrastructure
45f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// This file is distributed under the University of Illinois Open Source
60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// License. See LICENSE.TXT for details.
75f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
85f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
92f7f5b1f5ff023cb8c4008ae53a12b09e3ea2622James Dennett///
102f7f5b1f5ff023cb8c4008ae53a12b09e3ea2622James Dennett/// \file
112f7f5b1f5ff023cb8c4008ae53a12b09e3ea2622James Dennett/// \brief Defines the clang::FileManager interface and associated types.
122f7f5b1f5ff023cb8c4008ae53a12b09e3ea2622James Dennett///
135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#ifndef LLVM_CLANG_FILEMANAGER_H
165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#define LLVM_CLANG_FILEMANAGER_H
175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1839b49bcaaddb1049234fca9500c0ac02c088e23dChris Lattner#include "clang/Basic/FileSystemOptions.h"
19686775deca8b8685eb90801495880e3abdd844c2Chris Lattner#include "clang/Basic/LLVM.h"
20651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "clang/Basic/VirtualFileSystem.h"
21713b7c011869f177dc76e6df4f7f44b1bd073bb0Douglas Gregor#include "llvm/ADT/DenseMap.h"
224f32786ac45210143654390177105eb749b614e9Ted Kremenek#include "llvm/ADT/IntrusiveRefCntPtr.h"
23057e567f1b375190779e5341f42861896cdee442Douglas Gregor#include "llvm/ADT/SmallVector.h"
245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "llvm/ADT/StringMap.h"
25458fb10ef5ba2d7b375c6c64095c1458af0a5be3Benjamin Kramer#include "llvm/ADT/StringRef.h"
26f3eb9219cf4b4e80c377d37aed72d5d6d840b7bcTed Kremenek#include "llvm/Support/Allocator.h"
27651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include <memory>
285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// FIXME: Enhance libsystem to support inode and other fields in stat.
295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include <sys/types.h>
30651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include <map>
3110e286aa8d39fb51a21412850265d9dae74613eeChris Lattner
321626601b00a1feccd6b7a3f54e2991f56b659192Dylan Noblesmith#ifdef _MSC_VER
331626601b00a1feccd6b7a3f54e2991f56b659192Dylan Noblesmithtypedef unsigned short mode_t;
341626601b00a1feccd6b7a3f54e2991f56b659192Dylan Noblesmith#endif
351626601b00a1feccd6b7a3f54e2991f56b659192Dylan Noblesmith
3610e286aa8d39fb51a21412850265d9dae74613eeChris Lattnerstruct stat;
375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
38389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidisnamespace llvm {
39389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidisclass MemoryBuffer;
40389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis}
41389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis
425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencernamespace clang {
435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass FileManager;
4410e286aa8d39fb51a21412850265d9dae74613eeChris Lattnerclass FileSystemStatCache;
4570042f5d1ca378138f90b7b9384023701f5d03d8David Blaikie
46af50aab0c317462129d73ae8000c6394c718598dJames Dennett/// \brief Cached information about one directory (either on disk or in
47af50aab0c317462129d73ae8000c6394c718598dJames Dennett/// the virtual file system).
485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass DirectoryEntry {
495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  const char *Name;   // Name of the directory.
505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  friend class FileManager;
515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic:
526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  DirectoryEntry() : Name(nullptr) {}
531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  const char *getName() const { return Name; }
545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
56af50aab0c317462129d73ae8000c6394c718598dJames Dennett/// \brief Cached information about one file (either on disk
57af50aab0c317462129d73ae8000c6394c718598dJames Dennett/// or in the virtual file system).
585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer///
59651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// If the 'File' member is valid, then this FileEntry has an open file
60af50aab0c317462129d73ae8000c6394c718598dJames Dennett/// descriptor for the file.
615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass FileEntry {
62651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  std::string Name;           // Name of the file.
635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  off_t Size;                 // File size in bytes.
645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  time_t ModTime;             // Modification time of file.
655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  const DirectoryEntry *Dir;  // Directory file lives in.
665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  unsigned UID;               // A unique (small) ID for the file.
670fda0f75f053ad9afdb2bb8d4ea72c5e6a49d657Rafael Espindola  llvm::sys::fs::UniqueID UniqueID;
680fda0f75f053ad9afdb2bb8d4ea72c5e6a49d657Rafael Espindola  bool IsNamedPipe;
690fda0f75f053ad9afdb2bb8d4ea72c5e6a49d657Rafael Espindola  bool InPCH;
70651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  bool IsValid;               // Is this \c FileEntry initialized and valid?
7170042f5d1ca378138f90b7b9384023701f5d03d8David Blaikie
72651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief The open file, if it is owned by the \p FileEntry.
73651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  mutable std::unique_ptr<vfs::File> File;
745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  friend class FileManager;
7570042f5d1ca378138f90b7b9384023701f5d03d8David Blaikie
76651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void closeFile() const {
776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    File.reset(nullptr); // rely on destructor to close File
78e4fed47acee9e7ca9c9cfa77c3920eec4639d7d0Chris Lattner  }
7970042f5d1ca378138f90b7b9384023701f5d03d8David Blaikie
80651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void operator=(const FileEntry &) LLVM_DELETED_FUNCTION;
81f9f7766846a205bc900b578f944567e679b221aaChris Lattner
82651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinespublic:
83651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  FileEntry()
84651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      : UniqueID(0, 0), IsNamedPipe(false), InPCH(false), IsValid(false)
85651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  {}
86651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
87651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // FIXME: this is here to allow putting FileEntry in std::map.  Once we have
88651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // emplace, we shouldn't need a copy constructor anymore.
89651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// Intentionally does not copy fields that are not set in an uninitialized
90651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \c FileEntry.
91651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  FileEntry(const FileEntry &FE) : UniqueID(FE.UniqueID),
92651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      IsNamedPipe(FE.IsNamedPipe), InPCH(FE.InPCH), IsValid(FE.IsValid) {
93651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    assert(!isValid() && "Cannot copy an initialized FileEntry");
94651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
96651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  const char *getName() const { return Name.c_str(); }
97651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  bool isValid() const { return IsValid; }
985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  off_t getSize() const { return Size; }
995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  unsigned getUID() const { return UID; }
1000fda0f75f053ad9afdb2bb8d4ea72c5e6a49d657Rafael Espindola  const llvm::sys::fs::UniqueID &getUniqueID() const { return UniqueID; }
1010fda0f75f053ad9afdb2bb8d4ea72c5e6a49d657Rafael Espindola  bool isInPCH() const { return InPCH; }
1025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  time_t getModificationTime() const { return ModTime; }
1031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
104af50aab0c317462129d73ae8000c6394c718598dJames Dennett  /// \brief Return the directory the file lives in.
1055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  const DirectoryEntry *getDir() const { return Dir; }
1061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1070fda0f75f053ad9afdb2bb8d4ea72c5e6a49d657Rafael Espindola  bool operator<(const FileEntry &RHS) const { return UniqueID < RHS.UniqueID; }
108ce36ecd5a509af8fc5924d21694df36e8bc94a95Daniel Dunbar
109ce36ecd5a509af8fc5924d21694df36e8bc94a95Daniel Dunbar  /// \brief Check whether the file is a named pipe (and thus can't be opened by
110ce36ecd5a509af8fc5924d21694df36e8bc94a95Daniel Dunbar  /// the native FileManager methods).
1110fda0f75f053ad9afdb2bb8d4ea72c5e6a49d657Rafael Espindola  bool isNamedPipe() const { return IsNamedPipe; }
1125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
1135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1140fda0f75f053ad9afdb2bb8d4ea72c5e6a49d657Rafael Espindolastruct FileData;
1150fda0f75f053ad9afdb2bb8d4ea72c5e6a49d657Rafael Espindola
116af50aab0c317462129d73ae8000c6394c718598dJames Dennett/// \brief Implements support for file system lookup, file system caching,
117af50aab0c317462129d73ae8000c6394c718598dJames Dennett/// and directory search management.
118af50aab0c317462129d73ae8000c6394c718598dJames Dennett///
119af50aab0c317462129d73ae8000c6394c718598dJames Dennett/// This also handles more advanced properties, such as uniquing files based
120af50aab0c317462129d73ae8000c6394c718598dJames Dennett/// on "inode", so that a file with two names (e.g. symlinked) will be treated
121af50aab0c317462129d73ae8000c6394c718598dJames Dennett/// as a single file.
1225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer///
123c93dc7889644293e318e19d82830ea2acc45b678Dylan Noblesmithclass FileManager : public RefCountedBase<FileManager> {
124651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  IntrusiveRefCntPtr<vfs::FileSystem> FS;
12539b49bcaaddb1049234fca9500c0ac02c088e23dChris Lattner  FileSystemOptions FileSystemOpts;
1269b555ea217565ac0f8bf7255b29496916cb03476Zhanyong Wan
127af50aab0c317462129d73ae8000c6394c718598dJames Dennett  /// \brief Cache for existing real directories.
128651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  std::map<llvm::sys::fs::UniqueID, DirectoryEntry> UniqueRealDirs;
129af50aab0c317462129d73ae8000c6394c718598dJames Dennett
130af50aab0c317462129d73ae8000c6394c718598dJames Dennett  /// \brief Cache for existing real files.
131651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  std::map<llvm::sys::fs::UniqueID, FileEntry> UniqueRealFiles;
1326bb816a3b895e9c983d89b22d510dca58a0eb75eTed Kremenek
133af50aab0c317462129d73ae8000c6394c718598dJames Dennett  /// \brief The virtual directories that we have allocated.
134af50aab0c317462129d73ae8000c6394c718598dJames Dennett  ///
135af50aab0c317462129d73ae8000c6394c718598dJames Dennett  /// For each virtual file (e.g. foo/bar/baz.cpp), we add all of its parent
1369b555ea217565ac0f8bf7255b29496916cb03476Zhanyong Wan  /// directories (foo/ and foo/bar/) here.
137686775deca8b8685eb90801495880e3abdd844c2Chris Lattner  SmallVector<DirectoryEntry*, 4> VirtualDirectoryEntries;
1389b555ea217565ac0f8bf7255b29496916cb03476Zhanyong Wan  /// \brief The virtual files that we have allocated.
139686775deca8b8685eb90801495880e3abdd844c2Chris Lattner  SmallVector<FileEntry*, 4> VirtualFileEntries;
1409b555ea217565ac0f8bf7255b29496916cb03476Zhanyong Wan
141af50aab0c317462129d73ae8000c6394c718598dJames Dennett  /// \brief A cache that maps paths to directory entries (either real or
142af50aab0c317462129d73ae8000c6394c718598dJames Dennett  /// virtual) we have looked up
143af50aab0c317462129d73ae8000c6394c718598dJames Dennett  ///
144af50aab0c317462129d73ae8000c6394c718598dJames Dennett  /// The actual Entries for real directories/files are
1459b555ea217565ac0f8bf7255b29496916cb03476Zhanyong Wan  /// owned by UniqueRealDirs/UniqueRealFiles above, while the Entries
1469b555ea217565ac0f8bf7255b29496916cb03476Zhanyong Wan  /// for virtual directories/files are owned by
1479b555ea217565ac0f8bf7255b29496916cb03476Zhanyong Wan  /// VirtualDirectoryEntries/VirtualFileEntries above.
1485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ///
1499b555ea217565ac0f8bf7255b29496916cb03476Zhanyong Wan  llvm::StringMap<DirectoryEntry*, llvm::BumpPtrAllocator> SeenDirEntries;
150af50aab0c317462129d73ae8000c6394c718598dJames Dennett
151af50aab0c317462129d73ae8000c6394c718598dJames Dennett  /// \brief A cache that maps paths to file entries (either real or
152af50aab0c317462129d73ae8000c6394c718598dJames Dennett  /// virtual) we have looked up.
153af50aab0c317462129d73ae8000c6394c718598dJames Dennett  ///
154af50aab0c317462129d73ae8000c6394c718598dJames Dennett  /// \see SeenDirEntries
1559b555ea217565ac0f8bf7255b29496916cb03476Zhanyong Wan  llvm::StringMap<FileEntry*, llvm::BumpPtrAllocator> SeenFileEntries;
1561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
157713b7c011869f177dc76e6df4f7f44b1bd073bb0Douglas Gregor  /// \brief The canonical names of directories.
158713b7c011869f177dc76e6df4f7f44b1bd073bb0Douglas Gregor  llvm::DenseMap<const DirectoryEntry *, llvm::StringRef> CanonicalDirNames;
159713b7c011869f177dc76e6df4f7f44b1bd073bb0Douglas Gregor
160713b7c011869f177dc76e6df4f7f44b1bd073bb0Douglas Gregor  /// \brief Storage for canonical names that we have computed.
161713b7c011869f177dc76e6df4f7f44b1bd073bb0Douglas Gregor  llvm::BumpPtrAllocator CanonicalNameStorage;
162713b7c011869f177dc76e6df4f7f44b1bd073bb0Douglas Gregor
163af50aab0c317462129d73ae8000c6394c718598dJames Dennett  /// \brief Each FileEntry we create is assigned a unique ID #.
1645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ///
1655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  unsigned NextFileUID;
1661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Statistics.
1685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  unsigned NumDirLookups, NumFileLookups;
1695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  unsigned NumDirCacheMisses, NumFileCacheMisses;
1701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
171fc7052d4a241ee6fc70afea7c1c9560147f0a49cTed Kremenek  // Caching.
172651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  std::unique_ptr<FileSystemStatCache> StatCache;
1731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1740fda0f75f053ad9afdb2bb8d4ea72c5e6a49d657Rafael Espindola  bool getStatValue(const char *Path, FileData &Data, bool isFile,
175ef8225444452a1486bd721f3285301fe84643b00Stephen Hines                    std::unique_ptr<vfs::File> *F);
1769b555ea217565ac0f8bf7255b29496916cb03476Zhanyong Wan
1779b555ea217565ac0f8bf7255b29496916cb03476Zhanyong Wan  /// Add all ancestors of the given path (pointing to either a file
1789b555ea217565ac0f8bf7255b29496916cb03476Zhanyong Wan  /// or a directory) as virtual directories.
179686775deca8b8685eb90801495880e3abdd844c2Chris Lattner  void addAncestorsAsVirtualDirs(StringRef Path);
1809b555ea217565ac0f8bf7255b29496916cb03476Zhanyong Wan
1815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic:
182651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  FileManager(const FileSystemOptions &FileSystemOpts,
1836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines              IntrusiveRefCntPtr<vfs::FileSystem> FS = nullptr);
1846bb816a3b895e9c983d89b22d510dca58a0eb75eTed Kremenek  ~FileManager();
1855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
18610e286aa8d39fb51a21412850265d9dae74613eeChris Lattner  /// \brief Installs the provided FileSystemStatCache object within
1879b555ea217565ac0f8bf7255b29496916cb03476Zhanyong Wan  /// the FileManager.
18852e7108f51a4a9f4d6e84f33fb594d06e1d79560Douglas Gregor  ///
18952e7108f51a4a9f4d6e84f33fb594d06e1d79560Douglas Gregor  /// Ownership of this object is transferred to the FileManager.
19052e7108f51a4a9f4d6e84f33fb594d06e1d79560Douglas Gregor  ///
19152e7108f51a4a9f4d6e84f33fb594d06e1d79560Douglas Gregor  /// \param statCache the new stat cache to install. Ownership of this
19252e7108f51a4a9f4d6e84f33fb594d06e1d79560Douglas Gregor  /// object is transferred to the FileManager.
19352e7108f51a4a9f4d6e84f33fb594d06e1d79560Douglas Gregor  ///
19452e7108f51a4a9f4d6e84f33fb594d06e1d79560Douglas Gregor  /// \param AtBeginning whether this new stat cache must be installed at the
19552e7108f51a4a9f4d6e84f33fb594d06e1d79560Douglas Gregor  /// beginning of the chain of stat caches. Otherwise, it will be added to
19652e7108f51a4a9f4d6e84f33fb594d06e1d79560Douglas Gregor  /// the end of the chain.
19710e286aa8d39fb51a21412850265d9dae74613eeChris Lattner  void addStatCache(FileSystemStatCache *statCache, bool AtBeginning = false);
19852e7108f51a4a9f4d6e84f33fb594d06e1d79560Douglas Gregor
19910e286aa8d39fb51a21412850265d9dae74613eeChris Lattner  /// \brief Removes the specified FileSystemStatCache object from the manager.
20010e286aa8d39fb51a21412850265d9dae74613eeChris Lattner  void removeStatCache(FileSystemStatCache *statCache);
2019b555ea217565ac0f8bf7255b29496916cb03476Zhanyong Wan
20298be86038b1e891a05583061c55dfa974150eb2cManuel Klimek  /// \brief Removes all FileSystemStatCache objects from the manager.
20398be86038b1e891a05583061c55dfa974150eb2cManuel Klimek  void clearStatCaches();
20498be86038b1e891a05583061c55dfa974150eb2cManuel Klimek
20540cc104d392635f5f594d495c2f878a7d4c003f9James Dennett  /// \brief Lookup, cache, and verify the specified directory (real or
20640cc104d392635f5f594d495c2f878a7d4c003f9James Dennett  /// virtual).
20740cc104d392635f5f594d495c2f878a7d4c003f9James Dennett  ///
20840cc104d392635f5f594d495c2f878a7d4c003f9James Dennett  /// This returns NULL if the directory doesn't exist.
2091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
2106e975c4517958bcc11c834336d340797356058dbDouglas Gregor  /// \param CacheFailure If true and the file does not exist, we'll cache
2116e975c4517958bcc11c834336d340797356058dbDouglas Gregor  /// the failure to find this file.
2126e975c4517958bcc11c834336d340797356058dbDouglas Gregor  const DirectoryEntry *getDirectory(StringRef DirName,
2136e975c4517958bcc11c834336d340797356058dbDouglas Gregor                                     bool CacheFailure = true);
2141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2153cd0128ce49abe658d1858c541e836e57959e04aArgyrios Kyrtzidis  /// \brief Lookup, cache, and verify the specified file (real or
21640cc104d392635f5f594d495c2f878a7d4c003f9James Dennett  /// virtual).
21740cc104d392635f5f594d495c2f878a7d4c003f9James Dennett  ///
21840cc104d392635f5f594d495c2f878a7d4c003f9James Dennett  /// This returns NULL if the file doesn't exist.
2191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
2206e975c4517958bcc11c834336d340797356058dbDouglas Gregor  /// \param OpenFile if true and the file exists, it will be opened.
2216e975c4517958bcc11c834336d340797356058dbDouglas Gregor  ///
2226e975c4517958bcc11c834336d340797356058dbDouglas Gregor  /// \param CacheFailure If true and the file does not exist, we'll cache
2236e975c4517958bcc11c834336d340797356058dbDouglas Gregor  /// the failure to find this file.
2246e975c4517958bcc11c834336d340797356058dbDouglas Gregor  const FileEntry *getFile(StringRef Filename, bool OpenFile = false,
2256e975c4517958bcc11c834336d340797356058dbDouglas Gregor                           bool CacheFailure = true);
2261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2271afb661bc5444462a246cefa0effa61ef25fab29Jonathan D. Turner  /// \brief Returns the current file system options
2281afb661bc5444462a246cefa0effa61ef25fab29Jonathan D. Turner  const FileSystemOptions &getFileSystemOptions() { return FileSystemOpts; }
2291afb661bc5444462a246cefa0effa61ef25fab29Jonathan D. Turner
230651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  IntrusiveRefCntPtr<vfs::FileSystem> getVirtualFileSystem() const {
231651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return FS;
232651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
233651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
234057e567f1b375190779e5341f42861896cdee442Douglas Gregor  /// \brief Retrieve a file entry for a "virtual" file that acts as
23540cc104d392635f5f594d495c2f878a7d4c003f9James Dennett  /// if there were a file with the given name on disk.
23640cc104d392635f5f594d495c2f878a7d4c003f9James Dennett  ///
23740cc104d392635f5f594d495c2f878a7d4c003f9James Dennett  /// The file itself is not accessed.
238686775deca8b8685eb90801495880e3abdd844c2Chris Lattner  const FileEntry *getVirtualFile(StringRef Filename, off_t Size,
23939b49bcaaddb1049234fca9500c0ac02c088e23dChris Lattner                                  time_t ModificationTime);
240389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis
241389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis  /// \brief Open the specified file as a MemoryBuffer, returning a new
242389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis  /// MemoryBuffer if successful, otherwise returning null.
243389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis  llvm::MemoryBuffer *getBufferForFile(const FileEntry *Entry,
2446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                       std::string *ErrorStr = nullptr,
245ef8225444452a1486bd721f3285301fe84643b00Stephen Hines                                       bool isVolatile = false,
246ef8225444452a1486bd721f3285301fe84643b00Stephen Hines                                       bool ShouldCloseOpenFile = true);
247686775deca8b8685eb90801495880e3abdd844c2Chris Lattner  llvm::MemoryBuffer *getBufferForFile(StringRef Filename,
2486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                       std::string *ErrorStr = nullptr);
249389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis
250af50aab0c317462129d73ae8000c6394c718598dJames Dennett  /// \brief Get the 'stat' information for the given \p Path.
25140cc104d392635f5f594d495c2f878a7d4c003f9James Dennett  ///
25240cc104d392635f5f594d495c2f878a7d4c003f9James Dennett  /// If the path is relative, it will be resolved against the WorkingDir of the
25340cc104d392635f5f594d495c2f878a7d4c003f9James Dennett  /// FileManager's FileSystemOptions.
254651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ///
255651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \returns false on success, true on error.
256aefb1d3312a63ac8d289a2e84747fe61a7f61823Rafael Espindola  bool getNoncachedStatValue(StringRef Path,
257651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                             vfs::Status &Result);
2587dbafb3ade491a41100c97597209455ee10c537dAnders Carlsson
259af50aab0c317462129d73ae8000c6394c718598dJames Dennett  /// \brief Remove the real file \p Entry from the cache.
2605ba0559f2f0ddd62de16547af514dbaf93b79585Axel Naumann  void invalidateCache(const FileEntry *Entry);
2613ce42c37b0ef6b10538f5040a33d19a6e6988d05Axel Naumann
262389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis  /// \brief If path is not absolute and FileSystemOptions set the working
263389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis  /// directory, the path is modified to be relative to the given
264389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis  /// working directory.
265686775deca8b8685eb90801495880e3abdd844c2Chris Lattner  void FixupRelativePath(SmallVectorImpl<char> &path) const;
266d47aad92ccfb6c2cf5921f8fefddd7e541dc9bb3Anders Carlsson
267cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  /// \brief Produce an array mapping from the unique IDs assigned to each
268cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  /// file to the corresponding FileEntry pointer.
269cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  void GetUniqueIDMapping(
270686775deca8b8685eb90801495880e3abdd844c2Chris Lattner                    SmallVectorImpl<const FileEntry *> &UIDToFiles) const;
27170042f5d1ca378138f90b7b9384023701f5d03d8David Blaikie
272d54dff026b02303a35147224de72bb44cbb53c79Argyrios Kyrtzidis  /// \brief Modifies the size and modification time of a previously created
273d54dff026b02303a35147224de72bb44cbb53c79Argyrios Kyrtzidis  /// FileEntry. Use with caution.
274d54dff026b02303a35147224de72bb44cbb53c79Argyrios Kyrtzidis  static void modifyFileEntry(FileEntry *File, off_t Size,
275d54dff026b02303a35147224de72bb44cbb53c79Argyrios Kyrtzidis                              time_t ModificationTime);
276d54dff026b02303a35147224de72bb44cbb53c79Argyrios Kyrtzidis
277713b7c011869f177dc76e6df4f7f44b1bd073bb0Douglas Gregor  /// \brief Retrieve the canonical name for a given directory.
278713b7c011869f177dc76e6df4f7f44b1bd073bb0Douglas Gregor  ///
279713b7c011869f177dc76e6df4f7f44b1bd073bb0Douglas Gregor  /// This is a very expensive operation, despite its results being cached,
280713b7c011869f177dc76e6df4f7f44b1bd073bb0Douglas Gregor  /// and should only be used when the physical layout of the file system is
281713b7c011869f177dc76e6df4f7f44b1bd073bb0Douglas Gregor  /// required, which is (almost) never.
282713b7c011869f177dc76e6df4f7f44b1bd073bb0Douglas Gregor  StringRef getCanonicalName(const DirectoryEntry *Dir);
283713b7c011869f177dc76e6df4f7f44b1bd073bb0Douglas Gregor
2845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void PrintStats() const;
2855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
2865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}  // end namespace clang
2885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#endif
290