[cfe-commits] r166449 - in /cfe/trunk: include/clang/Serialization/ASTReader.h lib/Frontend/ASTUnit.cpp lib/Frontend/ChainedIncludesSource.cpp lib/Frontend/CompilerInstance.cpp lib/Serialization/ASTReader.cpp
Sean Silva
silvas at purdue.edu
Mon Oct 22 17:58:41 PDT 2012
Hi Doug, is there any documentation about Clang's
serialization/deserialization capabilities? Maybe just a write-up of
"what you can do with it currently"?
-- Sean Silva
On Mon, Oct 22, 2012 at 7:51 PM, Douglas Gregor <dgregor at apple.com> wrote:
> Author: dgregor
> Date: Mon Oct 22 18:51:00 2012
> New Revision: 166449
>
> URL: http://llvm.org/viewvc/llvm-project?rev=166449&view=rev
> Log:
> Allow clients of the AST reader to specify what kinds of AST load
> failures they know how to tolerate, e.g., out-of-date input files or
> configuration/version mismatches. Suppress the corresponding
> diagnostics if the client can handle it.
>
> No clients actually use this functionality, yet.
>
> Modified:
> cfe/trunk/include/clang/Serialization/ASTReader.h
> cfe/trunk/lib/Frontend/ASTUnit.cpp
> cfe/trunk/lib/Frontend/ChainedIncludesSource.cpp
> cfe/trunk/lib/Frontend/CompilerInstance.cpp
> cfe/trunk/lib/Serialization/ASTReader.cpp
>
> Modified: cfe/trunk/include/clang/Serialization/ASTReader.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Serialization/ASTReader.h?rev=166449&r1=166448&r2=166449&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Serialization/ASTReader.h (original)
> +++ cfe/trunk/include/clang/Serialization/ASTReader.h Mon Oct 22 18:51:00 2012
> @@ -107,7 +107,8 @@
> ///
> /// \returns true to indicate the options are invalid or false otherwise.
> virtual bool ReadLanguageOptions(const serialization::ModuleFile &M,
> - const LangOptions &LangOpts) {
> + const LangOptions &LangOpts,
> + bool Complain) {
> return false;
> }
>
> @@ -116,7 +117,8 @@
> /// \returns true to indicate the target options are invalid, or false
> /// otherwise.
> virtual bool ReadTargetOptions(const serialization::ModuleFile &M,
> - const TargetOptions &TargetOpts) {
> + const TargetOptions &TargetOpts,
> + bool Complain) {
> return false;
> }
>
> @@ -130,11 +132,14 @@
> /// \param SuggestedPredefines If necessary, additional definitions are added
> /// here.
> ///
> + /// \param Complain Whether to complain about non-matching predefines buffers.
> + ///
> /// \returns true to indicate the predefines are invalid or false otherwise.
> virtual bool ReadPredefinesBuffer(const PCHPredefinesBlocks &Buffers,
> StringRef OriginalFileName,
> std::string &SuggestedPredefines,
> - FileManager &FileMgr) {
> + FileManager &FileMgr,
> + bool Complain) {
> return false;
> }
>
> @@ -159,13 +164,16 @@
> : PP(PP), Reader(Reader), NumHeaderInfos(0) {}
>
> virtual bool ReadLanguageOptions(const serialization::ModuleFile &M,
> - const LangOptions &LangOpts);
> + const LangOptions &LangOpts,
> + bool Complain);
> virtual bool ReadTargetOptions(const serialization::ModuleFile &M,
> - const TargetOptions &TargetOpts);
> + const TargetOptions &TargetOpts,
> + bool Complain);
> virtual bool ReadPredefinesBuffer(const PCHPredefinesBlocks &Buffers,
> StringRef OriginalFileName,
> std::string &SuggestedPredefines,
> - FileManager &FileMgr);
> + FileManager &FileMgr,
> + bool Complain);
> virtual void ReadHeaderFileInfo(const HeaderFileInfo &HFI, unsigned ID);
> virtual void ReadCounter(const serialization::ModuleFile &M, unsigned Value);
>
> @@ -883,7 +891,7 @@
>
> /// \brief Retrieve the file entry and 'overridden' bit for an input
> /// file in the given module file.
> - InputFile getInputFile(ModuleFile &F, unsigned ID);
> + InputFile getInputFile(ModuleFile &F, unsigned ID, bool Complain = true);
>
> /// \brief Get a FileEntry out of stored-in-PCH filename, making sure we take
> /// into account all the necessary relocations.
> @@ -893,17 +901,20 @@
>
> ASTReadResult ReadASTCore(StringRef FileName, ModuleKind Type,
> ModuleFile *ImportedBy,
> - llvm::SmallVectorImpl<ModuleFile *> &Loaded);
> + llvm::SmallVectorImpl<ModuleFile *> &Loaded,
> + unsigned ClientLoadCapabilities);
> ASTReadResult ReadControlBlock(ModuleFile &F,
> - llvm::SmallVectorImpl<ModuleFile *> &Loaded);
> + llvm::SmallVectorImpl<ModuleFile *> &Loaded,
> + unsigned ClientLoadCapabilities);
> bool ReadASTBlock(ModuleFile &F);
> - bool CheckPredefinesBuffers();
> + bool CheckPredefinesBuffers(bool Complain);
> bool ParseLineTable(ModuleFile &F, SmallVectorImpl<uint64_t> &Record);
> bool ReadSourceManagerBlock(ModuleFile &F);
> llvm::BitstreamCursor &SLocCursorForID(int ID);
> SourceLocation getImportLocation(ModuleFile *F);
> bool ReadSubmoduleBlock(ModuleFile &F);
> - bool ParseLanguageOptions(const ModuleFile &M, const RecordData &Record);
> + bool ParseLanguageOptions(const ModuleFile &M, const RecordData &Record,
> + bool Complain);
>
> struct RecordLocation {
> RecordLocation(ModuleFile *M, uint64_t O)
> @@ -1062,8 +1073,38 @@
>
> SourceManager &getSourceManager() const { return SourceMgr; }
>
> + /// \brief Flags that indicate what kind of AST loading failures the client
> + /// of the AST reader can directly handle.
> + ///
> + /// When a client states that it can handle a particular kind of failure,
> + /// the AST reader will not emit errors when producing that kind of failure.
> + enum LoadFailureCapabilities {
> + /// \brief The client can't handle any AST loading failures.
> + ARR_None = 0,
> + /// \brief The client can handle an AST file that cannot load because it
> + /// is out-of-date relative to its input files.
> + ARR_OutOfDate = 0x1,
> + /// \brief The client can handle an AST file that cannot load because it
> + /// was built with a different version of Clang.
> + ARR_VersionMismatch = 0x2,
> + /// \brief The client can handle an AST file that cannot load because it's
> + /// compiled configuration doesn't match that of the context it was
> + /// loaded into.
> + ARR_ConfigurationMismatch = 0x4
> + };
> +
> /// \brief Load the AST file designated by the given file name.
> - ASTReadResult ReadAST(const std::string &FileName, ModuleKind Type);
> + ///
> + /// \param FileName The name of the AST file to load.
> + ///
> + /// \param Type The kind of AST being loaded, e.g., PCH, module, main file,
> + /// or preamble.
> + ///
> + /// \param ClientLoadCapabilities The set of client load-failure
> + /// capabilities, represented as a bitset of the enumerators of
> + /// LoadFailureCapabilities.
> + ASTReadResult ReadAST(const std::string &FileName, ModuleKind Type,
> + unsigned ClientLoadCapabilities);
>
> /// \brief Make the entities in the given module and any of its (non-explicit)
> /// submodules visible to name lookup.
>
> Modified: cfe/trunk/lib/Frontend/ASTUnit.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/ASTUnit.cpp?rev=166449&r1=166448&r2=166449&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Frontend/ASTUnit.cpp (original)
> +++ cfe/trunk/lib/Frontend/ASTUnit.cpp Mon Oct 22 18:51:00 2012
> @@ -524,7 +524,8 @@
> InitializedLanguage(false) {}
>
> virtual bool ReadLanguageOptions(const serialization::ModuleFile &M,
> - const LangOptions &LangOpts) {
> + const LangOptions &LangOpts,
> + bool Complain) {
> if (InitializedLanguage)
> return false;
>
> @@ -538,7 +539,8 @@
> }
>
> virtual bool ReadTargetOptions(const serialization::ModuleFile &M,
> - const TargetOptions &TargetOpts) {
> + const TargetOptions &TargetOpts,
> + bool Complain) {
> // If we've already initialized the target, don't do it again.
> if (Target)
> return false;
> @@ -557,7 +559,8 @@
> virtual bool ReadPredefinesBuffer(const PCHPredefinesBlocks &Buffers,
> StringRef OriginalFileName,
> std::string &SuggestedPredefines,
> - FileManager &FileMgr) {
> + FileManager &FileMgr,
> + bool Complain) {
> Predefines = Buffers[0].Data;
> for (unsigned I = 1, N = Buffers.size(); I != N; ++I) {
> Predefines += Buffers[I].Data;
> @@ -809,7 +812,8 @@
> AST->TargetOpts, AST->Target,
> Predefines, Counter));
>
> - switch (Reader->ReadAST(Filename, serialization::MK_MainFile)) {
> + switch (Reader->ReadAST(Filename, serialization::MK_MainFile,
> + ASTReader::ARR_None)) {
> case ASTReader::Success:
> break;
>
>
> Modified: cfe/trunk/lib/Frontend/ChainedIncludesSource.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/ChainedIncludesSource.cpp?rev=166449&r1=166448&r2=166449&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Frontend/ChainedIncludesSource.cpp (original)
> +++ cfe/trunk/lib/Frontend/ChainedIncludesSource.cpp Mon Oct 22 18:51:00 2012
> @@ -39,7 +39,8 @@
> Reader->addInMemoryBuffer(sr, memBufs[ti]);
> }
> Reader->setDeserializationListener(deserialListener);
> - switch (Reader->ReadAST(pchFile, serialization::MK_PCH)) {
> + switch (Reader->ReadAST(pchFile, serialization::MK_PCH,
> + ASTReader::ARR_None)) {
> case ASTReader::Success:
> // Set the predefines buffer as suggested by the PCH reader.
> PP.setPredefines(Reader->getSuggestedPredefines());
>
> Modified: cfe/trunk/lib/Frontend/CompilerInstance.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInstance.cpp?rev=166449&r1=166448&r2=166449&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Frontend/CompilerInstance.cpp (original)
> +++ cfe/trunk/lib/Frontend/CompilerInstance.cpp Mon Oct 22 18:51:00 2012
> @@ -343,7 +343,8 @@
> static_cast<ASTDeserializationListener *>(DeserializationListener));
> switch (Reader->ReadAST(Path,
> Preamble ? serialization::MK_Preamble
> - : serialization::MK_PCH)) {
> + : serialization::MK_PCH,
> + ASTReader::ARR_None)) {
> case ASTReader::Success:
> // Set the predefines buffer as suggested by the PCH reader. Typically, the
> // predefines buffer will be empty.
> @@ -965,7 +966,8 @@
>
> // Try to load the module we found.
> switch (ModuleManager->ReadAST(ModuleFile->getName(),
> - serialization::MK_Module)) {
> + serialization::MK_Module,
> + ASTReader::ARR_None)) {
> case ASTReader::Success:
> break;
>
>
> Modified: cfe/trunk/lib/Serialization/ASTReader.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReader.cpp?rev=166449&r1=166448&r2=166449&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Serialization/ASTReader.cpp (original)
> +++ cfe/trunk/lib/Serialization/ASTReader.cpp Mon Oct 22 18:51:00 2012
> @@ -65,27 +65,31 @@
>
> bool
> PCHValidator::ReadLanguageOptions(const ModuleFile &M,
> - const LangOptions &LangOpts) {
> + const LangOptions &LangOpts,
> + bool Complain) {
> const LangOptions &PPLangOpts = PP.getLangOpts();
>
> -#define LANGOPT(Name, Bits, Default, Description) \
> - if (PPLangOpts.Name != LangOpts.Name) { \
> - Reader.Diag(diag::err_pch_langopt_mismatch) \
> - << Description << LangOpts.Name << PPLangOpts.Name; \
> - return true; \
> +#define LANGOPT(Name, Bits, Default, Description) \
> + if (PPLangOpts.Name != LangOpts.Name) { \
> + if (Complain) \
> + Reader.Diag(diag::err_pch_langopt_mismatch) \
> + << Description << LangOpts.Name << PPLangOpts.Name; \
> + return true; \
> }
>
> #define VALUE_LANGOPT(Name, Bits, Default, Description) \
> if (PPLangOpts.Name != LangOpts.Name) { \
> - Reader.Diag(diag::err_pch_langopt_value_mismatch) \
> - << Description; \
> - return true; \
> -}
> + if (Complain) \
> + Reader.Diag(diag::err_pch_langopt_value_mismatch) \
> + << Description; \
> + return true; \
> + }
>
> #define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
> if (PPLangOpts.get##Name() != LangOpts.get##Name()) { \
> - Reader.Diag(diag::err_pch_langopt_value_mismatch) \
> - << Description; \
> + if (Complain) \
> + Reader.Diag(diag::err_pch_langopt_value_mismatch) \
> + << Description; \
> return true; \
> }
>
> @@ -94,8 +98,9 @@
> #include "clang/Basic/LangOptions.def"
>
> if (PPLangOpts.ObjCRuntime != LangOpts.ObjCRuntime) {
> - Reader.Diag(diag::err_pch_langopt_value_mismatch)
> - << "target Objective-C runtime";
> + if (Complain)
> + Reader.Diag(diag::err_pch_langopt_value_mismatch)
> + << "target Objective-C runtime";
> return true;
> }
>
> @@ -103,14 +108,16 @@
> }
>
> bool PCHValidator::ReadTargetOptions(const ModuleFile &M,
> - const TargetOptions &TargetOpts) {
> + const TargetOptions &TargetOpts,
> + bool Complain) {
> const TargetOptions &ExistingTargetOpts = PP.getTargetInfo().getTargetOpts();
>
> -#define CHECK_TARGET_OPT(Field, Name) \
> - if (TargetOpts.Field != ExistingTargetOpts.Field) { \
> - Reader.Diag(diag::err_pch_targetopt_mismatch) \
> - << Name << TargetOpts.Field << ExistingTargetOpts.Field; \
> - return true; \
> +#define CHECK_TARGET_OPT(Field, Name) \
> + if (TargetOpts.Field != ExistingTargetOpts.Field) { \
> + if (Complain) \
> + Reader.Diag(diag::err_pch_targetopt_mismatch) \
> + << Name << TargetOpts.Field << ExistingTargetOpts.Field; \
> + return true; \
> }
>
> CHECK_TARGET_OPT(Triple, "target");
> @@ -139,25 +146,29 @@
> }
>
> if (ReadFeatures[ReadIdx] < ExistingFeatures[ExistingIdx]) {
> - Reader.Diag(diag::err_pch_targetopt_feature_mismatch)
> - << false << ReadFeatures[ReadIdx];
> + if (Complain)
> + Reader.Diag(diag::err_pch_targetopt_feature_mismatch)
> + << false << ReadFeatures[ReadIdx];
> return true;
> }
>
> - Reader.Diag(diag::err_pch_targetopt_feature_mismatch)
> - << true << ExistingFeatures[ExistingIdx];
> + if (Complain)
> + Reader.Diag(diag::err_pch_targetopt_feature_mismatch)
> + << true << ExistingFeatures[ExistingIdx];
> return true;
> }
>
> if (ExistingIdx < ExistingN) {
> - Reader.Diag(diag::err_pch_targetopt_feature_mismatch)
> - << true << ExistingFeatures[ExistingIdx];
> + if (Complain)
> + Reader.Diag(diag::err_pch_targetopt_feature_mismatch)
> + << true << ExistingFeatures[ExistingIdx];
> return true;
> }
>
> if (ReadIdx < ReadN) {
> - Reader.Diag(diag::err_pch_targetopt_feature_mismatch)
> - << false << ReadFeatures[ReadIdx];
> + if (Complain)
> + Reader.Diag(diag::err_pch_targetopt_feature_mismatch)
> + << false << ReadFeatures[ReadIdx];
> return true;
> }
>
> @@ -249,7 +260,8 @@
> bool PCHValidator::ReadPredefinesBuffer(const PCHPredefinesBlocks &Buffers,
> StringRef OriginalFileName,
> std::string &SuggestedPredefines,
> - FileManager &FileMgr) {
> + FileManager &FileMgr,
> + bool Complain) {
> // We are in the context of an implicit include, so the predefines buffer will
> // have a #include entry for the PCH file itself (as normalized by the
> // preprocessor initialization). Find it and skip over it in the checking
> @@ -263,7 +275,8 @@
> StringRef(PP.getPredefines()).split(PCHInclude.str());
> StringRef Left = Split.first, Right = Split.second;
> if (Left == PP.getPredefines()) {
> - Error("Missing PCH include entry!");
> + if (Complain)
> + Error("Missing PCH include entry!");
> return true;
> }
>
> @@ -338,7 +351,8 @@
> continue;
> }
> if (!Missing.startswith("#define ")) {
> - Reader.Diag(diag::warn_pch_compiler_options_mismatch);
> + if (Complain)
> + Reader.Diag(diag::warn_pch_compiler_options_mismatch);
> return true;
> }
>
> @@ -376,6 +390,9 @@
> }
>
> if (ConflictPos != CmdLineLines.end()) {
> + if (!Complain)
> + return true;
> +
> Reader.Diag(diag::warn_cmdline_conflicting_macro_def)
> << MacroName;
>
> @@ -398,10 +415,16 @@
> continue; // Don't complain if there are already conflicting defs
>
> if (!MissingDefines) {
> + if (!Complain)
> + return true;
> +
> Reader.Diag(diag::warn_cmdline_missing_macro_defs);
> MissingDefines = true;
> }
>
> + if (!Complain)
> + return true;
> +
> // Show the definition of this macro within the PCH file.
> std::pair<FileID, StringRef::size_type> MacroLoc =
> FindMacro(Buffers, Missing);
> @@ -426,7 +449,8 @@
> for (unsigned I = 0, N = ExtraPredefines.size(); I != N; ++I) {
> StringRef &Extra = ExtraPredefines[I];
> if (!Extra.startswith("#define ")) {
> - Reader.Diag(diag::warn_pch_compiler_options_mismatch);
> + if (Complain)
> + Reader.Diag(diag::warn_pch_compiler_options_mismatch);
> return true;
> }
>
> @@ -443,7 +467,8 @@
> // so, defining it as a macro could change behavior, so we reject
> // the PCH file.
> if (IdentifierInfo *II = Reader.get(MacroName)) {
> - Reader.Diag(diag::warn_macro_name_used_in_pch) << II;
> + if (Complain)
> + Reader.Diag(diag::warn_macro_name_used_in_pch) << II;
> return true;
> }
>
> @@ -818,14 +843,15 @@
> }
>
> /// \brief Tell the AST listener about the predefines buffers in the chain.
> -bool ASTReader::CheckPredefinesBuffers() {
> +bool ASTReader::CheckPredefinesBuffers(bool Complain) {
> if (Listener) {
> // We only care about the primary module.
> ModuleFile &M = ModuleMgr.getPrimaryModule();
> return Listener->ReadPredefinesBuffer(PCHPredefinesBuffers,
> M.ActualOriginalSourceFileName,
> SuggestedPredefines,
> - FileMgr);
> + FileMgr,
> + Complain);
> }
> return false;
> }
> @@ -1665,7 +1691,7 @@
> }
>
> llvm::PointerIntPair<const FileEntry *, 1, bool>
> -ASTReader::getInputFile(ModuleFile &F, unsigned ID) {
> +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();
> @@ -1719,10 +1745,12 @@
> }
>
> if (File == 0) {
> - std::string ErrorStr = "could not find file '";
> - ErrorStr += Filename;
> - ErrorStr += "' referenced by AST file";
> - Error(ErrorStr.c_str());
> + if (Complain) {
> + std::string ErrorStr = "could not find file '";
> + ErrorStr += Filename;
> + ErrorStr += "' referenced by AST file";
> + Error(ErrorStr.c_str());
> + }
> return InputFile();
> }
>
> @@ -1766,7 +1794,9 @@
> || StoredTime != StatBuf.st_mtime
> #endif
> )) {
> - Error(diag::err_fe_pch_file_modified, Filename);
> + if (Complain)
> + Error(diag::err_fe_pch_file_modified, Filename);
> +
> return InputFile();
> }
>
> @@ -1820,8 +1850,10 @@
> return Filename;
> }
>
> -ASTReader::ASTReadResult ASTReader::ReadControlBlock(ModuleFile &F,
> - llvm::SmallVectorImpl<ModuleFile *> &Loaded) {
> +ASTReader::ASTReadResult
> +ASTReader::ReadControlBlock(ModuleFile &F,
> + llvm::SmallVectorImpl<ModuleFile *> &Loaded,
> + unsigned ClientLoadCapabilities) {
> llvm::BitstreamCursor &Stream = F.Stream;
>
> if (Stream.EnterSubBlock(CONTROL_BLOCK_ID)) {
> @@ -1841,8 +1873,9 @@
>
> // 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).getPointer())
> + if (!getInputFile(F, I+1, Complain).getPointer())
> return OutOfDate;
> }
>
> @@ -1884,8 +1917,9 @@
> &BlobStart, &BlobLen)) {
> case METADATA: {
> if (Record[0] != VERSION_MAJOR && !DisableValidation) {
> - Diag(Record[0] < VERSION_MAJOR? diag::warn_pch_version_too_old
> - : diag::warn_pch_version_too_new);
> + if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
> + Diag(Record[0] < VERSION_MAJOR? diag::warn_pch_version_too_old
> + : diag::warn_pch_version_too_new);
> return VersionMismatch;
> }
>
> @@ -1900,7 +1934,8 @@
> const std::string &CurBranch = getClangFullRepositoryVersion();
> StringRef ASTBranch(BlobStart, BlobLen);
> if (StringRef(CurBranch) != ASTBranch && !DisableValidation) {
> - Diag(diag::warn_pch_different_branch) << ASTBranch << CurBranch;
> + if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
> + Diag(diag::warn_pch_different_branch) << ASTBranch << CurBranch;
> return VersionMismatch;
> }
> break;
> @@ -1918,7 +1953,8 @@
> Idx += Length;
>
> // Load the AST file.
> - switch(ReadASTCore(ImportedFile, ImportedKind, &F, Loaded)) {
> + switch(ReadASTCore(ImportedFile, ImportedKind, &F, Loaded,
> + ClientLoadCapabilities)) {
> case Failure: return Failure;
> // If we have to ignore the dependency, we'll have to ignore this too.
> case OutOfDate: return OutOfDate;
> @@ -1931,11 +1967,13 @@
> break;
> }
>
> - case LANGUAGE_OPTIONS:
> - if (Listener && &F == *ModuleMgr.begin() &&
> - ParseLanguageOptions(F, Record) && !DisableValidation)
> + case LANGUAGE_OPTIONS: {
> + bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
> + if (Listener && &F == *ModuleMgr.begin() &&
> + ParseLanguageOptions(F, Record, Complain) && !DisableValidation)
> return ConfigurationMismatch;
> break;
> + }
>
> case TARGET_OPTIONS: {
> if (Listener && &F == *ModuleMgr.begin()) {
> @@ -1953,7 +1991,9 @@
> TargetOpts.Features.push_back(ReadString(Record, Idx));
> }
>
> - if (Listener->ReadTargetOptions(F, TargetOpts) && !DisableValidation)
> + bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0;
> + if (Listener->ReadTargetOptions(F, TargetOpts, Complain) &&
> + !DisableValidation)
> return ConfigurationMismatch;
> }
> break;
> @@ -2869,13 +2909,15 @@
> }
>
> ASTReader::ASTReadResult ASTReader::ReadAST(const std::string &FileName,
> - ModuleKind Type) {
> + ModuleKind Type,
> + unsigned ClientLoadCapabilities) {
> // Bump the generation number.
> unsigned PreviousGeneration = CurrentGeneration++;
>
> // Load the core of the AST files.
> llvm::SmallVector<ModuleFile *, 4> Loaded;
> - switch(ReadASTCore(FileName, Type, /*ImportedBy=*/0, Loaded)) {
> + switch(ReadASTCore(FileName, Type, /*ImportedBy=*/0, Loaded,
> + ClientLoadCapabilities)) {
> case Failure: return Failure;
> case OutOfDate: return OutOfDate;
> case VersionMismatch: return VersionMismatch;
> @@ -2914,11 +2956,12 @@
> }
>
> // Check the predefines buffers.
> + bool ConfigComplain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0;
> if (!DisableValidation && Type == MK_PCH &&
> // FIXME: CheckPredefinesBuffers also sets the SuggestedPredefines;
> // if DisableValidation is true, defines that were set on command-line
> // but not in the PCH file will not be added to SuggestedPredefines.
> - CheckPredefinesBuffers())
> + CheckPredefinesBuffers(ConfigComplain))
> return ConfigurationMismatch;
>
> // Mark all of the identifiers in the identifier table as being out of date,
> @@ -2979,10 +3022,12 @@
> return Success;
> }
>
> -ASTReader::ASTReadResult ASTReader::ReadASTCore(StringRef FileName,
> - ModuleKind Type,
> - ModuleFile *ImportedBy,
> - llvm::SmallVectorImpl<ModuleFile *> &Loaded) {
> +ASTReader::ASTReadResult
> +ASTReader::ReadASTCore(StringRef FileName,
> + ModuleKind Type,
> + ModuleFile *ImportedBy,
> + llvm::SmallVectorImpl<ModuleFile *> &Loaded,
> + unsigned ClientLoadCapabilities) {
> ModuleFile *M;
> bool NewModule;
> std::string ErrorStr;
> @@ -3042,7 +3087,7 @@
> }
> break;
> case CONTROL_BLOCK_ID:
> - switch (ReadControlBlock(F, Loaded)) {
> + switch (ReadControlBlock(F, Loaded, ClientLoadCapabilities)) {
> case Success:
> break;
>
> @@ -3584,7 +3629,8 @@
> ///
> /// \returns true if the listener deems the file unacceptable, false otherwise.
> bool ASTReader::ParseLanguageOptions(const ModuleFile &M,
> - const RecordData &Record) {
> + const RecordData &Record,
> + bool Complain) {
> if (Listener) {
> LangOptions LangOpts;
> unsigned Idx = 0;
> @@ -3601,7 +3647,7 @@
> unsigned Length = Record[Idx++];
> LangOpts.CurrentModule.assign(Record.begin() + Idx,
> Record.begin() + Idx + Length);
> - return Listener->ReadLanguageOptions(M, LangOpts);
> + return Listener->ReadLanguageOptions(M, LangOpts, Complain);
> }
>
> return false;
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list