From 529018285600cd32db5181002360f5887d7ec32b Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Tue, 6 Nov 2012 23:40:54 +0000 Subject: [PATCH] Tease out the routine that reads the control block of an AST file from the validation of an AST file against a specific set of options. llvm-svn: 167504 --- clang/include/clang/Serialization/ASTReader.h | 7 ++++ clang/lib/Serialization/ASTReader.cpp | 60 +++++++++++++++------------ 2 files changed, 41 insertions(+), 26 deletions(-) diff --git a/clang/include/clang/Serialization/ASTReader.h b/clang/include/clang/Serialization/ASTReader.h index ba26a49..e23ea5c 100644 --- a/clang/include/clang/Serialization/ASTReader.h +++ b/clang/include/clang/Serialization/ASTReader.h @@ -1160,6 +1160,13 @@ public: FileManager &FileMgr, DiagnosticsEngine &Diags); + /// \brief Read the control block for the named AST file. + /// + /// \returns true if an error occurred, false otherwise. + static bool readASTFileControlBlock(StringRef Filename, + FileManager &FileMgr, + ASTReaderListener &Listener); + /// \brief Determine whether the given AST file is acceptable to load into a /// translation unit with the given language and target options. static bool isAcceptableASTFile(StringRef Filename, diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index 783049e..fad0fe1 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -3127,17 +3127,15 @@ namespace { }; } -bool ASTReader::isAcceptableASTFile(StringRef Filename, - FileManager &FileMgr, - const LangOptions &LangOpts, - const TargetOptions &TargetOpts, - const PreprocessorOptions &PPOpts) { +bool ASTReader::readASTFileControlBlock(StringRef Filename, + FileManager &FileMgr, + ASTReaderListener &Listener) { // Open the AST file. std::string ErrStr; OwningPtr Buffer; Buffer.reset(FileMgr.getBufferForFile(Filename, &ErrStr)); if (!Buffer) { - return false; + return true; } // Initialize the stream @@ -3152,10 +3150,9 @@ bool ASTReader::isAcceptableASTFile(StringRef Filename, Stream.Read(8) != 'P' || Stream.Read(8) != 'C' || Stream.Read(8) != 'H') { - return false; + return true; } - SimplePCHValidator Validator(LangOpts, TargetOpts, PPOpts, FileMgr); RecordData Record; bool InControlBlock = false; while (!Stream.AtEndOfStream()) { @@ -3168,7 +3165,7 @@ bool ASTReader::isAcceptableASTFile(StringRef Filename, switch (BlockID) { case CONTROL_BLOCK_ID: if (Stream.EnterSubBlock(CONTROL_BLOCK_ID)) { - return false; + return true; } else { InControlBlock = true; } @@ -3176,7 +3173,7 @@ bool ASTReader::isAcceptableASTFile(StringRef Filename, default: if (Stream.SkipBlock()) - return false; + return true; break; } continue; @@ -3184,8 +3181,9 @@ bool ASTReader::isAcceptableASTFile(StringRef Filename, if (Code == llvm::bitc::END_BLOCK) { if (Stream.ReadBlockEnd()) { - return false; + return true; } + InControlBlock = false; continue; } @@ -3203,46 +3201,46 @@ bool ASTReader::isAcceptableASTFile(StringRef Filename, switch ((ControlRecordTypes)RecCode) { case METADATA: { if (Record[0] != VERSION_MAJOR) { - return false; + return true; } const std::string &CurBranch = getClangFullRepositoryVersion(); StringRef ASTBranch(BlobStart, BlobLen); if (StringRef(CurBranch) != ASTBranch) - return false; + return true; break; } case LANGUAGE_OPTIONS: - if (ParseLanguageOptions(Record, false, Validator)) - return false; + if (ParseLanguageOptions(Record, false, Listener)) + return true; break; case TARGET_OPTIONS: - if (ParseTargetOptions(Record, false, Validator)) - return false; + if (ParseTargetOptions(Record, false, Listener)) + return true; break; case DIAGNOSTIC_OPTIONS: - if (ParseDiagnosticOptions(Record, false, Validator)) - return false; + if (ParseDiagnosticOptions(Record, false, Listener)) + return true; break; case FILE_SYSTEM_OPTIONS: - if (ParseFileSystemOptions(Record, false, Validator)) - return false; + if (ParseFileSystemOptions(Record, false, Listener)) + return true; break; case HEADER_SEARCH_OPTIONS: - if (ParseHeaderSearchOptions(Record, false, Validator)) - return false; + if (ParseHeaderSearchOptions(Record, false, Listener)) + return true; break; case PREPROCESSOR_OPTIONS: { std::string IgnoredSuggestedPredefines; - if (ParsePreprocessorOptions(Record, false, Validator, + if (ParsePreprocessorOptions(Record, false, Listener, IgnoredSuggestedPredefines)) - return false; + return true; break; } @@ -3253,7 +3251,17 @@ bool ASTReader::isAcceptableASTFile(StringRef Filename, } } - return true; + return false; +} + + +bool ASTReader::isAcceptableASTFile(StringRef Filename, + FileManager &FileMgr, + const LangOptions &LangOpts, + const TargetOptions &TargetOpts, + const PreprocessorOptions &PPOpts) { + SimplePCHValidator validator(LangOpts, TargetOpts, PPOpts, FileMgr); + return !readASTFileControlBlock(Filename, FileMgr, validator); } bool ASTReader::ReadSubmoduleBlock(ModuleFile &F) { -- 2.7.4