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) {