diff options
author | Reid Spencer <rspencer@reidspencer.com> | 2007-07-11 17:01:13 +0000 |
---|---|---|
committer | Reid Spencer <rspencer@reidspencer.com> | 2007-07-11 17:01:13 +0000 |
commit | 5f016e2cb5d11daeb237544de1c5d59f20fe1a6e (patch) | |
tree | 8b6bfcb8783d16827f896d5facbd4549300e8a1e /include/clang/Basic/FileManager.h | |
parent | a5f182095bf2065ca94f1c86957ee91f9068964b (diff) |
Stage two of getting CFE top correct.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@39734 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/clang/Basic/FileManager.h')
-rw-r--r-- | include/clang/Basic/FileManager.h | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/include/clang/Basic/FileManager.h b/include/clang/Basic/FileManager.h new file mode 100644 index 0000000000..ad955d7280 --- /dev/null +++ b/include/clang/Basic/FileManager.h @@ -0,0 +1,111 @@ +//===--- FileManager.h - File System Probing and Caching --------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file was developed by Chris Lattner and is distributed under +// the University of Illinois Open Source License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file defines the FileManager interface. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_CLANG_FILEMANAGER_H +#define LLVM_CLANG_FILEMANAGER_H + +#include "llvm/ADT/StringMap.h" +#include <map> +#include <string> +// FIXME: Enhance libsystem to support inode and other fields in stat. +#include <sys/types.h> + +namespace clang { +class FileManager; + +/// DirectoryEntry - Cached information about one directory on the disk. +/// +class DirectoryEntry { + const char *Name; // Name of the directory. + friend class FileManager; +public: + DirectoryEntry() : Name(0) {} + const char *getName() const { return Name; } +}; + +/// FileEntry - Cached information about one file on the disk. +/// +class FileEntry { + const char *Name; // Name of the directory. + off_t Size; // File size in bytes. + time_t ModTime; // Modification time of file. + const DirectoryEntry *Dir; // Directory file lives in. + unsigned UID; // A unique (small) ID for the file. + friend class FileManager; +public: + FileEntry() : Name(0) {} + + const char *getName() const { return Name; } + off_t getSize() const { return Size; } + unsigned getUID() const { return UID; } + time_t getModificationTime() const { return ModTime; } + + /// getDir - Return the directory the file lives in. + /// + const DirectoryEntry *getDir() const { return Dir; } +}; + + +/// FileManager - Implements support for file system lookup, file system +/// caching, and directory search management. This also handles more advanced +/// properties, such as uniquing files based on "inode", so that a file with two +/// names (e.g. symlinked) will be treated as a single file. +/// +class FileManager { + /// UniqueDirs/UniqueFiles - Cache from ID's to existing directories/files. + /// + std::map<std::pair<dev_t, ino_t>, DirectoryEntry> UniqueDirs; + std::map<std::pair<dev_t, ino_t>, FileEntry> UniqueFiles; + + /// DirEntries/FileEntries - This is a cache of directory/file entries we have + /// looked up. The actual Entry is owned by UniqueFiles/UniqueDirs above. + /// + llvm::StringMap<DirectoryEntry*> DirEntries; + llvm::StringMap<FileEntry*> FileEntries; + + /// NextFileUID - Each FileEntry we create is assigned a unique ID #. + /// + unsigned NextFileUID; + + // Statistics. + unsigned NumDirLookups, NumFileLookups; + unsigned NumDirCacheMisses, NumFileCacheMisses; +public: + FileManager() : DirEntries(64), FileEntries(64), NextFileUID(0) { + NumDirLookups = NumFileLookups = 0; + NumDirCacheMisses = NumFileCacheMisses = 0; + } + + /// getDirectory - Lookup, cache, and verify the specified directory. This + /// returns null if the directory doesn't exist. + /// + const DirectoryEntry *getDirectory(const std::string &Filename) { + return getDirectory(&Filename[0], &Filename[0] + Filename.size()); + } + const DirectoryEntry *getDirectory(const char *FileStart,const char *FileEnd); + + /// getFile - Lookup, cache, and verify the specified file. This returns null + /// if the file doesn't exist. + /// + const FileEntry *getFile(const std::string &Filename) { + return getFile(&Filename[0], &Filename[0] + Filename.size()); + } + const FileEntry *getFile(const char *FilenameStart, + const char *FilenameEnd); + + void PrintStats() const; +}; + +} // end namespace clang + +#endif |