Use llvm::sys::fs::UniqueID for windows and unix.

This unifies the unix and windows versions of FileManager::UniqueDirContainer
and FileManager::UniqueFileContainer by using UniqueID.

We cannot just replace "struct stat" with llvm::sys::fs::file_status, since we
want to be able to construct fake ones, and file_status has different members
on unix and windows.

What the patch does is:

* Record only the information that clang is actually using.
* Use llvm::sys::fs::status instead of stat and fstat.
* Use llvm::sys::fs::UniqueID
* Delete the old windows versions of UniqueDirContainer and
UniqueFileContainer since the "unix" one now works on windows too.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@187619 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/tools/libclang/CIndex.cpp b/tools/libclang/CIndex.cpp
index 9f6300a..2007951 100644
--- a/tools/libclang/CIndex.cpp
+++ b/tools/libclang/CIndex.cpp
@@ -3057,15 +3057,12 @@
   if (!file || !outID)
     return 1;
 
-#ifdef LLVM_ON_WIN32
-  return 1; // inodes not supported on windows.
-#else
   FileEntry *FEnt = static_cast<FileEntry *>(file);
-  outID->data[0] = FEnt->getDevice();
-  outID->data[1] = FEnt->getInode();
+  const llvm::sys::fs::UniqueID &ID = FEnt->getUniqueID();
+  outID->data[0] = ID.getDevice();
+  outID->data[1] = ID.getFile();
   outID->data[2] = FEnt->getModificationTime();
   return 0;
-#endif
 }
 
 } // end: extern "C"
diff --git a/tools/libclang/Indexing.cpp b/tools/libclang/Indexing.cpp
index 15786ac..e2b898b 100644
--- a/tools/libclang/Indexing.cpp
+++ b/tools/libclang/Indexing.cpp
@@ -88,25 +88,23 @@
 ///   #3 is identified as the location of "#ifdef CAKE"
 ///
 class PPRegion {
-  ino_t ino;
+  llvm::sys::fs::UniqueID UniqueID;
   time_t ModTime;
-  dev_t dev;
   unsigned Offset;
 public:
-  PPRegion() : ino(), ModTime(), dev(), Offset() {}
-  PPRegion(dev_t dev, ino_t ino, unsigned offset, time_t modTime)
-    : ino(ino), ModTime(modTime), dev(dev), Offset(offset) {}
+  PPRegion() : ModTime(), Offset() {}
+  PPRegion(llvm::sys::fs::UniqueID UniqueID, unsigned offset, time_t modTime)
+      : UniqueID(UniqueID), ModTime(modTime), Offset(offset) {}
 
-  ino_t getIno() const { return ino; }
-  dev_t getDev() const { return dev; }
+  const llvm::sys::fs::UniqueID &getUniqueID() const { return UniqueID; }
   unsigned getOffset() const { return Offset; }
   time_t getModTime() const { return ModTime; }
 
   bool isInvalid() const { return *this == PPRegion(); }
 
   friend bool operator==(const PPRegion &lhs, const PPRegion &rhs) {
-    return lhs.dev == rhs.dev && lhs.ino == rhs.ino &&
-        lhs.Offset == rhs.Offset && lhs.ModTime == rhs.ModTime;
+    return lhs.UniqueID == rhs.UniqueID && lhs.Offset == rhs.Offset &&
+           lhs.ModTime == rhs.ModTime;
   }
 };
 
@@ -122,16 +120,17 @@
   template <>
   struct DenseMapInfo<PPRegion> {
     static inline PPRegion getEmptyKey() {
-      return PPRegion(0, 0, unsigned(-1), 0);
+      return PPRegion(llvm::sys::fs::UniqueID(0, 0), unsigned(-1), 0);
     }
     static inline PPRegion getTombstoneKey() {
-      return PPRegion(0, 0, unsigned(-2), 0);
+      return PPRegion(llvm::sys::fs::UniqueID(0, 0), unsigned(-2), 0);
     }
 
     static unsigned getHashValue(const PPRegion &S) {
       llvm::FoldingSetNodeID ID;
-      ID.AddInteger(S.getIno());
-      ID.AddInteger(S.getDev());
+      const llvm::sys::fs::UniqueID &UniqueID = S.getUniqueID();
+      ID.AddInteger(UniqueID.getFile());
+      ID.AddInteger(UniqueID.getDevice());
       ID.AddInteger(S.getOffset());
       ID.AddInteger(S.getModTime());
       return ID.ComputeHash();
@@ -208,9 +207,10 @@
   PPRegion getRegion(SourceLocation Loc, FileID FID, const FileEntry *FE) {
     SourceLocation RegionLoc = PPRec.findConditionalDirectiveRegionLoc(Loc);
     if (RegionLoc.isInvalid()) {
-      if (isParsedOnceInclude(FE))
-        return PPRegion(FE->getDevice(), FE->getInode(), 0,
-                        FE->getModificationTime());
+      if (isParsedOnceInclude(FE)) {
+        const llvm::sys::fs::UniqueID &ID = FE->getUniqueID();
+        return PPRegion(ID, 0, FE->getModificationTime());
+      }
       return PPRegion();
     }
 
@@ -221,14 +221,15 @@
     llvm::tie(RegionFID, RegionOffset) = SM.getDecomposedLoc(RegionLoc);
 
     if (RegionFID != FID) {
-      if (isParsedOnceInclude(FE))
-        return PPRegion(FE->getDevice(), FE->getInode(), 0,
-                        FE->getModificationTime());
+      if (isParsedOnceInclude(FE)) {
+        const llvm::sys::fs::UniqueID &ID = FE->getUniqueID();
+        return PPRegion(ID, 0, FE->getModificationTime());
+      }
       return PPRegion();
     }
 
-    return PPRegion(FE->getDevice(), FE->getInode(), RegionOffset,
-                    FE->getModificationTime());
+    const llvm::sys::fs::UniqueID &ID = FE->getUniqueID();
+    return PPRegion(ID, RegionOffset, FE->getModificationTime());
   }
 
   bool isParsedOnceInclude(const FileEntry *FE) {