FileManager.h revision 75dfb65c38d51772df9a00ce2d2feeefd55667ad
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//===----------------------------------------------------------------------===// 95f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// This file defines the FileManager interface. 115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#ifndef LLVM_CLANG_FILEMANAGER_H 155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#define LLVM_CLANG_FILEMANAGER_H 165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1739b49bcaaddb1049234fca9500c0ac02c088e23dChris Lattner#include "clang/Basic/FileSystemOptions.h" 18057e567f1b375190779e5341f42861896cdee442Douglas Gregor#include "llvm/ADT/SmallVector.h" 195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "llvm/ADT/StringMap.h" 20458fb10ef5ba2d7b375c6c64095c1458af0a5be3Benjamin Kramer#include "llvm/ADT/StringRef.h" 2196438f319bb07d9a40564b5e01333f82c0c8a61eTed Kremenek#include "llvm/ADT/OwningPtr.h" 22f3eb9219cf4b4e80c377d37aed72d5d6d840b7bcTed Kremenek#include "llvm/Support/Allocator.h" 23ea684e699ea84e61711e279f5fa7a1b9f3d46bc2Cedric Venet#include "llvm/Config/config.h" // for mode_t 245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// FIXME: Enhance libsystem to support inode and other fields in stat. 255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include <sys/types.h> 26fc7052d4a241ee6fc70afea7c1c9560147f0a49cTed Kremenek#include <sys/stat.h> 275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 28389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidisnamespace llvm { 29389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidisclass MemoryBuffer; 30389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidisnamespace sys { 31389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidisclass Path; 32389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis} 33389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis} 34389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis 355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencernamespace clang { 365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass FileManager; 371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// DirectoryEntry - Cached information about one directory on the disk. 395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// 405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass DirectoryEntry { 415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer const char *Name; // Name of the directory. 425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer friend class FileManager; 435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic: 445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer DirectoryEntry() : Name(0) {} 451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const char *getName() const { return Name; } 465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}; 475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// FileEntry - Cached information about one file on the disk. 495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// 505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass FileEntry { 51f17765d202d1ec34ada7ff3f18d18731588143c2Chris Lattner const char *Name; // Name of the file. 525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer off_t Size; // File size in bytes. 535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer time_t ModTime; // Modification time of file. 545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer const DirectoryEntry *Dir; // Directory file lives in. 555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer unsigned UID; // A unique (small) ID for the file. 56bca6d125c77c93c7fa41798c15348175a6bb1267Ted Kremenek dev_t Device; // ID for the device containing the file. 57bca6d125c77c93c7fa41798c15348175a6bb1267Ted Kremenek ino_t Inode; // Inode number for the file. 5896438f319bb07d9a40564b5e01333f82c0c8a61eTed Kremenek mode_t FileMode; // The file mode as returned by 'stat'. 595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer friend class FileManager; 605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic: 6196438f319bb07d9a40564b5e01333f82c0c8a61eTed Kremenek FileEntry(dev_t device, ino_t inode, mode_t m) 6296438f319bb07d9a40564b5e01333f82c0c8a61eTed Kremenek : Name(0), Device(device), Inode(inode), FileMode(m) {} 636bb816a3b895e9c983d89b22d510dca58a0eb75eTed Kremenek // Add a default constructor for use with llvm::StringMap 6496438f319bb07d9a40564b5e01333f82c0c8a61eTed Kremenek FileEntry() : Name(0), Device(0), Inode(0), FileMode(0) {} 651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer const char *getName() const { return Name; } 675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer off_t getSize() const { return Size; } 685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer unsigned getUID() const { return UID; } 69bca6d125c77c93c7fa41798c15348175a6bb1267Ted Kremenek ino_t getInode() const { return Inode; } 707f1752797d4a4344b539ad9452471871c0eec64bTed Kremenek dev_t getDevice() const { return Device; } 715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer time_t getModificationTime() const { return ModTime; } 7296438f319bb07d9a40564b5e01333f82c0c8a61eTed Kremenek mode_t getFileMode() const { return FileMode; } 731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// getDir - Return the directory the file lives in. 755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// 765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer const DirectoryEntry *getDir() const { return Dir; } 771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 78bca6d125c77c93c7fa41798c15348175a6bb1267Ted Kremenek bool operator<(const FileEntry& RHS) const { 79bca6d125c77c93c7fa41798c15348175a6bb1267Ted Kremenek return Device < RHS.Device || (Device == RHS.Device && Inode < RHS.Inode); 80bca6d125c77c93c7fa41798c15348175a6bb1267Ted Kremenek } 815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}; 825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 8352e7108f51a4a9f4d6e84f33fb594d06e1d79560Douglas Gregor/// \brief Abstract interface for introducing a FileManager cache for 'stat' 8452e7108f51a4a9f4d6e84f33fb594d06e1d79560Douglas Gregor/// system calls, which is used by precompiled and pretokenized headers to 8552e7108f51a4a9f4d6e84f33fb594d06e1d79560Douglas Gregor/// improve performance. 86fc7052d4a241ee6fc70afea7c1c9560147f0a49cTed Kremenekclass StatSysCallCache { 8752e7108f51a4a9f4d6e84f33fb594d06e1d79560Douglas Gregorprotected: 8852e7108f51a4a9f4d6e84f33fb594d06e1d79560Douglas Gregor llvm::OwningPtr<StatSysCallCache> NextStatCache; 8952e7108f51a4a9f4d6e84f33fb594d06e1d79560Douglas Gregor 90fc7052d4a241ee6fc70afea7c1c9560147f0a49cTed Kremenekpublic: 91fc7052d4a241ee6fc70afea7c1c9560147f0a49cTed Kremenek virtual ~StatSysCallCache() {} 9252e7108f51a4a9f4d6e84f33fb594d06e1d79560Douglas Gregor virtual int stat(const char *path, struct stat *buf) { 9352e7108f51a4a9f4d6e84f33fb594d06e1d79560Douglas Gregor if (getNextStatCache()) 9452e7108f51a4a9f4d6e84f33fb594d06e1d79560Douglas Gregor return getNextStatCache()->stat(path, buf); 9552e7108f51a4a9f4d6e84f33fb594d06e1d79560Douglas Gregor 9652e7108f51a4a9f4d6e84f33fb594d06e1d79560Douglas Gregor return ::stat(path, buf); 9752e7108f51a4a9f4d6e84f33fb594d06e1d79560Douglas Gregor } 9852e7108f51a4a9f4d6e84f33fb594d06e1d79560Douglas Gregor 9952e7108f51a4a9f4d6e84f33fb594d06e1d79560Douglas Gregor /// \brief Sets the next stat call cache in the chain of stat caches. 10052e7108f51a4a9f4d6e84f33fb594d06e1d79560Douglas Gregor /// Takes ownership of the given stat cache. 10152e7108f51a4a9f4d6e84f33fb594d06e1d79560Douglas Gregor void setNextStatCache(StatSysCallCache *Cache) { 10252e7108f51a4a9f4d6e84f33fb594d06e1d79560Douglas Gregor NextStatCache.reset(Cache); 10352e7108f51a4a9f4d6e84f33fb594d06e1d79560Douglas Gregor } 10452e7108f51a4a9f4d6e84f33fb594d06e1d79560Douglas Gregor 10552e7108f51a4a9f4d6e84f33fb594d06e1d79560Douglas Gregor /// \brief Retrieve the next stat call cache in the chain. 10652e7108f51a4a9f4d6e84f33fb594d06e1d79560Douglas Gregor StatSysCallCache *getNextStatCache() { return NextStatCache.get(); } 10752e7108f51a4a9f4d6e84f33fb594d06e1d79560Douglas Gregor 10852e7108f51a4a9f4d6e84f33fb594d06e1d79560Douglas Gregor /// \brief Retrieve the next stat call cache in the chain, transferring 10952e7108f51a4a9f4d6e84f33fb594d06e1d79560Douglas Gregor /// ownership of this cache (and, transitively, all of the remaining caches) 11052e7108f51a4a9f4d6e84f33fb594d06e1d79560Douglas Gregor /// to the caller. 11152e7108f51a4a9f4d6e84f33fb594d06e1d79560Douglas Gregor StatSysCallCache *takeNextStatCache() { return NextStatCache.take(); } 112fc7052d4a241ee6fc70afea7c1c9560147f0a49cTed Kremenek}; 1134fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor 11452e7108f51a4a9f4d6e84f33fb594d06e1d79560Douglas Gregor/// \brief A stat "cache" that can be used by FileManager to keep 1154fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor/// track of the results of stat() calls that occur throughout the 1164fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor/// execution of the front end. 1174fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregorclass MemorizeStatCalls : public StatSysCallCache { 1184fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregorpublic: 1191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief The result of a stat() call. 1204fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor /// 1214fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor /// The first member is the result of calling stat(). If stat() 1224fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor /// found something, the second member is a copy of the stat 1234fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor /// structure. 1244fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor typedef std::pair<int, struct stat> StatResult; 1254fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor 1261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief The set of stat() calls that have been 1274fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor llvm::StringMap<StatResult, llvm::BumpPtrAllocator> StatCalls; 1284fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor 1294fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor typedef llvm::StringMap<StatResult, llvm::BumpPtrAllocator>::const_iterator 1304fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor iterator; 1311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1324fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor iterator begin() const { return StatCalls.begin(); } 1334fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor iterator end() const { return StatCalls.end(); } 1344fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor 1354fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor virtual int stat(const char *path, struct stat *buf); 1364fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor}; 1374fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor 1385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// FileManager - Implements support for file system lookup, file system 1395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// caching, and directory search management. This also handles more advanced 1405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// properties, such as uniquing files based on "inode", so that a file with two 1415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// names (e.g. symlinked) will be treated as a single file. 1425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// 1435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass FileManager { 14439b49bcaaddb1049234fca9500c0ac02c088e23dChris Lattner FileSystemOptions FileSystemOpts; 1457ad97ffa631af6ad678c79b38341ac995f347ce9Chris Lattner 1466bb816a3b895e9c983d89b22d510dca58a0eb75eTed Kremenek class UniqueDirContainer; 1476bb816a3b895e9c983d89b22d510dca58a0eb75eTed Kremenek class UniqueFileContainer; 1486bb816a3b895e9c983d89b22d510dca58a0eb75eTed Kremenek 1496bb816a3b895e9c983d89b22d510dca58a0eb75eTed Kremenek /// UniqueDirs/UniqueFiles - Cache for existing directories/files. 1505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// 1516bb816a3b895e9c983d89b22d510dca58a0eb75eTed Kremenek UniqueDirContainer &UniqueDirs; 1526bb816a3b895e9c983d89b22d510dca58a0eb75eTed Kremenek UniqueFileContainer &UniqueFiles; 1536bb816a3b895e9c983d89b22d510dca58a0eb75eTed Kremenek 1545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// DirEntries/FileEntries - This is a cache of directory/file entries we have 1555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// looked up. The actual Entry is owned by UniqueFiles/UniqueDirs above. 1565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// 157f3eb9219cf4b4e80c377d37aed72d5d6d840b7bcTed Kremenek llvm::StringMap<DirectoryEntry*, llvm::BumpPtrAllocator> DirEntries; 158f3eb9219cf4b4e80c377d37aed72d5d6d840b7bcTed Kremenek llvm::StringMap<FileEntry*, llvm::BumpPtrAllocator> FileEntries; 1591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// NextFileUID - Each FileEntry we create is assigned a unique ID #. 1615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// 1625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer unsigned NextFileUID; 1631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 164057e567f1b375190779e5341f42861896cdee442Douglas Gregor /// \brief The virtual files that we have allocated. 165057e567f1b375190779e5341f42861896cdee442Douglas Gregor llvm::SmallVector<FileEntry *, 4> VirtualFileEntries; 166057e567f1b375190779e5341f42861896cdee442Douglas Gregor 1675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Statistics. 1685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer unsigned NumDirLookups, NumFileLookups; 1695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer unsigned NumDirCacheMisses, NumFileCacheMisses; 1701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 171fc7052d4a241ee6fc70afea7c1c9560147f0a49cTed Kremenek // Caching. 17296438f319bb07d9a40564b5e01333f82c0c8a61eTed Kremenek llvm::OwningPtr<StatSysCallCache> StatCache; 17396438f319bb07d9a40564b5e01333f82c0c8a61eTed Kremenek 17475dfb65c38d51772df9a00ce2d2feeefd55667adChris Lattner int stat_cached(const char *path, struct stat *buf); 1751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic: 1777ad97ffa631af6ad678c79b38341ac995f347ce9Chris Lattner FileManager(const FileSystemOptions &FileSystemOpts); 1786bb816a3b895e9c983d89b22d510dca58a0eb75eTed Kremenek ~FileManager(); 1795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 18052e7108f51a4a9f4d6e84f33fb594d06e1d79560Douglas Gregor /// \brief Installs the provided StatSysCallCache object within 18152e7108f51a4a9f4d6e84f33fb594d06e1d79560Douglas Gregor /// the FileManager. 18252e7108f51a4a9f4d6e84f33fb594d06e1d79560Douglas Gregor /// 18352e7108f51a4a9f4d6e84f33fb594d06e1d79560Douglas Gregor /// Ownership of this object is transferred to the FileManager. 18452e7108f51a4a9f4d6e84f33fb594d06e1d79560Douglas Gregor /// 18552e7108f51a4a9f4d6e84f33fb594d06e1d79560Douglas Gregor /// \param statCache the new stat cache to install. Ownership of this 18652e7108f51a4a9f4d6e84f33fb594d06e1d79560Douglas Gregor /// object is transferred to the FileManager. 18752e7108f51a4a9f4d6e84f33fb594d06e1d79560Douglas Gregor /// 18852e7108f51a4a9f4d6e84f33fb594d06e1d79560Douglas Gregor /// \param AtBeginning whether this new stat cache must be installed at the 18952e7108f51a4a9f4d6e84f33fb594d06e1d79560Douglas Gregor /// beginning of the chain of stat caches. Otherwise, it will be added to 19052e7108f51a4a9f4d6e84f33fb594d06e1d79560Douglas Gregor /// the end of the chain. 19152e7108f51a4a9f4d6e84f33fb594d06e1d79560Douglas Gregor void addStatCache(StatSysCallCache *statCache, bool AtBeginning = false); 19252e7108f51a4a9f4d6e84f33fb594d06e1d79560Douglas Gregor 19352e7108f51a4a9f4d6e84f33fb594d06e1d79560Douglas Gregor /// \brief Removes the provided StatSysCallCache object from the file manager. 19452e7108f51a4a9f4d6e84f33fb594d06e1d79560Douglas Gregor void removeStatCache(StatSysCallCache *statCache); 19552e7108f51a4a9f4d6e84f33fb594d06e1d79560Douglas Gregor 1965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// getDirectory - Lookup, cache, and verify the specified directory. This 1975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// returns null if the directory doesn't exist. 1981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 19939b49bcaaddb1049234fca9500c0ac02c088e23dChris Lattner const DirectoryEntry *getDirectory(llvm::StringRef Filename); 2001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// getFile - Lookup, cache, and verify the specified file. This returns null 2025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// if the file doesn't exist. 2031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 20439b49bcaaddb1049234fca9500c0ac02c088e23dChris Lattner const FileEntry *getFile(llvm::StringRef Filename); 2051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 206057e567f1b375190779e5341f42861896cdee442Douglas Gregor /// \brief Retrieve a file entry for a "virtual" file that acts as 207057e567f1b375190779e5341f42861896cdee442Douglas Gregor /// if there were a file with the given name on disk. The file 208057e567f1b375190779e5341f42861896cdee442Douglas Gregor /// itself is not accessed. 209ec1b1cc006cef19e0a95d0ea6fbfd37d0d615066Benjamin Kramer const FileEntry *getVirtualFile(llvm::StringRef Filename, off_t Size, 21039b49bcaaddb1049234fca9500c0ac02c088e23dChris Lattner time_t ModificationTime); 211389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis 212389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis /// \brief Open the specified file as a MemoryBuffer, returning a new 213389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis /// MemoryBuffer if successful, otherwise returning null. 214389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis llvm::MemoryBuffer *getBufferForFile(const FileEntry *Entry, 21575dfb65c38d51772df9a00ce2d2feeefd55667adChris Lattner std::string *ErrorStr = 0); 216389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis llvm::MemoryBuffer *getBufferForFile(llvm::StringRef Filename, 21775dfb65c38d51772df9a00ce2d2feeefd55667adChris Lattner std::string *ErrorStr = 0); 218389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis 219389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis /// \brief If path is not absolute and FileSystemOptions set the working 220389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis /// directory, the path is modified to be relative to the given 221389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis /// working directory. 222389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis static void FixupRelativePath(llvm::sys::Path &path, 223389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis const FileSystemOptions &FSOpts); 22467452f51aec1ad8a3e4c6622c0c57c5d8dc1b6a3Chris Lattner 2255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void PrintStats() const; 2265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}; 2275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} // end namespace clang 2295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#endif 231