diff options
author | Douglas Gregor <dgregor@apple.com> | 2009-10-05 21:07:28 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2009-10-05 21:07:28 +0000 |
commit | 445e23e9b909ec8e21303c7dd82c90b72fc09ac4 (patch) | |
tree | 47cc1003b014738ec50b3aa87b9892bee7964d5d /lib/Frontend/PCHReader.cpp | |
parent | 339798eae1eb61c50ca68766ed028c0a16d0a284 (diff) |
Encode the Clang branch and Subversion revision into a PCH file, and
assume that PCH files from different Clang revisions are not
compatible. Addresses <rdar://problem/7266572>.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@83323 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Frontend/PCHReader.cpp')
-rw-r--r-- | lib/Frontend/PCHReader.cpp | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/lib/Frontend/PCHReader.cpp b/lib/Frontend/PCHReader.cpp index ead00ee75f..e61668dd31 100644 --- a/lib/Frontend/PCHReader.cpp +++ b/lib/Frontend/PCHReader.cpp @@ -26,6 +26,7 @@ #include "clang/Basic/SourceManagerInternals.h" #include "clang/Basic/FileManager.h" #include "clang/Basic/TargetInfo.h" +#include "clang/Basic/Version.h" #include "llvm/Bitcode/BitstreamReader.h" #include "llvm/Support/Compiler.h" #include "llvm/Support/MemoryBuffer.h" @@ -1340,9 +1341,7 @@ PCHReader::ReadPCHBlock() { case pch::SOURCE_LOCATION_OFFSETS: SLocOffsets = (const uint32_t *)BlobStart; TotalNumSLocEntries = Record[0]; - SourceMgr.PreallocateSLocEntries(this, - TotalNumSLocEntries, - Record[1]); + SourceMgr.PreallocateSLocEntries(this, TotalNumSLocEntries, Record[1]); break; case pch::SOURCE_LOCATION_PRELOADS: @@ -1377,6 +1376,23 @@ PCHReader::ReadPCHBlock() { Comments = (SourceRange *)BlobStart; NumComments = BlobLen / sizeof(SourceRange); break; + + case pch::SVN_BRANCH_REVISION: { + unsigned CurRevision = getClangSubversionRevision(); + if (Record[0] && CurRevision && Record[0] != CurRevision) { + Diag(Record[0] < CurRevision? diag::warn_pch_version_too_old + : diag::warn_pch_version_too_new); + return IgnorePCH; + } + + const char *CurBranch = getClangSubversionPath(); + if (strncmp(CurBranch, BlobStart, BlobLen)) { + std::string PCHBranch(BlobStart, BlobLen); + Diag(diag::warn_pch_different_branch) << PCHBranch << CurBranch; + return IgnorePCH; + } + break; + } } } Error("premature end of bitstream in PCH file"); |