diff options
author | Douglas Gregor <dgregor@apple.com> | 2010-07-27 00:27:13 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2010-07-27 00:27:13 +0000 |
commit | fae3b2f4743dad616623c4df2fdb0f5128bd36d9 (patch) | |
tree | 9660c0f303a9e19e8d3eeb6e16ac3d5d9287e8a8 /lib/Frontend/PCHReader.cpp | |
parent | 681d7237e1014bf64dd5ead6bf74ae55cdd19e61 (diff) |
Implement -fno-validate-pch at the -cc1 level, which suppresses most
of the usual consistency checks used to determine when a precompiled
header is incompatible with the translation unit it's being loaded
into.
Enable this option when loading a precompiled preamble, because the
preamble loader will be performing all of this checking itself. Enable
the preamble-based test now that it's working.
This option is also useful for debugging Clang's PCH
(<rdar://problem/7532213>).
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@109475 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Frontend/PCHReader.cpp')
-rw-r--r-- | lib/Frontend/PCHReader.cpp | 28 |
1 files changed, 16 insertions, 12 deletions
diff --git a/lib/Frontend/PCHReader.cpp b/lib/Frontend/PCHReader.cpp index f454477c50..37e11249f8 100644 --- a/lib/Frontend/PCHReader.cpp +++ b/lib/Frontend/PCHReader.cpp @@ -414,13 +414,14 @@ void PCHValidator::ReadCounter(unsigned Value) { //===----------------------------------------------------------------------===// PCHReader::PCHReader(Preprocessor &PP, ASTContext *Context, - const char *isysroot) + const char *isysroot, bool DisableValidation) : Listener(new PCHValidator(PP, *this)), DeserializationListener(0), SourceMgr(PP.getSourceManager()), FileMgr(PP.getFileManager()), Diags(PP.getDiagnostics()), SemaObj(0), PP(&PP), Context(Context), Consumer(0), MethodPoolLookupTable(0), MethodPoolLookupTableData(0), TotalSelectorsInMethodPool(0), SelectorOffsets(0), - TotalNumSelectors(0), isysroot(isysroot), NumStatHits(0), NumStatMisses(0), + TotalNumSelectors(0), isysroot(isysroot), + DisableValidation(DisableValidation), NumStatHits(0), NumStatMisses(0), NumSLocEntriesRead(0), TotalNumSLocEntries(0), NumStatementsRead(0), TotalNumStatements(0), NumMacrosRead(0), NumMethodPoolSelectorsRead(0), NumMethodPoolMisses(0), TotalNumMacros(0), NumLexicalDeclContextsRead(0), @@ -430,12 +431,14 @@ PCHReader::PCHReader(Preprocessor &PP, ASTContext *Context, } PCHReader::PCHReader(SourceManager &SourceMgr, FileManager &FileMgr, - Diagnostic &Diags, const char *isysroot) + Diagnostic &Diags, const char *isysroot, + bool DisableValidation) : DeserializationListener(0), SourceMgr(SourceMgr), FileMgr(FileMgr), Diags(Diags), SemaObj(0), PP(0), Context(0), Consumer(0), MethodPoolLookupTable(0), MethodPoolLookupTableData(0), TotalSelectorsInMethodPool(0), SelectorOffsets(0), - TotalNumSelectors(0), isysroot(isysroot), NumStatHits(0), NumStatMisses(0), + TotalNumSelectors(0), isysroot(isysroot), + DisableValidation(DisableValidation), NumStatHits(0), NumStatMisses(0), NumSLocEntriesRead(0), TotalNumSLocEntries(0), NumStatementsRead(0), TotalNumStatements(0), NumMacrosRead(0), NumMethodPoolSelectorsRead(0), NumMethodPoolMisses(0), TotalNumMacros(0), NumLexicalDeclContextsRead(0), @@ -1019,14 +1022,15 @@ PCHReader::PCHReadResult PCHReader::ReadSLocEntryRecord(unsigned ID) { return Failure; } - if ((off_t)Record[4] != File->getSize() + if (!DisableValidation && + ((off_t)Record[4] != File->getSize() #if !defined(LLVM_ON_WIN32) // In our regression testing, the Windows file system seems to // have inconsistent modification times that sometimes // erroneously trigger this error-handling path. - || (time_t)Record[5] != File->getModificationTime() + || (time_t)Record[5] != File->getModificationTime() #endif - ) { + )) { Diag(diag::err_fe_pch_file_modified) << Filename; return Failure; @@ -1481,7 +1485,7 @@ PCHReader::ReadPCHBlock(PerFileData &F) { break; case pch::METADATA: { - if (Record[0] != pch::VERSION_MAJOR) { + if (Record[0] != pch::VERSION_MAJOR && !DisableValidation) { Diag(Record[0] < pch::VERSION_MAJOR? diag::warn_pch_version_too_old : diag::warn_pch_version_too_new); return IgnorePCH; @@ -1501,7 +1505,7 @@ PCHReader::ReadPCHBlock(PerFileData &F) { Error("CHAINED_METADATA is not first record in block"); return Failure; } - if (Record[0] != pch::VERSION_MAJOR) { + if (Record[0] != pch::VERSION_MAJOR && !DisableValidation) { Diag(Record[0] < pch::VERSION_MAJOR? diag::warn_pch_version_too_old : diag::warn_pch_version_too_new); return IgnorePCH; @@ -1536,7 +1540,7 @@ PCHReader::ReadPCHBlock(PerFileData &F) { break; case pch::LANGUAGE_OPTIONS: - if (ParseLanguageOptions(Record)) + if (ParseLanguageOptions(Record) && !DisableValidation) return IgnorePCH; break; @@ -1704,7 +1708,7 @@ PCHReader::ReadPCHBlock(PerFileData &F) { case pch::VERSION_CONTROL_BRANCH_REVISION: { const std::string &CurBranch = getClangFullRepositoryVersion(); llvm::StringRef PCHBranch(BlobStart, BlobLen); - if (llvm::StringRef(CurBranch) != PCHBranch) { + if (llvm::StringRef(CurBranch) != PCHBranch && !DisableValidation) { Diag(diag::warn_pch_different_branch) << PCHBranch << CurBranch; return IgnorePCH; } @@ -1759,7 +1763,7 @@ PCHReader::PCHReadResult PCHReader::ReadPCH(const std::string &FileName) { } // Check the predefines buffers. - if (CheckPredefinesBuffers()) + if (!DisableValidation && CheckPredefinesBuffers()) return IgnorePCH; if (PP) { |