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