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