]> granicus.if.org Git - clang/commitdiff
Added to FileEntry a pointer to the <dev_t,ino_t> pair for the file, and
authorTed Kremenek <kremenek@apple.com>
Tue, 18 Dec 2007 20:45:25 +0000 (20:45 +0000)
committerTed Kremenek <kremenek@apple.com>
Tue, 18 Dec 2007 20:45:25 +0000 (20:45 +0000)
accessors to FileEntry to query these values.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@45171 91177308-0d34-0410-b5e6-96231b3b80d8

Basic/FileManager.cpp
include/clang/Basic/FileManager.h

index 8ffde1f6fc94bf314c90b4a0dfb9711a3176407f..9edbd03873f3474b682361b21ce4f64e515df190 100644 (file)
@@ -65,7 +65,7 @@ const DirectoryEntry *FileManager::getDirectory(const char *NameStart,
     return 0;
   
   // It exists.  See if we have already opened a directory with the same inode.
-  // This occurs when one dir is symlinked to another, for example.
+  // This occurs when one dir is symlinked to another, for example.    
   DirectoryEntry &UDE = 
     UniqueDirs[std::make_pair(StatBuf.st_dev, StatBuf.st_ino)];
   
@@ -144,7 +144,12 @@ const FileEntry *FileManager::getFile(const char *NameStart,
   
   // It exists.  See if we have already opened a directory with the same inode.
   // This occurs when one dir is symlinked to another, for example.
-  FileEntry &UFE = UniqueFiles[std::make_pair(StatBuf.st_dev, StatBuf.st_ino)];
+  std::pair<FileEntryMap::iterator,bool> X = 
+    UniqueFiles.insert(FileEntryMap::value_type(std::make_pair(StatBuf.st_dev,
+                                                               StatBuf.st_ino),
+                                                FileEntry()));
+                          
+  FileEntry &UFE = X.first->second;
   
   NamedFileEnt.setValue(&UFE);
   if (UFE.getName())  // Already have an entry with this inode, return it.
@@ -158,6 +163,7 @@ 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;
 }
 
index ce58cdc4a959841aafe9e6864fe78145cde0c3e8..dd12c1c33bb390f6bac1d9f0adb6f166719caf5d 100644 (file)
@@ -42,13 +42,16 @@ 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<dev_t, ino_t>* InoDev; // Pointer to inode/device number pair. 
   friend class FileManager;
 public:
-  FileEntry() : Name(0) {}
+  FileEntry() : Name(0), InoDev(NULL) {}
   
   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; }
   time_t getModificationTime() const { return ModTime; }
   
   /// getDir - Return the directory the file lives in.
@@ -66,7 +69,9 @@ 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;
+  
+  typedef std::map<std::pair<dev_t, ino_t>, FileEntry> FileEntryMap;
+  FileEntryMap UniqueFiles;
   
   /// DirEntries/FileEntries - This is a cache of directory/file entries we have
   /// looked up.  The actual Entry is owned by UniqueFiles/UniqueDirs above.