diff options
author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2013-03-01 03:26:04 +0000 |
---|---|---|
committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2013-03-01 03:26:04 +0000 |
commit | 8504b7b8102a52b2a16231d459fb3cfab4784c38 (patch) | |
tree | 7ab8a5ad872e609b7c4bba1c6dad06f1968e6478 /lib/Serialization/ASTReader.cpp | |
parent | 7db4bb9226f303392934c91869afdeb4d153ca95 (diff) |
[PCH] Enhance InputFile to also include whether the file is out-of-date.
Previously we would return null for an out-of-date file. This inhibited ASTReader::ReadSLocEntry
from creating a FileID to recover gracefully in such a case.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@176332 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Serialization/ASTReader.cpp')
-rw-r--r-- | lib/Serialization/ASTReader.cpp | 44 |
1 files changed, 24 insertions, 20 deletions
diff --git a/lib/Serialization/ASTReader.cpp b/lib/Serialization/ASTReader.cpp index 24073df3ec..e6ef9f6441 100644 --- a/lib/Serialization/ASTReader.cpp +++ b/lib/Serialization/ASTReader.cpp @@ -917,10 +917,13 @@ bool ASTReader::ReadSLocEntry(int ID) { // we will also try to fail gracefully by setting up the SLocEntry. unsigned InputID = Record[4]; InputFile IF = getInputFile(*F, InputID); - const FileEntry *File = IF.getPointer(); - bool OverriddenBuffer = IF.getInt(); + const FileEntry *File = IF.getFile(); + bool OverriddenBuffer = IF.isOverridden(); - if (!IF.getPointer()) + // Note that we only check if a File was returned. If it was out-of-date + // we have complained but we will continue creating a FileID to recover + // gracefully. + if (!File) return true; SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]); @@ -1495,14 +1498,13 @@ void ASTReader::markIdentifierUpToDate(IdentifierInfo *II) { IdentifierGeneration[II] = CurrentGeneration; } -llvm::PointerIntPair<const FileEntry *, 1, bool> -ASTReader::getInputFile(ModuleFile &F, unsigned ID, bool Complain) { +InputFile ASTReader::getInputFile(ModuleFile &F, unsigned ID, bool Complain) { // If this ID is bogus, just return an empty input file. if (ID == 0 || ID > F.InputFilesLoaded.size()) return InputFile(); // If we've already loaded this input file, return it. - if (F.InputFilesLoaded[ID-1].getPointer()) + if (F.InputFilesLoaded[ID-1].getFile()) return F.InputFilesLoaded[ID-1]; // Go find this input file. @@ -1556,17 +1558,15 @@ ASTReader::getInputFile(ModuleFile &F, unsigned ID, bool Complain) { } return InputFile(); } - - // Note that we've loaded this input file. - F.InputFilesLoaded[ID-1] = InputFile(File, Overridden); - + // Check if there was a request to override the contents of the file // that was part of the precompiled header. Overridding such a file // can lead to problems when lexing using the source locations from the // PCH. SourceManager &SM = getSourceManager(); if (!Overridden && SM.isFileOverridden(File)) { - Error(diag::err_fe_pch_file_overridden, Filename); + if (Complain) + Error(diag::err_fe_pch_file_overridden, Filename); // After emitting the diagnostic, recover by disabling the override so // that the original file will be used. SM.disableFileContentsOverride(File); @@ -1577,11 +1577,10 @@ ASTReader::getInputFile(ModuleFile &F, unsigned ID, bool Complain) { StoredSize, StoredTime); } - // For an overridden file, there is nothing to validate. - if (Overridden) - return InputFile(File, Overridden); + bool IsOutOfDate = false; - if ((StoredSize != File->getSize() + // For an overridden file, there is nothing to validate. + if (!Overridden && (StoredSize != File->getSize() #if !defined(LLVM_ON_WIN32) // In our regression testing, the Windows file system seems to // have inconsistent modification times that sometimes @@ -1591,11 +1590,14 @@ ASTReader::getInputFile(ModuleFile &F, unsigned ID, bool Complain) { )) { if (Complain) Error(diag::err_fe_pch_file_modified, Filename); - - return InputFile(); + IsOutOfDate = true; } - return InputFile(File, Overridden); + InputFile IF = InputFile(File, Overridden, IsOutOfDate); + + // Note that we've loaded this input file. + F.InputFilesLoaded[ID-1] = IF; + return IF; } } @@ -1668,9 +1670,11 @@ ASTReader::ReadControlBlock(ModuleFile &F, // Validate all of the input files. if (!DisableValidation) { bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0; - for (unsigned I = 0, N = Record[0]; I < N; ++I) - if (!getInputFile(F, I+1, Complain).getPointer()) + for (unsigned I = 0, N = Record[0]; I < N; ++I) { + InputFile IF = getInputFile(F, I+1, Complain); + if (!IF.getFile() || IF.isOutOfDate()) return OutOfDate; + } } return Success; |