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/lib/Frontend | |
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/lib/Frontend')
-rw-r--r-- | clang/lib/Frontend/CacheTokens.cpp | 45 | ||||
-rw-r--r-- | clang/lib/Frontend/TextDiagnostic.cpp | 5 |
2 files changed, 23 insertions, 27 deletions
diff --git a/clang/lib/Frontend/CacheTokens.cpp b/clang/lib/Frontend/CacheTokens.cpp index 3f80a16b403..0c30b049579 100644 --- a/clang/lib/Frontend/CacheTokens.cpp +++ b/clang/lib/Frontend/CacheTokens.cpp @@ -58,16 +58,16 @@ public: class PTHEntryKeyVariant { union { const FileEntry* FE; const char* Path; }; enum { IsFE = 0x1, IsDE = 0x2, IsNoExist = 0x0 } Kind; - struct stat *StatBuf; + FileData *Data; + public: - PTHEntryKeyVariant(const FileEntry *fe) - : FE(fe), Kind(IsFE), StatBuf(0) {} + PTHEntryKeyVariant(const FileEntry *fe) : FE(fe), Kind(IsFE), Data(0) {} - PTHEntryKeyVariant(struct stat* statbuf, const char* path) - : Path(path), Kind(IsDE), StatBuf(new struct stat(*statbuf)) {} + PTHEntryKeyVariant(FileData *Data, const char *path) + : Path(path), Kind(IsDE), Data(new FileData(*Data)) {} - explicit PTHEntryKeyVariant(const char* path) - : Path(path), Kind(IsNoExist), StatBuf(0) {} + explicit PTHEntryKeyVariant(const char *path) + : Path(path), Kind(IsNoExist), Data(0) {} bool isFile() const { return Kind == IsFE; } @@ -79,22 +79,21 @@ public: void EmitData(raw_ostream& Out) { switch (Kind) { - case IsFE: + case IsFE: { // Emit stat information. - ::Emit32(Out, FE->getInode()); - ::Emit32(Out, FE->getDevice()); - ::Emit16(Out, FE->getFileMode()); + llvm::sys::fs::UniqueID UID = FE->getUniqueID(); + ::Emit64(Out, UID.getFile()); + ::Emit64(Out, UID.getDevice()); ::Emit64(Out, FE->getModificationTime()); ::Emit64(Out, FE->getSize()); - break; + } break; case IsDE: // Emit stat information. - ::Emit32(Out, (uint32_t) StatBuf->st_ino); - ::Emit32(Out, (uint32_t) StatBuf->st_dev); - ::Emit16(Out, (uint16_t) StatBuf->st_mode); - ::Emit64(Out, (uint64_t) StatBuf->st_mtime); - ::Emit64(Out, (uint64_t) StatBuf->st_size); - delete StatBuf; + ::Emit64(Out, Data->UniqueID.getFile()); + ::Emit64(Out, Data->UniqueID.getDevice()); + ::Emit64(Out, Data->ModTime); + ::Emit64(Out, Data->Size); + delete Data; break; default: break; @@ -516,18 +515,18 @@ public: StatListener(PTHMap &pm) : PM(pm) {} ~StatListener() {} - LookupResult getStat(const char *Path, struct stat &StatBuf, - bool isFile, int *FileDescriptor) { - LookupResult Result = statChained(Path, StatBuf, isFile, FileDescriptor); + LookupResult getStat(const char *Path, FileData &Data, bool isFile, + int *FileDescriptor) { + LookupResult Result = statChained(Path, Data, isFile, FileDescriptor); if (Result == CacheMissing) // Failed 'stat'. PM.insert(PTHEntryKeyVariant(Path), PTHEntry()); - else if (S_ISDIR(StatBuf.st_mode)) { + else if (Data.IsDirectory) { // Only cache directories with absolute paths. if (llvm::sys::path::is_relative(Path)) return Result; - PM.insert(PTHEntryKeyVariant(&StatBuf, Path), PTHEntry()); + PM.insert(PTHEntryKeyVariant(&Data, Path), PTHEntry()); } return Result; diff --git a/clang/lib/Frontend/TextDiagnostic.cpp b/clang/lib/Frontend/TextDiagnostic.cpp index 2da66d3b324..691ca3493a0 100644 --- a/clang/lib/Frontend/TextDiagnostic.cpp +++ b/clang/lib/Frontend/TextDiagnostic.cpp @@ -778,11 +778,8 @@ void TextDiagnostic::emitDiagnosticLoc(SourceLocation Loc, PresumedLoc PLoc, const FileEntry* FE = SM.getFileEntryForID(FID); if (FE && FE->getName()) { OS << FE->getName(); - if (FE->getDevice() == 0 && FE->getInode() == 0 - && FE->getFileMode() == 0) { - // in PCH is a guess, but a good one: + if (FE->isInPCH()) OS << " (in PCH)"; - } OS << ": "; } } |