diff options
| author | Rafael Espindola <rafael.espindola@gmail.com> | 2013-08-01 21:42:11 +0000 |
|---|---|---|
| committer | Rafael Espindola <rafael.espindola@gmail.com> | 2013-08-01 21:42:11 +0000 |
| commit | f8f91b897627773d5ecd484918e02d992c0d0c15 (patch) | |
| tree | 0103868083f454067f6812051ce73eee5dc4dc1e /clang/tools/libclang | |
| parent | a5c536e1ee25daef4567e1e2a24b74f373b82011 (diff) | |
| download | bcm5719-llvm-f8f91b897627773d5ecd484918e02d992c0d0c15.tar.gz bcm5719-llvm-f8f91b897627773d5ecd484918e02d992c0d0c15.zip | |
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.
llvm-svn: 187619
Diffstat (limited to 'clang/tools/libclang')
| -rw-r--r-- | clang/tools/libclang/CIndex.cpp | 9 | ||||
| -rw-r--r-- | clang/tools/libclang/Indexing.cpp | 43 |
2 files changed, 25 insertions, 27 deletions
diff --git a/clang/tools/libclang/CIndex.cpp b/clang/tools/libclang/CIndex.cpp index 9f6300a114a..20079510620 100644 --- a/clang/tools/libclang/CIndex.cpp +++ b/clang/tools/libclang/CIndex.cpp @@ -3057,15 +3057,12 @@ int clang_getFileUniqueID(CXFile file, CXFileUniqueID *outID) { 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/clang/tools/libclang/Indexing.cpp b/clang/tools/libclang/Indexing.cpp index 15786acb8b3..e2b898ba4bf 100644 --- a/clang/tools/libclang/Indexing.cpp +++ b/clang/tools/libclang/Indexing.cpp @@ -88,25 +88,23 @@ public: /// #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 @@ namespace llvm { 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 @@ private: 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 @@ private: 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) { |

