diff options
author | Manman Ren <manman.ren@gmail.com> | 2016-07-26 17:12:17 +0000 |
---|---|---|
committer | Manman Ren <manman.ren@gmail.com> | 2016-07-26 17:12:17 +0000 |
commit | 47a44456875347ccb455a69011a2198bd07e661d (patch) | |
tree | 2e25503632fb1ecc0db860a3404779d4355e8f9a /clang/lib/Serialization/ASTReader.cpp | |
parent | 4509a4f52a696954c3fe9306c09816fc374e39ce (diff) | |
download | bcm5719-llvm-47a44456875347ccb455a69011a2198bd07e661d.tar.gz bcm5719-llvm-47a44456875347ccb455a69011a2198bd07e661d.zip |
Modules: add command line option fmodules-disable-diagnostic-validation
With PCH+Module, sometimes compiler gives a hard error:
Module file ‘<some-file path>.pcm' is out of date and needs to be rebuilt
This happens when we have a pch importing a module and the module gets
overwritten by another compiler instance after we build the pch (one example is
that both compiler instances hash to the same pcm file but use different
diagnostic options). When we try to load the pch later on, the compiler notices
that the imported module is out of date (modification date, size do not match)
but it can't handle this out of date pcm (i.e it does not know how to rebuild
the pch).
This commit introduces a new command line option so for PCH + module, we can
turn on this option and if two compiler instances only differ in diagnostic
options, the latter instance will not invalidate the original pcm.
rdar://26675801
Differential Revision: http://reviews.llvm.org/D22773
llvm-svn: 276769
Diffstat (limited to 'clang/lib/Serialization/ASTReader.cpp')
-rw-r--r-- | clang/lib/Serialization/ASTReader.cpp | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index 27b7048f375..491a0febd50 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -2084,7 +2084,7 @@ static bool isDiagnosedResult(ASTReader::ASTReadResult ARR, unsigned Caps) { ASTReader::ASTReadResult ASTReader::ReadOptionsBlock( BitstreamCursor &Stream, unsigned ClientLoadCapabilities, bool AllowCompatibleConfigurationMismatch, ASTReaderListener &Listener, - std::string &SuggestedPredefines) { + std::string &SuggestedPredefines, bool ValidateDiagnosticOptions) { if (Stream.EnterSubBlock(OPTIONS_BLOCK_ID)) return Failure; @@ -2128,7 +2128,8 @@ ASTReader::ASTReadResult ASTReader::ReadOptionsBlock( case DIAGNOSTIC_OPTIONS: { bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0; - if (!AllowCompatibleConfigurationMismatch && + if (ValidateDiagnosticOptions && + !AllowCompatibleConfigurationMismatch && ParseDiagnosticOptions(Record, Complain, Listener)) return OutOfDate; break; @@ -2255,10 +2256,13 @@ ASTReader::ReadControlBlock(ModuleFile &F, // FIXME: Allow this for files explicitly specified with -include-pch. bool AllowCompatibleConfigurationMismatch = F.Kind == MK_ExplicitModule; + const HeaderSearchOptions &HSOpts = + PP.getHeaderSearchInfo().getHeaderSearchOpts(); Result = ReadOptionsBlock(Stream, ClientLoadCapabilities, AllowCompatibleConfigurationMismatch, - *Listener, SuggestedPredefines); + *Listener, SuggestedPredefines, + HSOpts.ModulesValidateDiagnosticOptions); if (Result == Failure) { Error("malformed block record in AST file"); return Result; @@ -4195,7 +4199,7 @@ bool ASTReader::readASTFileControlBlock( StringRef Filename, FileManager &FileMgr, const PCHContainerReader &PCHContainerRdr, bool FindModuleFileExtensions, - ASTReaderListener &Listener) { + ASTReaderListener &Listener, bool ValidateDiagnosticOptions) { // Open the AST file. // FIXME: This allows use of the VFS; we do not allow use of the // VFS when actually loading a module. @@ -4235,7 +4239,8 @@ bool ASTReader::readASTFileControlBlock( std::string IgnoredSuggestedPredefines; if (ReadOptionsBlock(Stream, ARR_ConfigurationMismatch | ARR_OutOfDate, /*AllowCompatibleConfigurationMismatch*/ false, - Listener, IgnoredSuggestedPredefines) != Success) + Listener, IgnoredSuggestedPredefines, + ValidateDiagnosticOptions) != Success) return true; break; } @@ -4408,7 +4413,8 @@ bool ASTReader::isAcceptableASTFile( ExistingModuleCachePath, FileMgr); return !readASTFileControlBlock(Filename, FileMgr, PCHContainerRdr, /*FindModuleFileExtensions=*/false, - validator); + validator, + /*ValidateDiagnosticOptions=*/true); } ASTReader::ASTReadResult |