From: Ted Kremenek Date: Tue, 18 Dec 2007 22:29:39 +0000 (+0000) Subject: Refactored inode and device number into FileEntry, and changed the X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=bca6d125c77c93c7fa41798c15348175a6bb1267;p=clang Refactored inode and device number into FileEntry, and changed the ADT storing FileEntry's in FileManager from a map to a set. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@45184 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/Basic/FileManager.cpp b/Basic/FileManager.cpp index 9edbd03873..2467fa6872 100644 --- a/Basic/FileManager.cpp +++ b/Basic/FileManager.cpp @@ -142,14 +142,12 @@ const FileEntry *FileManager::getFile(const char *NameStart, } //std::cerr << ": exists\n"; - // It exists. See if we have already opened a directory with the same inode. + // It exists. See if we have already opened a file with the same inode. // This occurs when one dir is symlinked to another, for example. - std::pair X = - UniqueFiles.insert(FileEntryMap::value_type(std::make_pair(StatBuf.st_dev, - StatBuf.st_ino), - FileEntry())); - - FileEntry &UFE = X.first->second; + FileEntry &UFE = + const_cast(*UniqueFiles.insert(FileEntry(StatBuf.st_dev, + StatBuf.st_ino)).first); + NamedFileEnt.setValue(&UFE); if (UFE.getName()) // Already have an entry with this inode, return it. @@ -163,7 +161,6 @@ const FileEntry *FileManager::getFile(const char *NameStart, UFE.ModTime = StatBuf.st_mtime; UFE.Dir = DirInfo; UFE.UID = NextFileUID++; - UFE.InoDev = &X.first->first; return &UFE; } diff --git a/include/clang/Basic/FileManager.h b/include/clang/Basic/FileManager.h index dd12c1c33b..bd1ebfb979 100644 --- a/include/clang/Basic/FileManager.h +++ b/include/clang/Basic/FileManager.h @@ -17,6 +17,7 @@ #include "llvm/ADT/StringMap.h" #include "llvm/Bitcode/SerializationFwd.h" #include +#include #include // FIXME: Enhance libsystem to support inode and other fields in stat. #include @@ -42,21 +43,26 @@ class FileEntry { time_t ModTime; // Modification time of file. const DirectoryEntry *Dir; // Directory file lives in. unsigned UID; // A unique (small) ID for the file. - const std::pair* InoDev; // Pointer to inode/device number pair. + dev_t Device; // ID for the device containing the file. + ino_t Inode; // Inode number for the file. friend class FileManager; public: - FileEntry() : Name(0), InoDev(NULL) {} + FileEntry(dev_t device, ino_t inode) : Name(0), Device(device), Inode(inode){} const char *getName() const { return Name; } off_t getSize() const { return Size; } unsigned getUID() const { return UID; } - ino_t getInode() const { return InoDev->second; } - dev_t getDev() const { return InoDev->first; } + ino_t getInode() const { return Inode; } + dev_t getDev() const { return Device; } time_t getModificationTime() const { return ModTime; } /// getDir - Return the directory the file lives in. /// const DirectoryEntry *getDir() const { return Dir; } + + bool operator<(const FileEntry& RHS) const { + return Device < RHS.Device || (Device == RHS.Device && Inode < RHS.Inode); + } }; @@ -68,10 +74,8 @@ public: class FileManager { /// UniqueDirs/UniqueFiles - Cache from ID's to existing directories/files. /// - std::map, DirectoryEntry> UniqueDirs; - - typedef std::map, FileEntry> FileEntryMap; - FileEntryMap UniqueFiles; + std::map, DirectoryEntry> UniqueDirs; + std::set UniqueFiles; /// DirEntries/FileEntries - This is a cache of directory/file entries we have /// looked up. The actual Entry is owned by UniqueFiles/UniqueDirs above.