https://github.com/vsapsai updated https://github.com/llvm/llvm-project/pull/101413
>From c474bcdc5155d3ca9f9d219444b70e6c0ba43a28 Mon Sep 17 00:00:00 2001 From: Volodymyr Sapsai <vsap...@apple.com> Date: Wed, 31 Jul 2024 14:13:47 -0700 Subject: [PATCH 1/3] [Modules][Diagnostic] Mention which AST file's options differ from the current TU options. Claiming a mismatch is always in a precompiled header is wrong and misleading as a mismatch can happen in any provided AST file. Emitting a path for a file with a problem allows to disambiguate between multiple input files. Use generic term "AST file" because we don't always know a kind of the provided file (for example, see `ASTReader::readASTFileControlBlock`). rdar://65005546 --- .../Basic/DiagnosticSerializationKinds.td | 46 +-- clang/include/clang/Serialization/ASTReader.h | 76 +++-- clang/lib/Frontend/ASTUnit.cpp | 10 +- clang/lib/Serialization/ASTReader.cpp | 322 ++++++++++-------- .../Modules/check-for-sanitizer-feature.cpp | 2 +- clang/test/Modules/ignored_macros.m | 2 +- clang/test/Modules/load_failure.c | 2 +- clang/test/Modules/merge-target-features.cpp | 6 +- clang/test/Modules/mismatch-diagnostics.cpp | 2 +- .../Modules/module-pch-different-cache-path.c | 4 +- clang/test/Modules/pr62359.cppm | 4 +- clang/test/PCH/arc.m | 4 +- clang/test/PCH/fuzzy-pch.c | 6 +- clang/test/PCH/module-hash-difference.m | 2 +- clang/test/PCH/ms-pch-macro.c | 4 +- clang/test/PCH/no-validate-pch.cl | 4 +- 16 files changed, 270 insertions(+), 226 deletions(-) diff --git a/clang/include/clang/Basic/DiagnosticSerializationKinds.td b/clang/include/clang/Basic/DiagnosticSerializationKinds.td index 51d0abbbec252..9854972cbfe7e 100644 --- a/clang/include/clang/Basic/DiagnosticSerializationKinds.td +++ b/clang/include/clang/Basic/DiagnosticSerializationKinds.td @@ -29,20 +29,20 @@ def note_pch_rebuild_required : Note<"please rebuild precompiled header '%0'">; def note_module_cache_path : Note< "after modifying system headers, please delete the module cache at '%0'">; -def err_pch_targetopt_mismatch : Error< - "PCH file was compiled for the %0 '%1' but the current translation " - "unit is being compiled for target '%2'">; -def err_pch_targetopt_feature_mismatch : Error< - "%select{AST file was|current translation unit is}0 compiled with the target " - "feature '%1' but the %select{current translation unit is|AST file was}0 " +def err_ast_file_targetopt_mismatch : Error< + "AST file '%0' was compiled for the %1 '%2' but the current translation " + "unit is being compiled for target '%3'">; +def err_ast_file_targetopt_feature_mismatch : Error< + "%select{AST file '%1' was|current translation unit is}0 compiled with the target " + "feature '%2' but the %select{current translation unit is|AST file '%1' was}0 " "not">; -def err_pch_langopt_mismatch : Error<"%0 was %select{disabled|enabled}1 in " - "PCH file but is currently %select{disabled|enabled}2">; -def err_pch_langopt_value_mismatch : Error< - "%0 differs in PCH file vs. current file">; -def err_pch_diagopt_mismatch : Error<"%0 is currently enabled, but was not in " - "the PCH file">; -def err_pch_modulecache_mismatch : Error<"PCH was compiled with module cache " +def err_ast_file_langopt_mismatch : Error<"%0 was %select{disabled|enabled}1 in " + "AST file '%3' but is currently %select{disabled|enabled}2">; +def err_ast_file_langopt_value_mismatch : Error< + "%0 differs in AST file '%1' vs. current file">; +def err_ast_file_diagopt_mismatch : Error<"%0 is currently enabled, but was not in " + "the AST file '%1'">; +def err_ast_file_modulecache_mismatch : Error<"AST file '%2' was compiled with module cache " "path '%0', but the path is currently '%1'">; def warn_pch_vfsoverlay_mismatch : Warning< "PCH was compiled with different VFS overlay files than are currently in use">, @@ -99,19 +99,19 @@ def err_module_different_modmap : Error< "module '%0' %select{uses|does not use}1 additional module map '%2'" "%select{| not}1 used when the module was built">; -def err_pch_macro_def_undef : Error< - "macro '%0' was %select{defined|undef'd}1 in the precompiled header but " +def err_ast_file_macro_def_undef : Error< + "macro '%0' was %select{defined|undef'd}1 in the AST file '%2' but " "%select{undef'd|defined}1 on the command line">; -def err_pch_macro_def_conflict : Error< - "definition of macro '%0' differs between the precompiled header ('%1') " +def err_ast_file_macro_def_conflict : Error< + "definition of macro '%0' differs between the AST file '%3' ('%1') " "and the command line ('%2')">; -def err_pch_undef : Error< - "%select{command line contains|precompiled header was built with}0 " - "'-undef' but %select{precompiled header was not built with it|" +def err_ast_file_undef : Error< + "%select{command line contains|AST file '%1' was built with}0 " + "'-undef' but %select{AST file '%1' was not built with it|" "it is not present on the command line}0">; -def err_pch_pp_detailed_record : Error< - "%select{command line contains|precompiled header was built with}0 " - "'-detailed-preprocessing-record' but %select{precompiled header was not " +def err_ast_file_pp_detailed_record : Error< + "%select{command line contains|AST file '%1' was built with}0 " + "'-detailed-preprocessing-record' but %select{AST file '%1' was not " "built with it|it is not present on the command line}0">; def err_module_odr_violation_missing_decl : Error< diff --git a/clang/include/clang/Serialization/ASTReader.h b/clang/include/clang/Serialization/ASTReader.h index 76e51ac7ab979..7bbb64c138817 100644 --- a/clang/include/clang/Serialization/ASTReader.h +++ b/clang/include/clang/Serialization/ASTReader.h @@ -130,7 +130,7 @@ class ASTReaderListener { /// /// \returns true to indicate the options are invalid or false otherwise. virtual bool ReadLanguageOptions(const LangOptions &LangOpts, - bool Complain, + StringRef Filename, bool Complain, bool AllowCompatibleDifferences) { return false; } @@ -139,7 +139,8 @@ class ASTReaderListener { /// /// \returns true to indicate the target options are invalid, or false /// otherwise. - virtual bool ReadTargetOptions(const TargetOptions &TargetOpts, bool Complain, + virtual bool ReadTargetOptions(const TargetOptions &TargetOpts, + StringRef Filename, bool Complain, bool AllowCompatibleDifferences) { return false; } @@ -150,7 +151,7 @@ class ASTReaderListener { /// otherwise. virtual bool ReadDiagnosticOptions(IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, - bool Complain) { + StringRef Filename, bool Complain) { return false; } @@ -172,6 +173,7 @@ class ASTReaderListener { /// \returns true to indicate the header search options are invalid, or false /// otherwise. virtual bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, + StringRef Filename, StringRef SpecificModuleCachePath, bool Complain) { return false; @@ -200,7 +202,8 @@ class ASTReaderListener { /// \returns true to indicate the preprocessor options are invalid, or false /// otherwise. virtual bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, - bool ReadMacros, bool Complain, + StringRef Filename, bool ReadMacros, + bool Complain, std::string &SuggestedPredefines) { return false; } @@ -262,20 +265,24 @@ class ChainedASTReaderListener : public ASTReaderListener { bool ReadFullVersionInformation(StringRef FullVersion) override; void ReadModuleName(StringRef ModuleName) override; void ReadModuleMapFile(StringRef ModuleMapPath) override; - bool ReadLanguageOptions(const LangOptions &LangOpts, bool Complain, + bool ReadLanguageOptions(const LangOptions &LangOpts, StringRef Filename, + bool Complain, bool AllowCompatibleDifferences) override; - bool ReadTargetOptions(const TargetOptions &TargetOpts, bool Complain, + bool ReadTargetOptions(const TargetOptions &TargetOpts, StringRef Filename, + bool Complain, bool AllowCompatibleDifferences) override; bool ReadDiagnosticOptions(IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, - bool Complain) override; + StringRef Filename, bool Complain) override; bool ReadFileSystemOptions(const FileSystemOptions &FSOpts, bool Complain) override; bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, + StringRef Filename, StringRef SpecificModuleCachePath, bool Complain) override; bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, - bool ReadMacros, bool Complain, + StringRef Filename, bool ReadMacros, + bool Complain, std::string &SuggestedPredefines) override; void ReadCounter(const serialization::ModuleFile &M, unsigned Value) override; @@ -299,16 +306,20 @@ class PCHValidator : public ASTReaderListener { PCHValidator(Preprocessor &PP, ASTReader &Reader) : PP(PP), Reader(Reader) {} - bool ReadLanguageOptions(const LangOptions &LangOpts, bool Complain, + bool ReadLanguageOptions(const LangOptions &LangOpts, StringRef Filename, + bool Complain, bool AllowCompatibleDifferences) override; - bool ReadTargetOptions(const TargetOptions &TargetOpts, bool Complain, + bool ReadTargetOptions(const TargetOptions &TargetOpts, StringRef Filename, + bool Complain, bool AllowCompatibleDifferences) override; bool ReadDiagnosticOptions(IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, - bool Complain) override; + StringRef Filename, bool Complain) override; bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, - bool ReadMacros, bool Complain, + StringRef Filename, bool ReadMacros, + bool Complain, std::string &SuggestedPredefines) override; bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, + StringRef Filename, StringRef SpecificModuleCachePath, bool Complain) override; void ReadCounter(const serialization::ModuleFile &M, unsigned Value) override; @@ -325,7 +336,8 @@ class SimpleASTReaderListener : public ASTReaderListener { SimpleASTReaderListener(Preprocessor &PP) : PP(PP) {} bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, - bool ReadMacros, bool Complain, + StringRef Filename, bool ReadMacros, + bool Complain, std::string &SuggestedPredefines) override; }; @@ -1361,10 +1373,12 @@ class ASTReader SmallVectorImpl<ImportedModule> &Loaded, const ModuleFile *ImportedBy, unsigned ClientLoadCapabilities); - static ASTReadResult ReadOptionsBlock( - llvm::BitstreamCursor &Stream, unsigned ClientLoadCapabilities, - bool AllowCompatibleConfigurationMismatch, ASTReaderListener &Listener, - std::string &SuggestedPredefines); + static ASTReadResult + ReadOptionsBlock(llvm::BitstreamCursor &Stream, StringRef Filename, + unsigned ClientLoadCapabilities, + bool AllowCompatibleConfigurationMismatch, + ASTReaderListener &Listener, + std::string &SuggestedPredefines); /// Read the unhashed control block. /// @@ -1373,12 +1387,11 @@ class ASTReader ASTReadResult readUnhashedControlBlock(ModuleFile &F, bool WasImportedBy, unsigned ClientLoadCapabilities); - static ASTReadResult - readUnhashedControlBlockImpl(ModuleFile *F, llvm::StringRef StreamData, - unsigned ClientLoadCapabilities, - bool AllowCompatibleConfigurationMismatch, - ASTReaderListener *Listener, - bool ValidateDiagnosticOptions); + static ASTReadResult readUnhashedControlBlockImpl( + ModuleFile *F, llvm::StringRef StreamData, StringRef Filename, + unsigned ClientLoadCapabilities, + bool AllowCompatibleConfigurationMismatch, ASTReaderListener *Listener, + bool ValidateDiagnosticOptions); llvm::Error ReadASTBlock(ModuleFile &F, unsigned ClientLoadCapabilities); llvm::Error ReadExtensionBlock(ModuleFile &F); @@ -1391,21 +1404,24 @@ class ASTReader unsigned ClientLoadCapabilities); llvm::Error ReadSubmoduleBlock(ModuleFile &F, unsigned ClientLoadCapabilities); - static bool ParseLanguageOptions(const RecordData &Record, bool Complain, - ASTReaderListener &Listener, + static bool ParseLanguageOptions(const RecordData &Record, StringRef Filename, + bool Complain, ASTReaderListener &Listener, bool AllowCompatibleDifferences); - static bool ParseTargetOptions(const RecordData &Record, bool Complain, - ASTReaderListener &Listener, + static bool ParseTargetOptions(const RecordData &Record, StringRef Filename, + bool Complain, ASTReaderListener &Listener, bool AllowCompatibleDifferences); - static bool ParseDiagnosticOptions(const RecordData &Record, bool Complain, + static bool ParseDiagnosticOptions(const RecordData &Record, + StringRef Filename, bool Complain, ASTReaderListener &Listener); static bool ParseFileSystemOptions(const RecordData &Record, bool Complain, ASTReaderListener &Listener); - static bool ParseHeaderSearchOptions(const RecordData &Record, bool Complain, + static bool ParseHeaderSearchOptions(const RecordData &Record, + StringRef Filename, bool Complain, ASTReaderListener &Listener); static bool ParseHeaderSearchPaths(const RecordData &Record, bool Complain, ASTReaderListener &Listener); - static bool ParsePreprocessorOptions(const RecordData &Record, bool Complain, + static bool ParsePreprocessorOptions(const RecordData &Record, + StringRef Filename, bool Complain, ASTReaderListener &Listener, std::string &SuggestedPredefines); diff --git a/clang/lib/Frontend/ASTUnit.cpp b/clang/lib/Frontend/ASTUnit.cpp index 67d4c07d1ce39..877772cc74429 100644 --- a/clang/lib/Frontend/ASTUnit.cpp +++ b/clang/lib/Frontend/ASTUnit.cpp @@ -536,7 +536,8 @@ class ASTInfoCollector : public ASTReaderListener { LangOpt(LangOpt), TargetOpts(TargetOpts), Target(Target), Counter(Counter) {} - bool ReadLanguageOptions(const LangOptions &LangOpts, bool Complain, + bool ReadLanguageOptions(const LangOptions &LangOpts, StringRef Filename, + bool Complain, bool AllowCompatibleDifferences) override { if (InitializedLanguage) return false; @@ -559,6 +560,7 @@ class ASTInfoCollector : public ASTReaderListener { } bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, + StringRef Filename, StringRef SpecificModuleCachePath, bool Complain) override { // llvm::SaveAndRestore doesn't support bit field. @@ -597,13 +599,15 @@ class ASTInfoCollector : public ASTReaderListener { } bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, - bool ReadMacros, bool Complain, + StringRef Filename, bool ReadMacros, + bool Complain, std::string &SuggestedPredefines) override { this->PPOpts = PPOpts; return false; } - bool ReadTargetOptions(const TargetOptions &TargetOpts, bool Complain, + bool ReadTargetOptions(const TargetOptions &TargetOpts, StringRef Filename, + bool Complain, bool AllowCompatibleDifferences) override { // If we've already initialized the target, don't do it again. if (Target) diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index 86fa96a91932f..2aa3fcc036f05 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -171,29 +171,29 @@ void ChainedASTReaderListener::ReadModuleMapFile(StringRef ModuleMapPath) { Second->ReadModuleMapFile(ModuleMapPath); } -bool -ChainedASTReaderListener::ReadLanguageOptions(const LangOptions &LangOpts, - bool Complain, - bool AllowCompatibleDifferences) { - return First->ReadLanguageOptions(LangOpts, Complain, +bool ChainedASTReaderListener::ReadLanguageOptions( + const LangOptions &LangOpts, StringRef Filename, bool Complain, + bool AllowCompatibleDifferences) { + return First->ReadLanguageOptions(LangOpts, Filename, Complain, AllowCompatibleDifferences) || - Second->ReadLanguageOptions(LangOpts, Complain, + Second->ReadLanguageOptions(LangOpts, Filename, Complain, AllowCompatibleDifferences); } bool ChainedASTReaderListener::ReadTargetOptions( - const TargetOptions &TargetOpts, bool Complain, + const TargetOptions &TargetOpts, StringRef Filename, bool Complain, bool AllowCompatibleDifferences) { - return First->ReadTargetOptions(TargetOpts, Complain, + return First->ReadTargetOptions(TargetOpts, Filename, Complain, AllowCompatibleDifferences) || - Second->ReadTargetOptions(TargetOpts, Complain, + Second->ReadTargetOptions(TargetOpts, Filename, Complain, AllowCompatibleDifferences); } bool ChainedASTReaderListener::ReadDiagnosticOptions( - IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, bool Complain) { - return First->ReadDiagnosticOptions(DiagOpts, Complain) || - Second->ReadDiagnosticOptions(DiagOpts, Complain); + IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, StringRef Filename, + bool Complain) { + return First->ReadDiagnosticOptions(DiagOpts, Filename, Complain) || + Second->ReadDiagnosticOptions(DiagOpts, Filename, Complain); } bool @@ -204,20 +204,20 @@ ChainedASTReaderListener::ReadFileSystemOptions(const FileSystemOptions &FSOpts, } bool ChainedASTReaderListener::ReadHeaderSearchOptions( - const HeaderSearchOptions &HSOpts, StringRef SpecificModuleCachePath, - bool Complain) { - return First->ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath, - Complain) || - Second->ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath, - Complain); + const HeaderSearchOptions &HSOpts, StringRef Filename, + StringRef SpecificModuleCachePath, bool Complain) { + return First->ReadHeaderSearchOptions(HSOpts, Filename, + SpecificModuleCachePath, Complain) || + Second->ReadHeaderSearchOptions(HSOpts, Filename, + SpecificModuleCachePath, Complain); } bool ChainedASTReaderListener::ReadPreprocessorOptions( - const PreprocessorOptions &PPOpts, bool ReadMacros, bool Complain, - std::string &SuggestedPredefines) { - return First->ReadPreprocessorOptions(PPOpts, ReadMacros, Complain, + const PreprocessorOptions &PPOpts, StringRef Filename, bool ReadMacros, + bool Complain, std::string &SuggestedPredefines) { + return First->ReadPreprocessorOptions(PPOpts, Filename, ReadMacros, Complain, SuggestedPredefines) || - Second->ReadPreprocessorOptions(PPOpts, ReadMacros, Complain, + Second->ReadPreprocessorOptions(PPOpts, Filename, ReadMacros, Complain, SuggestedPredefines); } @@ -281,35 +281,36 @@ ASTReaderListener::~ASTReaderListener() = default; /// \returns true if the languagae options mis-match, false otherwise. static bool checkLanguageOptions(const LangOptions &LangOpts, const LangOptions &ExistingLangOpts, - DiagnosticsEngine *Diags, + StringRef Filename, DiagnosticsEngine *Diags, bool AllowCompatibleDifferences = true) { -#define LANGOPT(Name, Bits, Default, Description) \ - if (ExistingLangOpts.Name != LangOpts.Name) { \ - if (Diags) { \ - if (Bits == 1) \ - Diags->Report(diag::err_pch_langopt_mismatch) \ - << Description << LangOpts.Name << ExistingLangOpts.Name; \ - else \ - Diags->Report(diag::err_pch_langopt_value_mismatch) \ - << Description; \ - } \ - return true; \ - } - -#define VALUE_LANGOPT(Name, Bits, Default, Description) \ - if (ExistingLangOpts.Name != LangOpts.Name) { \ - if (Diags) \ - Diags->Report(diag::err_pch_langopt_value_mismatch) \ - << Description; \ - return true; \ - } - -#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ - if (ExistingLangOpts.get##Name() != LangOpts.get##Name()) { \ - if (Diags) \ - Diags->Report(diag::err_pch_langopt_value_mismatch) \ - << Description; \ - return true; \ +#define LANGOPT(Name, Bits, Default, Description) \ + if (ExistingLangOpts.Name != LangOpts.Name) { \ + if (Diags) { \ + if (Bits == 1) \ + Diags->Report(diag::err_ast_file_langopt_mismatch) \ + << Description << LangOpts.Name << ExistingLangOpts.Name \ + << Filename; \ + else \ + Diags->Report(diag::err_ast_file_langopt_value_mismatch) \ + << Description << Filename; \ + } \ + return true; \ + } + +#define VALUE_LANGOPT(Name, Bits, Default, Description) \ + if (ExistingLangOpts.Name != LangOpts.Name) { \ + if (Diags) \ + Diags->Report(diag::err_ast_file_langopt_value_mismatch) \ + << Description << Filename; \ + return true; \ + } + +#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ + if (ExistingLangOpts.get##Name() != LangOpts.get##Name()) { \ + if (Diags) \ + Diags->Report(diag::err_ast_file_langopt_value_mismatch) \ + << Description << Filename; \ + return true; \ } #define COMPATIBLE_LANGOPT(Name, Bits, Default, Description) \ @@ -331,22 +332,23 @@ static bool checkLanguageOptions(const LangOptions &LangOpts, if (ExistingLangOpts.ModuleFeatures != LangOpts.ModuleFeatures) { if (Diags) - Diags->Report(diag::err_pch_langopt_value_mismatch) << "module features"; + Diags->Report(diag::err_ast_file_langopt_value_mismatch) + << "module features" << Filename; return true; } if (ExistingLangOpts.ObjCRuntime != LangOpts.ObjCRuntime) { if (Diags) - Diags->Report(diag::err_pch_langopt_value_mismatch) - << "target Objective-C runtime"; + Diags->Report(diag::err_ast_file_langopt_value_mismatch) + << "target Objective-C runtime" << Filename; return true; } if (ExistingLangOpts.CommentOpts.BlockCommandNames != LangOpts.CommentOpts.BlockCommandNames) { if (Diags) - Diags->Report(diag::err_pch_langopt_value_mismatch) - << "block command names"; + Diags->Report(diag::err_ast_file_langopt_value_mismatch) + << "block command names" << Filename; return true; } @@ -368,8 +370,8 @@ static bool checkLanguageOptions(const LangOptions &LangOpts, bool InExistingModule = ExistingSanitizers.has(SanitizerKind::ID); \ bool InImportedModule = ImportedSanitizers.has(SanitizerKind::ID); \ if (InExistingModule != InImportedModule) \ - Diags->Report(diag::err_pch_targetopt_feature_mismatch) \ - << InExistingModule << (Flag + NAME); \ + Diags->Report(diag::err_ast_file_targetopt_feature_mismatch) \ + << InExistingModule << Filename << (Flag + NAME); \ } #include "clang/Basic/Sanitizers.def" } @@ -388,14 +390,14 @@ static bool checkLanguageOptions(const LangOptions &LangOpts, /// \returns true if the target options mis-match, false otherwise. static bool checkTargetOptions(const TargetOptions &TargetOpts, const TargetOptions &ExistingTargetOpts, - DiagnosticsEngine *Diags, + StringRef Filename, DiagnosticsEngine *Diags, bool AllowCompatibleDifferences = true) { -#define CHECK_TARGET_OPT(Field, Name) \ - if (TargetOpts.Field != ExistingTargetOpts.Field) { \ - if (Diags) \ - Diags->Report(diag::err_pch_targetopt_mismatch) \ - << Name << TargetOpts.Field << ExistingTargetOpts.Field; \ - return true; \ +#define CHECK_TARGET_OPT(Field, Name) \ + if (TargetOpts.Field != ExistingTargetOpts.Field) { \ + if (Diags) \ + Diags->Report(diag::err_ast_file_targetopt_mismatch) \ + << Filename << Name << TargetOpts.Field << ExistingTargetOpts.Field; \ + return true; \ } // The triple and ABI must match exactly. @@ -438,31 +440,30 @@ static bool checkTargetOptions(const TargetOptions &TargetOpts, if (Diags) { for (StringRef Feature : UnmatchedReadFeatures) - Diags->Report(diag::err_pch_targetopt_feature_mismatch) - << /* is-existing-feature */ false << Feature; + Diags->Report(diag::err_ast_file_targetopt_feature_mismatch) + << /* is-existing-feature */ false << Filename << Feature; for (StringRef Feature : UnmatchedExistingFeatures) - Diags->Report(diag::err_pch_targetopt_feature_mismatch) - << /* is-existing-feature */ true << Feature; + Diags->Report(diag::err_ast_file_targetopt_feature_mismatch) + << /* is-existing-feature */ true << Filename << Feature; } return !UnmatchedReadFeatures.empty() || !UnmatchedExistingFeatures.empty(); } -bool -PCHValidator::ReadLanguageOptions(const LangOptions &LangOpts, - bool Complain, - bool AllowCompatibleDifferences) { +bool PCHValidator::ReadLanguageOptions(const LangOptions &LangOpts, + StringRef Filename, bool Complain, + bool AllowCompatibleDifferences) { const LangOptions &ExistingLangOpts = PP.getLangOpts(); - return checkLanguageOptions(LangOpts, ExistingLangOpts, + return checkLanguageOptions(LangOpts, ExistingLangOpts, Filename, Complain ? &Reader.Diags : nullptr, AllowCompatibleDifferences); } bool PCHValidator::ReadTargetOptions(const TargetOptions &TargetOpts, - bool Complain, + StringRef Filename, bool Complain, bool AllowCompatibleDifferences) { const TargetOptions &ExistingTargetOpts = PP.getTargetInfo().getTargetOpts(); - return checkTargetOptions(TargetOpts, ExistingTargetOpts, + return checkTargetOptions(TargetOpts, ExistingTargetOpts, Filename, Complain ? &Reader.Diags : nullptr, AllowCompatibleDifferences); } @@ -477,7 +478,7 @@ using DeclsMap = llvm::DenseMap<DeclarationName, SmallVector<NamedDecl *, 8>>; static bool checkDiagnosticGroupMappings(DiagnosticsEngine &StoredDiags, DiagnosticsEngine &Diags, - bool Complain) { + StringRef Filename, bool Complain) { using Level = DiagnosticsEngine::Level; // Check current mappings for new -Werror mappings, and the stored mappings @@ -495,8 +496,11 @@ static bool checkDiagnosticGroupMappings(DiagnosticsEngine &StoredDiags, StoredDiags.getDiagnosticLevel(DiagID, SourceLocation()); if (StoredLevel < DiagnosticsEngine::Error) { if (Complain) - Diags.Report(diag::err_pch_diagopt_mismatch) << "-Werror=" + - Diags.getDiagnosticIDs()->getWarningOptionForDiag(DiagID).str(); + Diags.Report(diag::err_ast_file_diagopt_mismatch) + << "-Werror=" + Diags.getDiagnosticIDs() + ->getWarningOptionForDiag(DiagID) + .str() + << Filename; return true; } } @@ -513,7 +517,8 @@ static bool isExtHandlingFromDiagsError(DiagnosticsEngine &Diags) { } static bool checkDiagnosticMappings(DiagnosticsEngine &StoredDiags, - DiagnosticsEngine &Diags, bool IsSystem, + DiagnosticsEngine &Diags, + StringRef Filename, bool IsSystem, bool SystemHeaderWarningsInModule, bool Complain) { // Top-level options @@ -525,32 +530,36 @@ static bool checkDiagnosticMappings(DiagnosticsEngine &StoredDiags, if (StoredDiags.getSuppressSystemWarnings() && !SystemHeaderWarningsInModule) { if (Complain) - Diags.Report(diag::err_pch_diagopt_mismatch) << "-Wsystem-headers"; + Diags.Report(diag::err_ast_file_diagopt_mismatch) + << "-Wsystem-headers" << Filename; return true; } } if (Diags.getWarningsAsErrors() && !StoredDiags.getWarningsAsErrors()) { if (Complain) - Diags.Report(diag::err_pch_diagopt_mismatch) << "-Werror"; + Diags.Report(diag::err_ast_file_diagopt_mismatch) + << "-Werror" << Filename; return true; } if (Diags.getWarningsAsErrors() && Diags.getEnableAllWarnings() && !StoredDiags.getEnableAllWarnings()) { if (Complain) - Diags.Report(diag::err_pch_diagopt_mismatch) << "-Weverything -Werror"; + Diags.Report(diag::err_ast_file_diagopt_mismatch) + << "-Weverything -Werror" << Filename; return true; } if (isExtHandlingFromDiagsError(Diags) && !isExtHandlingFromDiagsError(StoredDiags)) { if (Complain) - Diags.Report(diag::err_pch_diagopt_mismatch) << "-pedantic-errors"; + Diags.Report(diag::err_ast_file_diagopt_mismatch) + << "-pedantic-errors" << Filename; return true; } - return checkDiagnosticGroupMappings(StoredDiags, Diags, Complain); + return checkDiagnosticGroupMappings(StoredDiags, Diags, Filename, Complain); } /// Return the top import module if it is implicit, nullptr otherwise. @@ -579,7 +588,8 @@ static Module *getTopImportImplicitModule(ModuleManager &ModuleMgr, } bool PCHValidator::ReadDiagnosticOptions( - IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, bool Complain) { + IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, StringRef Filename, + bool Complain) { DiagnosticsEngine &ExistingDiags = PP.getDiagnostics(); IntrusiveRefCntPtr<DiagnosticIDs> DiagIDs(ExistingDiags.getDiagnosticIDs()); IntrusiveRefCntPtr<DiagnosticsEngine> Diags( @@ -604,8 +614,9 @@ bool PCHValidator::ReadDiagnosticOptions( // FIXME: if the diagnostics are incompatible, save a DiagnosticOptions that // contains the union of their flags. - return checkDiagnosticMappings(*Diags, ExistingDiags, TopM->IsSystem, - SystemHeaderWarningsInModule, Complain); + return checkDiagnosticMappings(*Diags, ExistingDiags, Filename, + TopM->IsSystem, SystemHeaderWarningsInModule, + Complain); } /// Collect the macro definitions provided by the given preprocessor @@ -664,8 +675,8 @@ enum OptionValidation { /// are no differences in the options between the two. static bool checkPreprocessorOptions( const PreprocessorOptions &PPOpts, - const PreprocessorOptions &ExistingPPOpts, bool ReadMacros, - DiagnosticsEngine *Diags, FileManager &FileMgr, + const PreprocessorOptions &ExistingPPOpts, StringRef Filename, + bool ReadMacros, DiagnosticsEngine *Diags, FileManager &FileMgr, std::string &SuggestedPredefines, const LangOptions &LangOpts, OptionValidation Validation = OptionValidateContradictions) { if (ReadMacros) { @@ -694,7 +705,8 @@ static bool checkPreprocessorOptions( // If strict matches are requested, don't tolerate any extra defines // on the command line that are missing in the AST file. if (Diags) { - Diags->Report(diag::err_pch_macro_def_undef) << MacroName << true; + Diags->Report(diag::err_ast_file_macro_def_undef) + << MacroName << true << Filename; } return true; } @@ -720,8 +732,8 @@ static bool checkPreprocessorOptions( // conflict. if (Existing.second != Known->second.second) { if (Diags) { - Diags->Report(diag::err_pch_macro_def_undef) - << MacroName << Known->second.second; + Diags->Report(diag::err_ast_file_macro_def_undef) + << MacroName << Known->second.second << Filename; } return true; } @@ -735,8 +747,8 @@ static bool checkPreprocessorOptions( // The macro bodies differ; complain. if (Diags) { - Diags->Report(diag::err_pch_macro_def_conflict) - << MacroName << Known->second.first << Existing.first; + Diags->Report(diag::err_ast_file_macro_def_conflict) + << MacroName << Known->second.first << Existing.first << Filename; } return true; } @@ -749,7 +761,8 @@ static bool checkPreprocessorOptions( // the AST file that are missing on the command line. for (const auto &MacroName : ASTFileMacros.keys()) { if (Diags) { - Diags->Report(diag::err_pch_macro_def_undef) << MacroName << false; + Diags->Report(diag::err_ast_file_macro_def_undef) + << MacroName << false << Filename; } return true; } @@ -760,7 +773,8 @@ static bool checkPreprocessorOptions( if (PPOpts.UsePredefines != ExistingPPOpts.UsePredefines && Validation != OptionValidateNone) { if (Diags) { - Diags->Report(diag::err_pch_undef) << ExistingPPOpts.UsePredefines; + Diags->Report(diag::err_ast_file_undef) + << ExistingPPOpts.UsePredefines << Filename; } return true; } @@ -770,7 +784,8 @@ static bool checkPreprocessorOptions( PPOpts.DetailedRecord != ExistingPPOpts.DetailedRecord && Validation != OptionValidateNone) { if (Diags) { - Diags->Report(diag::err_pch_pp_detailed_record) << PPOpts.DetailedRecord; + Diags->Report(diag::err_ast_file_pp_detailed_record) + << PPOpts.DetailedRecord << Filename; } return true; } @@ -814,20 +829,22 @@ static bool checkPreprocessorOptions( } bool PCHValidator::ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, - bool ReadMacros, bool Complain, + StringRef Filename, bool ReadMacros, + bool Complain, std::string &SuggestedPredefines) { const PreprocessorOptions &ExistingPPOpts = PP.getPreprocessorOpts(); - return checkPreprocessorOptions( - PPOpts, ExistingPPOpts, ReadMacros, Complain ? &Reader.Diags : nullptr, - PP.getFileManager(), SuggestedPredefines, PP.getLangOpts()); + return checkPreprocessorOptions(PPOpts, ExistingPPOpts, Filename, ReadMacros, + Complain ? &Reader.Diags : nullptr, + PP.getFileManager(), SuggestedPredefines, + PP.getLangOpts()); } bool SimpleASTReaderListener::ReadPreprocessorOptions( - const PreprocessorOptions &PPOpts, bool ReadMacros, bool Complain, - std::string &SuggestedPredefines) { - return checkPreprocessorOptions(PPOpts, PP.getPreprocessorOpts(), ReadMacros, - nullptr, PP.getFileManager(), + const PreprocessorOptions &PPOpts, StringRef Filename, bool ReadMacros, + bool Complain, std::string &SuggestedPredefines) { + return checkPreprocessorOptions(PPOpts, PP.getPreprocessorOpts(), Filename, + ReadMacros, nullptr, PP.getFileManager(), SuggestedPredefines, PP.getLangOpts(), OptionValidateNone); } @@ -839,7 +856,7 @@ bool SimpleASTReaderListener::ReadPreprocessorOptions( static bool checkModuleCachePath(llvm::vfs::FileSystem &VFS, StringRef SpecificModuleCachePath, StringRef ExistingModuleCachePath, - DiagnosticsEngine *Diags, + StringRef Filename, DiagnosticsEngine *Diags, const LangOptions &LangOpts, const PreprocessorOptions &PPOpts) { if (!LangOpts.Modules || PPOpts.AllowPCHWithDifferentModulesCachePath || @@ -850,18 +867,19 @@ static bool checkModuleCachePath(llvm::vfs::FileSystem &VFS, if (EqualOrErr && *EqualOrErr) return false; if (Diags) - Diags->Report(diag::err_pch_modulecache_mismatch) - << SpecificModuleCachePath << ExistingModuleCachePath; + Diags->Report(diag::err_ast_file_modulecache_mismatch) + << SpecificModuleCachePath << ExistingModuleCachePath << Filename; return true; } bool PCHValidator::ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, + StringRef Filename, StringRef SpecificModuleCachePath, bool Complain) { return checkModuleCachePath(Reader.getFileManager().getVirtualFileSystem(), SpecificModuleCachePath, PP.getHeaderSearchInfo().getModuleCachePath(), - Complain ? &Reader.Diags : nullptr, + Filename, Complain ? &Reader.Diags : nullptr, PP.getLangOpts(), PP.getPreprocessorOpts()); } @@ -2759,9 +2777,9 @@ static bool isDiagnosedResult(ASTReader::ASTReadResult ARR, unsigned Caps) { } ASTReader::ASTReadResult ASTReader::ReadOptionsBlock( - BitstreamCursor &Stream, unsigned ClientLoadCapabilities, - bool AllowCompatibleConfigurationMismatch, ASTReaderListener &Listener, - std::string &SuggestedPredefines) { + BitstreamCursor &Stream, StringRef Filename, + unsigned ClientLoadCapabilities, bool AllowCompatibleConfigurationMismatch, + ASTReaderListener &Listener, std::string &SuggestedPredefines) { if (llvm::Error Err = Stream.EnterSubBlock(OPTIONS_BLOCK_ID)) { // FIXME this drops errors on the floor. consumeError(std::move(Err)); @@ -2804,7 +2822,7 @@ ASTReader::ASTReadResult ASTReader::ReadOptionsBlock( switch ((OptionsRecordTypes)MaybeRecordType.get()) { case LANGUAGE_OPTIONS: { bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; - if (ParseLanguageOptions(Record, Complain, Listener, + if (ParseLanguageOptions(Record, Filename, Complain, Listener, AllowCompatibleConfigurationMismatch)) Result = ConfigurationMismatch; break; @@ -2812,7 +2830,7 @@ ASTReader::ASTReadResult ASTReader::ReadOptionsBlock( case TARGET_OPTIONS: { bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; - if (ParseTargetOptions(Record, Complain, Listener, + if (ParseTargetOptions(Record, Filename, Complain, Listener, AllowCompatibleConfigurationMismatch)) Result = ConfigurationMismatch; break; @@ -2829,7 +2847,7 @@ ASTReader::ASTReadResult ASTReader::ReadOptionsBlock( case HEADER_SEARCH_OPTIONS: { bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; if (!AllowCompatibleConfigurationMismatch && - ParseHeaderSearchOptions(Record, Complain, Listener)) + ParseHeaderSearchOptions(Record, Filename, Complain, Listener)) Result = ConfigurationMismatch; break; } @@ -2837,7 +2855,7 @@ ASTReader::ASTReadResult ASTReader::ReadOptionsBlock( case PREPROCESSOR_OPTIONS: bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; if (!AllowCompatibleConfigurationMismatch && - ParsePreprocessorOptions(Record, Complain, Listener, + ParsePreprocessorOptions(Record, Filename, Complain, Listener, SuggestedPredefines)) Result = ConfigurationMismatch; break; @@ -2974,7 +2992,7 @@ ASTReader::ReadControlBlock(ModuleFile &F, F.Kind == MK_ExplicitModule || F.Kind == MK_PrebuiltModule; ASTReadResult Result = - ReadOptionsBlock(Stream, ClientLoadCapabilities, + ReadOptionsBlock(Stream, F.FileName, ClientLoadCapabilities, AllowCompatibleConfigurationMismatch, *Listener, SuggestedPredefines); if (Result == Failure) { @@ -4863,8 +4881,8 @@ ASTReader::readUnhashedControlBlock(ModuleFile &F, bool WasImportedBy, bool DisableValidation = shouldDisableValidationForFile(F); ASTReadResult Result = readUnhashedControlBlockImpl( - &F, F.Data, ClientLoadCapabilities, AllowCompatibleConfigurationMismatch, - Listener.get(), + &F, F.Data, F.FileName, ClientLoadCapabilities, + AllowCompatibleConfigurationMismatch, Listener.get(), WasImportedBy ? false : HSOpts.ModulesValidateDiagnosticOptions); // If F was directly imported by another module, it's implicitly validated by @@ -4907,9 +4925,9 @@ ASTReader::readUnhashedControlBlock(ModuleFile &F, bool WasImportedBy, } ASTReader::ASTReadResult ASTReader::readUnhashedControlBlockImpl( - ModuleFile *F, llvm::StringRef StreamData, unsigned ClientLoadCapabilities, - bool AllowCompatibleConfigurationMismatch, ASTReaderListener *Listener, - bool ValidateDiagnosticOptions) { + ModuleFile *F, llvm::StringRef StreamData, StringRef Filename, + unsigned ClientLoadCapabilities, bool AllowCompatibleConfigurationMismatch, + ASTReaderListener *Listener, bool ValidateDiagnosticOptions) { // Initialize a stream. BitstreamCursor Stream(StreamData); @@ -4977,7 +4995,7 @@ ASTReader::ASTReadResult ASTReader::readUnhashedControlBlockImpl( bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0; if (Listener && ValidateDiagnosticOptions && !AllowCompatibleConfigurationMismatch && - ParseDiagnosticOptions(Record, Complain, *Listener)) + ParseDiagnosticOptions(Record, Filename, Complain, *Listener)) Result = OutOfDate; // Don't return early. Read the signature. break; } @@ -5364,32 +5382,37 @@ namespace { ExistingModuleCachePath(ExistingModuleCachePath), FileMgr(FileMgr), StrictOptionMatches(StrictOptionMatches) {} - bool ReadLanguageOptions(const LangOptions &LangOpts, bool Complain, + bool ReadLanguageOptions(const LangOptions &LangOpts, StringRef Filename, + bool Complain, bool AllowCompatibleDifferences) override { - return checkLanguageOptions(ExistingLangOpts, LangOpts, nullptr, + return checkLanguageOptions(ExistingLangOpts, LangOpts, Filename, nullptr, AllowCompatibleDifferences); } - bool ReadTargetOptions(const TargetOptions &TargetOpts, bool Complain, + bool ReadTargetOptions(const TargetOptions &TargetOpts, StringRef Filename, + bool Complain, bool AllowCompatibleDifferences) override { - return checkTargetOptions(ExistingTargetOpts, TargetOpts, nullptr, - AllowCompatibleDifferences); + return checkTargetOptions(ExistingTargetOpts, TargetOpts, Filename, + nullptr, AllowCompatibleDifferences); } bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, + StringRef Filename, StringRef SpecificModuleCachePath, bool Complain) override { - return checkModuleCachePath( - FileMgr.getVirtualFileSystem(), SpecificModuleCachePath, - ExistingModuleCachePath, nullptr, ExistingLangOpts, ExistingPPOpts); + return checkModuleCachePath(FileMgr.getVirtualFileSystem(), + SpecificModuleCachePath, + ExistingModuleCachePath, Filename, nullptr, + ExistingLangOpts, ExistingPPOpts); } bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, - bool ReadMacros, bool Complain, + StringRef Filename, bool ReadMacros, + bool Complain, std::string &SuggestedPredefines) override { return checkPreprocessorOptions( - PPOpts, ExistingPPOpts, ReadMacros, /*Diags=*/nullptr, FileMgr, - SuggestedPredefines, ExistingLangOpts, + PPOpts, ExistingPPOpts, Filename, ReadMacros, /*Diags=*/nullptr, + FileMgr, SuggestedPredefines, ExistingLangOpts, StrictOptionMatches ? OptionValidateStrictMatches : OptionValidateContradictions); } @@ -5457,7 +5480,7 @@ bool ASTReader::readASTFileControlBlock( switch (Entry.ID) { case OPTIONS_BLOCK_ID: { std::string IgnoredSuggestedPredefines; - if (ReadOptionsBlock(Stream, ClientLoadCapabilities, + if (ReadOptionsBlock(Stream, Filename, ClientLoadCapabilities, /*AllowCompatibleConfigurationMismatch*/ false, Listener, IgnoredSuggestedPredefines) != Success) return true; @@ -5683,7 +5706,7 @@ bool ASTReader::readASTFileControlBlock( // Scan for the UNHASHED_CONTROL_BLOCK_ID block. if (readUnhashedControlBlockImpl( - nullptr, Bytes, ClientLoadCapabilities, + nullptr, Bytes, Filename, ClientLoadCapabilities, /*AllowCompatibleConfigurationMismatch*/ false, &Listener, ValidateDiagnosticOptions) != Success) return true; @@ -6024,7 +6047,7 @@ llvm::Error ASTReader::ReadSubmoduleBlock(ModuleFile &F, /// /// \returns true if the listener deems the file unacceptable, false otherwise. bool ASTReader::ParseLanguageOptions(const RecordData &Record, - bool Complain, + StringRef Filename, bool Complain, ASTReaderListener &Listener, bool AllowCompatibleDifferences) { LangOptions LangOpts; @@ -6061,12 +6084,12 @@ bool ASTReader::ParseLanguageOptions(const RecordData &Record, LangOpts.OMPHostIRFile = ReadString(Record, Idx); - return Listener.ReadLanguageOptions(LangOpts, Complain, + return Listener.ReadLanguageOptions(LangOpts, Filename, Complain, AllowCompatibleDifferences); } -bool ASTReader::ParseTargetOptions(const RecordData &Record, bool Complain, - ASTReaderListener &Listener, +bool ASTReader::ParseTargetOptions(const RecordData &Record, StringRef Filename, + bool Complain, ASTReaderListener &Listener, bool AllowCompatibleDifferences) { unsigned Idx = 0; TargetOptions TargetOpts; @@ -6081,11 +6104,12 @@ bool ASTReader::ParseTargetOptions(const RecordData &Record, bool Complain, TargetOpts.Features.push_back(ReadString(Record, Idx)); } - return Listener.ReadTargetOptions(TargetOpts, Complain, + return Listener.ReadTargetOptions(TargetOpts, Filename, Complain, AllowCompatibleDifferences); } -bool ASTReader::ParseDiagnosticOptions(const RecordData &Record, bool Complain, +bool ASTReader::ParseDiagnosticOptions(const RecordData &Record, + StringRef Filename, bool Complain, ASTReaderListener &Listener) { IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts(new DiagnosticOptions); unsigned Idx = 0; @@ -6099,7 +6123,7 @@ bool ASTReader::ParseDiagnosticOptions(const RecordData &Record, bool Complain, for (unsigned N = Record[Idx++]; N; --N) DiagOpts->Remarks.push_back(ReadString(Record, Idx)); - return Listener.ReadDiagnosticOptions(DiagOpts, Complain); + return Listener.ReadDiagnosticOptions(DiagOpts, Filename, Complain); } bool ASTReader::ParseFileSystemOptions(const RecordData &Record, bool Complain, @@ -6111,7 +6135,7 @@ bool ASTReader::ParseFileSystemOptions(const RecordData &Record, bool Complain, } bool ASTReader::ParseHeaderSearchOptions(const RecordData &Record, - bool Complain, + StringRef Filename, bool Complain, ASTReaderListener &Listener) { HeaderSearchOptions HSOpts; unsigned Idx = 0; @@ -6130,8 +6154,8 @@ bool ASTReader::ParseHeaderSearchOptions(const RecordData &Record, HSOpts.UseLibcxx = Record[Idx++]; std::string SpecificModuleCachePath = ReadString(Record, Idx); - return Listener.ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath, - Complain); + return Listener.ReadHeaderSearchOptions(HSOpts, Filename, + SpecificModuleCachePath, Complain); } bool ASTReader::ParseHeaderSearchPaths(const RecordData &Record, bool Complain, @@ -6167,7 +6191,7 @@ bool ASTReader::ParseHeaderSearchPaths(const RecordData &Record, bool Complain, } bool ASTReader::ParsePreprocessorOptions(const RecordData &Record, - bool Complain, + StringRef Filename, bool Complain, ASTReaderListener &Listener, std::string &SuggestedPredefines) { PreprocessorOptions PPOpts; @@ -6199,8 +6223,8 @@ bool ASTReader::ParsePreprocessorOptions(const RecordData &Record, PPOpts.ObjCXXARCStandardLibrary = static_cast<ObjCXXARCStandardLibraryKind>(Record[Idx++]); SuggestedPredefines.clear(); - return Listener.ReadPreprocessorOptions(PPOpts, ReadMacros, Complain, - SuggestedPredefines); + return Listener.ReadPreprocessorOptions(PPOpts, Filename, ReadMacros, + Complain, SuggestedPredefines); } std::pair<ModuleFile *, unsigned> diff --git a/clang/test/Modules/check-for-sanitizer-feature.cpp b/clang/test/Modules/check-for-sanitizer-feature.cpp index 2137b1bf36bb8..861b571f0efaa 100644 --- a/clang/test/Modules/check-for-sanitizer-feature.cpp +++ b/clang/test/Modules/check-for-sanitizer-feature.cpp @@ -43,7 +43,7 @@ // // Import the PCH without ASan enabled (we expect an error). // RUN: not %clang_cc1 -x c -include-pch %t.asan_pch %s -verify 2>&1 | FileCheck %s --check-prefix=PCH_MISMATCH -// PCH_MISMATCH: AST file was compiled with the target feature '-fsanitize=address' but the current translation unit is not +// PCH_MISMATCH: AST file '{{.*}}.asan_pch' was compiled with the target feature '-fsanitize=address' but the current translation unit is not // // Emit a PCH with UBSan enabled. // RUN: %clang_cc1 -x c -fsanitize=null %S/Inputs/check-for-sanitizer-feature/check.h -emit-pch -o %t.ubsan_pch diff --git a/clang/test/Modules/ignored_macros.m b/clang/test/Modules/ignored_macros.m index a87a11f89c314..33801dfa4f476 100644 --- a/clang/test/Modules/ignored_macros.m +++ b/clang/test/Modules/ignored_macros.m @@ -10,7 +10,7 @@ // RUN: %clang_cc1 -fmodules-cache-path=%t.modules -fmodules -fimplicit-module-maps -I %S/Inputs -emit-pch -o %t.pch -x objective-c-header %s -verify // RUN: not %clang_cc1 -fmodules-cache-path=%t.modules -DIGNORED=1 -fmodules -fimplicit-module-maps -I %S/Inputs -include-pch %t.pch %s > %t.err 2>&1 // RUN: FileCheck -check-prefix=CHECK-CONFLICT %s < %t.err -// CHECK-CONFLICT: PCH was compiled with module cache path +// CHECK-CONFLICT: AST file '{{.*}}' was compiled with module cache path // Third trial: pass -DIGNORED=1 only to the second invocation, but // make it ignored. There should be no failure, IGNORED is defined in diff --git a/clang/test/Modules/load_failure.c b/clang/test/Modules/load_failure.c index 3a8d29597348d..662b39b6f1874 100644 --- a/clang/test/Modules/load_failure.c +++ b/clang/test/Modules/load_failure.c @@ -15,7 +15,7 @@ // RUN: FileCheck -check-prefix=CHECK-FAILURE %s < %t.out // FIXME: Clean up diagnostic text below and give it a location -// CHECK-FAILURE: error: C99 was disabled in PCH file but is currently enabled +// CHECK-FAILURE: error: C99 was disabled in AST file '{{.*}}load_failure.pcm' but is currently enabled // FIXME: When we have a syntax for modules in C, use that. diff --git a/clang/test/Modules/merge-target-features.cpp b/clang/test/Modules/merge-target-features.cpp index 6a29c2db8a8d9..cc2bbfa077e98 100644 --- a/clang/test/Modules/merge-target-features.cpp +++ b/clang/test/Modules/merge-target-features.cpp @@ -20,7 +20,7 @@ // RUN: -target-cpu i386 \ // RUN: -fsyntax-only merge-target-features.cpp 2>&1 \ // RUN: | FileCheck --check-prefix=SUBSET --implicit-check-not=error: %s -// SUBSET: error: AST file was compiled with the target feature '+sse2' but the current translation unit is not +// SUBSET: error: AST file '{{.*}}foo.pcm' was compiled with the target feature '+sse2' but the current translation unit is not // SUBSET: error: {{.*}} configuration mismatch // // RUN: %clang_cc1 -fmodules -x c++ -fmodules-cache-path=%t \ @@ -57,8 +57,8 @@ // RUN: -target-cpu i386 -target-feature +cx16 \ // RUN: -fsyntax-only merge-target-features.cpp 2>&1 \ // RUN: | FileCheck --check-prefix=MISMATCH --implicit-check-not=error: %s -// MISMATCH: error: AST file was compiled with the target feature '+sse2' but the current translation unit is not -// MISMATCH: error: current translation unit is compiled with the target feature '+cx16' but the AST file was not +// MISMATCH: error: AST file '{{.*}}foo.pcm' was compiled with the target feature '+sse2' but the current translation unit is not +// MISMATCH: error: current translation unit is compiled with the target feature '+cx16' but the AST file '{{.*}}foo.pcm' was not // MISMATCH: error: {{.*}} configuration mismatch #include "foo.h" diff --git a/clang/test/Modules/mismatch-diagnostics.cpp b/clang/test/Modules/mismatch-diagnostics.cpp index 5a026aa1f6c02..dffd4b46a678e 100644 --- a/clang/test/Modules/mismatch-diagnostics.cpp +++ b/clang/test/Modules/mismatch-diagnostics.cpp @@ -29,5 +29,5 @@ export module mismatching_module; //--- use.cpp import mismatching_module; -// CHECK: error: POSIX thread support was enabled in PCH file but is currently disabled +// CHECK: error: POSIX thread support was enabled in AST file '{{.*[/|\\\\]}}mismatching_module.pcm' but is currently disabled // CHECK-NEXT: module file {{.*[/|\\\\]}}mismatching_module.pcm cannot be loaded due to a configuration mismatch with the current compilation diff --git a/clang/test/Modules/module-pch-different-cache-path.c b/clang/test/Modules/module-pch-different-cache-path.c index 8778adc886f71..8dd04a166eab6 100644 --- a/clang/test/Modules/module-pch-different-cache-path.c +++ b/clang/test/Modules/module-pch-different-cache-path.c @@ -14,5 +14,5 @@ pch_int x = 0; -// CHECK-ERROR: PCH was compiled with module cache path '{{.*}}', but the path is currently '{{.*}}' -// CHECK-SUCCESS-NOT: PCH was compiled with module cache path '{{.*}}', but the path is currently '{{.*}}' +// CHECK-ERROR: AST file '{{.*}}' was compiled with module cache path '{{.*}}', but the path is currently '{{.*}}' +// CHECK-SUCCESS-NOT: AST file '{{.*}}' was compiled with module cache path '{{.*}}', but the path is currently '{{.*}}' diff --git a/clang/test/Modules/pr62359.cppm b/clang/test/Modules/pr62359.cppm index 69acc3ce303a5..7d9d3eec26cca 100644 --- a/clang/test/Modules/pr62359.cppm +++ b/clang/test/Modules/pr62359.cppm @@ -43,7 +43,7 @@ int use() { return 0; } -// CHECK: OpenMP{{.*}}differs in PCH file vs. current file +// CHECK: OpenMP{{.*}}differs in AST file '{{.*}}Hello.pcm' vs. current file //--- use2.cpp // expected-no-diagnostics @@ -55,5 +55,5 @@ int use2() { return 0; } -// CHECK: OpenMP{{.*}}differs in PCH file vs. current file +// CHECK: OpenMP{{.*}}differs in AST file '{{.*}}Hello.pcm' vs. current file // CHECK: use of undeclared identifier 'pragma' diff --git a/clang/test/PCH/arc.m b/clang/test/PCH/arc.m index 32069e2314164..e4ad71a469b95 100644 --- a/clang/test/PCH/arc.m +++ b/clang/test/PCH/arc.m @@ -14,5 +14,5 @@ array0 a0; array1 a1; -// CHECK-ERR1: Objective-C automated reference counting was enabled in PCH file but is currently disabled -// CHECK-ERR2: Objective-C automated reference counting was disabled in PCH file but is currently enabled +// CHECK-ERR1: Objective-C automated reference counting was enabled in AST file '{{.*}}' but is currently disabled +// CHECK-ERR2: Objective-C automated reference counting was disabled in AST file '{{.*}}' but is currently enabled diff --git a/clang/test/PCH/fuzzy-pch.c b/clang/test/PCH/fuzzy-pch.c index 7296d1dc893b3..53985866dc08e 100644 --- a/clang/test/PCH/fuzzy-pch.c +++ b/clang/test/PCH/fuzzy-pch.c @@ -24,8 +24,8 @@ BAR bar = 17; # error BAR was not defined #endif -// CHECK-FOO: definition of macro 'FOO' differs between the precompiled header ('1') and the command line ('blah') -// CHECK-NOFOO: macro 'FOO' was defined in the precompiled header but undef'd on the command line +// CHECK-FOO: definition of macro 'FOO' differs between the AST file '{{.*}}' ('1') and the command line ('blah') +// CHECK-NOFOO: macro 'FOO' was defined in the AST file '{{.*}}' but undef'd on the command line -// CHECK-UNDEF: command line contains '-undef' but precompiled header was not built with it +// CHECK-UNDEF: command line contains '-undef' but AST file '{{.*}}' was not built with it diff --git a/clang/test/PCH/module-hash-difference.m b/clang/test/PCH/module-hash-difference.m index fc542b0e8d1ad..73cf536f88b4f 100644 --- a/clang/test/PCH/module-hash-difference.m +++ b/clang/test/PCH/module-hash-difference.m @@ -4,5 +4,5 @@ // RUN: not %clang_cc1 -fsyntax-only -include-pch %t.pch %s -I %S/Inputs/modules -fmodules -fimplicit-module-maps -fmodules-cache-path=%t.mcp -fdisable-module-hash 2> %t.err // RUN: FileCheck -input-file=%t.err %s -// CHECK: error: PCH was compiled with module cache path {{.*}}, but the path is currently {{.*}} +// CHECK: error: AST file '{{.*}}' was compiled with module cache path {{.*}}, but the path is currently {{.*}} @import Foo; diff --git a/clang/test/PCH/ms-pch-macro.c b/clang/test/PCH/ms-pch-macro.c index a512e66e24866..4d4900cc4f90d 100644 --- a/clang/test/PCH/ms-pch-macro.c +++ b/clang/test/PCH/ms-pch-macro.c @@ -33,7 +33,7 @@ BAR bar = 17; # error BAR was not defined #endif -// CHECK-FOO: definition of macro 'FOO' differs between the precompiled header ('1') and the command line ('blah') -// CHECK-NOFOO: macro 'FOO' was defined in the precompiled header but undef'd on the command line +// CHECK-FOO: definition of macro 'FOO' differs between the AST file '{{.*}}1.pch' ('1') and the command line ('blah') +// CHECK-NOFOO: macro 'FOO' was defined in the AST file '{{.*}}1.pch' but undef'd on the command line // expected-warning@2 {{definition of macro 'BAR' does not match definition in precompiled header}} diff --git a/clang/test/PCH/no-validate-pch.cl b/clang/test/PCH/no-validate-pch.cl index 26c5fd5cc04c2..aa228ee205219 100644 --- a/clang/test/PCH/no-validate-pch.cl +++ b/clang/test/PCH/no-validate-pch.cl @@ -16,8 +16,8 @@ // CHECK: note: previous definition is here // CHECK: #define X 4 -// CHECK-VAL: error: __OPTIMIZE__ predefined macro was enabled in PCH file but is currently disabled -// CHECK-VAL: error: definition of macro 'X' differs between the precompiled header ('4') and the command line ('5') +// CHECK-VAL: error: __OPTIMIZE__ predefined macro was enabled in AST file '{{.*}}' but is currently disabled +// CHECK-VAL: error: definition of macro 'X' differs between the AST file '{{.*}}' ('4') and the command line ('5') void test(void) { int a = ONE; >From 8b96499c3c1a60bdd51dc7bb611864bd081d9cf9 Mon Sep 17 00:00:00 2001 From: Volodymyr Sapsai <vsap...@apple.com> Date: Fri, 2 Aug 2024 11:43:14 -0300 Subject: [PATCH 2/3] Add a missing file with changes. --- clang/lib/Frontend/FrontendActions.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/clang/lib/Frontend/FrontendActions.cpp b/clang/lib/Frontend/FrontendActions.cpp index e70210d55fe28..5e5769a6c3e79 100644 --- a/clang/lib/Frontend/FrontendActions.cpp +++ b/clang/lib/Frontend/FrontendActions.cpp @@ -622,7 +622,8 @@ namespace { Out.indent(2) << "Module map file: " << ModuleMapPath << "\n"; } - bool ReadLanguageOptions(const LangOptions &LangOpts, bool Complain, + bool ReadLanguageOptions(const LangOptions &LangOpts, StringRef Filename, + bool Complain, bool AllowCompatibleDifferences) override { Out.indent(2) << "Language options:\n"; #define LANGOPT(Name, Bits, Default, Description) \ @@ -645,7 +646,8 @@ namespace { return false; } - bool ReadTargetOptions(const TargetOptions &TargetOpts, bool Complain, + bool ReadTargetOptions(const TargetOptions &TargetOpts, StringRef Filename, + bool Complain, bool AllowCompatibleDifferences) override { Out.indent(2) << "Target options:\n"; Out.indent(4) << " Triple: " << TargetOpts.Triple << "\n"; @@ -665,7 +667,7 @@ namespace { } bool ReadDiagnosticOptions(IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, - bool Complain) override { + StringRef Filename, bool Complain) override { Out.indent(2) << "Diagnostic options:\n"; #define DIAGOPT(Name, Bits, Default) DUMP_BOOLEAN(DiagOpts->Name, #Name); #define ENUM_DIAGOPT(Name, Type, Bits, Default) \ @@ -684,6 +686,7 @@ namespace { } bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, + StringRef Filename, StringRef SpecificModuleCachePath, bool Complain) override { Out.indent(2) << "Header search options:\n"; @@ -717,7 +720,8 @@ namespace { } bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, - bool ReadMacros, bool Complain, + StringRef Filename, bool ReadMacros, + bool Complain, std::string &SuggestedPredefines) override { Out.indent(2) << "Preprocessor options:\n"; DUMP_BOOLEAN(PPOpts.UsePredefines, >From 255b7179c9c708355f4217c7f85ea234ac94c59f Mon Sep 17 00:00:00 2001 From: Volodymyr Sapsai <vsap...@apple.com> Date: Fri, 2 Aug 2024 16:46:11 -0300 Subject: [PATCH 3/3] Undo formatting changes to simplify reviewing. --- clang/include/clang/Serialization/ASTReader.h | 82 +++---- clang/lib/Frontend/ASTUnit.cpp | 10 +- clang/lib/Frontend/FrontendActions.cpp | 10 +- clang/lib/Serialization/ASTReader.cpp | 229 ++++++++---------- 4 files changed, 152 insertions(+), 179 deletions(-) diff --git a/clang/include/clang/Serialization/ASTReader.h b/clang/include/clang/Serialization/ASTReader.h index 7bbb64c138817..7b878554c97d8 100644 --- a/clang/include/clang/Serialization/ASTReader.h +++ b/clang/include/clang/Serialization/ASTReader.h @@ -130,7 +130,8 @@ class ASTReaderListener { /// /// \returns true to indicate the options are invalid or false otherwise. virtual bool ReadLanguageOptions(const LangOptions &LangOpts, - StringRef Filename, bool Complain, + StringRef Filename, + bool Complain, bool AllowCompatibleDifferences) { return false; } @@ -139,8 +140,7 @@ class ASTReaderListener { /// /// \returns true to indicate the target options are invalid, or false /// otherwise. - virtual bool ReadTargetOptions(const TargetOptions &TargetOpts, - StringRef Filename, bool Complain, + virtual bool ReadTargetOptions(const TargetOptions &TargetOpts, StringRef Filename, bool Complain, bool AllowCompatibleDifferences) { return false; } @@ -151,7 +151,8 @@ class ASTReaderListener { /// otherwise. virtual bool ReadDiagnosticOptions(IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, - StringRef Filename, bool Complain) { + StringRef Filename, + bool Complain) { return false; } @@ -202,8 +203,8 @@ class ASTReaderListener { /// \returns true to indicate the preprocessor options are invalid, or false /// otherwise. virtual bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, - StringRef Filename, bool ReadMacros, - bool Complain, + StringRef Filename, + bool ReadMacros, bool Complain, std::string &SuggestedPredefines) { return false; } @@ -265,14 +266,13 @@ class ChainedASTReaderListener : public ASTReaderListener { bool ReadFullVersionInformation(StringRef FullVersion) override; void ReadModuleName(StringRef ModuleName) override; void ReadModuleMapFile(StringRef ModuleMapPath) override; - bool ReadLanguageOptions(const LangOptions &LangOpts, StringRef Filename, - bool Complain, + bool ReadLanguageOptions(const LangOptions &LangOpts, StringRef Filename, bool Complain, bool AllowCompatibleDifferences) override; - bool ReadTargetOptions(const TargetOptions &TargetOpts, StringRef Filename, - bool Complain, + bool ReadTargetOptions(const TargetOptions &TargetOpts, StringRef Filename, bool Complain, bool AllowCompatibleDifferences) override; bool ReadDiagnosticOptions(IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, - StringRef Filename, bool Complain) override; + StringRef Filename, + bool Complain) override; bool ReadFileSystemOptions(const FileSystemOptions &FSOpts, bool Complain) override; @@ -281,8 +281,8 @@ class ChainedASTReaderListener : public ASTReaderListener { StringRef SpecificModuleCachePath, bool Complain) override; bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, - StringRef Filename, bool ReadMacros, - bool Complain, + StringRef Filename, + bool ReadMacros, bool Complain, std::string &SuggestedPredefines) override; void ReadCounter(const serialization::ModuleFile &M, unsigned Value) override; @@ -306,17 +306,16 @@ class PCHValidator : public ASTReaderListener { PCHValidator(Preprocessor &PP, ASTReader &Reader) : PP(PP), Reader(Reader) {} - bool ReadLanguageOptions(const LangOptions &LangOpts, StringRef Filename, - bool Complain, + bool ReadLanguageOptions(const LangOptions &LangOpts, StringRef Filename, bool Complain, bool AllowCompatibleDifferences) override; - bool ReadTargetOptions(const TargetOptions &TargetOpts, StringRef Filename, - bool Complain, + bool ReadTargetOptions(const TargetOptions &TargetOpts, StringRef Filename, bool Complain, bool AllowCompatibleDifferences) override; bool ReadDiagnosticOptions(IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, - StringRef Filename, bool Complain) override; + StringRef Filename, + bool Complain) override; bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, - StringRef Filename, bool ReadMacros, - bool Complain, + StringRef Filename, + bool ReadMacros, bool Complain, std::string &SuggestedPredefines) override; bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, StringRef Filename, @@ -336,8 +335,8 @@ class SimpleASTReaderListener : public ASTReaderListener { SimpleASTReaderListener(Preprocessor &PP) : PP(PP) {} bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, - StringRef Filename, bool ReadMacros, - bool Complain, + StringRef Filename, + bool ReadMacros, bool Complain, std::string &SuggestedPredefines) override; }; @@ -1373,12 +1372,10 @@ class ASTReader SmallVectorImpl<ImportedModule> &Loaded, const ModuleFile *ImportedBy, unsigned ClientLoadCapabilities); - static ASTReadResult - ReadOptionsBlock(llvm::BitstreamCursor &Stream, StringRef Filename, - unsigned ClientLoadCapabilities, - bool AllowCompatibleConfigurationMismatch, - ASTReaderListener &Listener, - std::string &SuggestedPredefines); + static ASTReadResult ReadOptionsBlock( + llvm::BitstreamCursor &Stream, StringRef Filename, unsigned ClientLoadCapabilities, + bool AllowCompatibleConfigurationMismatch, ASTReaderListener &Listener, + std::string &SuggestedPredefines); /// Read the unhashed control block. /// @@ -1387,11 +1384,13 @@ class ASTReader ASTReadResult readUnhashedControlBlock(ModuleFile &F, bool WasImportedBy, unsigned ClientLoadCapabilities); - static ASTReadResult readUnhashedControlBlockImpl( - ModuleFile *F, llvm::StringRef StreamData, StringRef Filename, - unsigned ClientLoadCapabilities, - bool AllowCompatibleConfigurationMismatch, ASTReaderListener *Listener, - bool ValidateDiagnosticOptions); + static ASTReadResult + readUnhashedControlBlockImpl(ModuleFile *F, llvm::StringRef StreamData, + StringRef Filename, + unsigned ClientLoadCapabilities, + bool AllowCompatibleConfigurationMismatch, + ASTReaderListener *Listener, + bool ValidateDiagnosticOptions); llvm::Error ReadASTBlock(ModuleFile &F, unsigned ClientLoadCapabilities); llvm::Error ReadExtensionBlock(ModuleFile &F); @@ -1404,24 +1403,21 @@ class ASTReader unsigned ClientLoadCapabilities); llvm::Error ReadSubmoduleBlock(ModuleFile &F, unsigned ClientLoadCapabilities); - static bool ParseLanguageOptions(const RecordData &Record, StringRef Filename, - bool Complain, ASTReaderListener &Listener, + static bool ParseLanguageOptions(const RecordData &Record, StringRef Filename, bool Complain, + ASTReaderListener &Listener, bool AllowCompatibleDifferences); - static bool ParseTargetOptions(const RecordData &Record, StringRef Filename, - bool Complain, ASTReaderListener &Listener, + static bool ParseTargetOptions(const RecordData &Record, StringRef Filename, bool Complain, + ASTReaderListener &Listener, bool AllowCompatibleDifferences); - static bool ParseDiagnosticOptions(const RecordData &Record, - StringRef Filename, bool Complain, + static bool ParseDiagnosticOptions(const RecordData &Record, StringRef Filename, bool Complain, ASTReaderListener &Listener); static bool ParseFileSystemOptions(const RecordData &Record, bool Complain, ASTReaderListener &Listener); - static bool ParseHeaderSearchOptions(const RecordData &Record, - StringRef Filename, bool Complain, + static bool ParseHeaderSearchOptions(const RecordData &Record, StringRef Filename, bool Complain, ASTReaderListener &Listener); static bool ParseHeaderSearchPaths(const RecordData &Record, bool Complain, ASTReaderListener &Listener); - static bool ParsePreprocessorOptions(const RecordData &Record, - StringRef Filename, bool Complain, + static bool ParsePreprocessorOptions(const RecordData &Record, StringRef Filename, bool Complain, ASTReaderListener &Listener, std::string &SuggestedPredefines); diff --git a/clang/lib/Frontend/ASTUnit.cpp b/clang/lib/Frontend/ASTUnit.cpp index 877772cc74429..ce22268d76e31 100644 --- a/clang/lib/Frontend/ASTUnit.cpp +++ b/clang/lib/Frontend/ASTUnit.cpp @@ -536,8 +536,7 @@ class ASTInfoCollector : public ASTReaderListener { LangOpt(LangOpt), TargetOpts(TargetOpts), Target(Target), Counter(Counter) {} - bool ReadLanguageOptions(const LangOptions &LangOpts, StringRef Filename, - bool Complain, + bool ReadLanguageOptions(const LangOptions &LangOpts, StringRef Filename, bool Complain, bool AllowCompatibleDifferences) override { if (InitializedLanguage) return false; @@ -599,15 +598,14 @@ class ASTInfoCollector : public ASTReaderListener { } bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, - StringRef Filename, bool ReadMacros, - bool Complain, + StringRef Filename, + bool ReadMacros, bool Complain, std::string &SuggestedPredefines) override { this->PPOpts = PPOpts; return false; } - bool ReadTargetOptions(const TargetOptions &TargetOpts, StringRef Filename, - bool Complain, + bool ReadTargetOptions(const TargetOptions &TargetOpts, StringRef Filename, bool Complain, bool AllowCompatibleDifferences) override { // If we've already initialized the target, don't do it again. if (Target) diff --git a/clang/lib/Frontend/FrontendActions.cpp b/clang/lib/Frontend/FrontendActions.cpp index 5e5769a6c3e79..164f361ff05d9 100644 --- a/clang/lib/Frontend/FrontendActions.cpp +++ b/clang/lib/Frontend/FrontendActions.cpp @@ -622,8 +622,7 @@ namespace { Out.indent(2) << "Module map file: " << ModuleMapPath << "\n"; } - bool ReadLanguageOptions(const LangOptions &LangOpts, StringRef Filename, - bool Complain, + bool ReadLanguageOptions(const LangOptions &LangOpts, StringRef Filename, bool Complain, bool AllowCompatibleDifferences) override { Out.indent(2) << "Language options:\n"; #define LANGOPT(Name, Bits, Default, Description) \ @@ -646,8 +645,7 @@ namespace { return false; } - bool ReadTargetOptions(const TargetOptions &TargetOpts, StringRef Filename, - bool Complain, + bool ReadTargetOptions(const TargetOptions &TargetOpts, StringRef Filename, bool Complain, bool AllowCompatibleDifferences) override { Out.indent(2) << "Target options:\n"; Out.indent(4) << " Triple: " << TargetOpts.Triple << "\n"; @@ -720,8 +718,8 @@ namespace { } bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, - StringRef Filename, bool ReadMacros, - bool Complain, + StringRef Filename, + bool ReadMacros, bool Complain, std::string &SuggestedPredefines) override { Out.indent(2) << "Preprocessor options:\n"; DUMP_BOOLEAN(PPOpts.UsePredefines, diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index 2aa3fcc036f05..4d3797a6a2e94 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -171,9 +171,11 @@ void ChainedASTReaderListener::ReadModuleMapFile(StringRef ModuleMapPath) { Second->ReadModuleMapFile(ModuleMapPath); } -bool ChainedASTReaderListener::ReadLanguageOptions( - const LangOptions &LangOpts, StringRef Filename, bool Complain, - bool AllowCompatibleDifferences) { +bool +ChainedASTReaderListener::ReadLanguageOptions(const LangOptions &LangOpts, + StringRef Filename, + bool Complain, + bool AllowCompatibleDifferences) { return First->ReadLanguageOptions(LangOpts, Filename, Complain, AllowCompatibleDifferences) || Second->ReadLanguageOptions(LangOpts, Filename, Complain, @@ -190,8 +192,7 @@ bool ChainedASTReaderListener::ReadTargetOptions( } bool ChainedASTReaderListener::ReadDiagnosticOptions( - IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, StringRef Filename, - bool Complain) { + IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, StringRef Filename, bool Complain) { return First->ReadDiagnosticOptions(DiagOpts, Filename, Complain) || Second->ReadDiagnosticOptions(DiagOpts, Filename, Complain); } @@ -204,17 +205,17 @@ ChainedASTReaderListener::ReadFileSystemOptions(const FileSystemOptions &FSOpts, } bool ChainedASTReaderListener::ReadHeaderSearchOptions( - const HeaderSearchOptions &HSOpts, StringRef Filename, - StringRef SpecificModuleCachePath, bool Complain) { - return First->ReadHeaderSearchOptions(HSOpts, Filename, - SpecificModuleCachePath, Complain) || - Second->ReadHeaderSearchOptions(HSOpts, Filename, - SpecificModuleCachePath, Complain); + const HeaderSearchOptions &HSOpts, StringRef Filename, StringRef SpecificModuleCachePath, + bool Complain) { + return First->ReadHeaderSearchOptions(HSOpts, Filename, SpecificModuleCachePath, + Complain) || + Second->ReadHeaderSearchOptions(HSOpts, Filename, SpecificModuleCachePath, + Complain); } bool ChainedASTReaderListener::ReadPreprocessorOptions( - const PreprocessorOptions &PPOpts, StringRef Filename, bool ReadMacros, - bool Complain, std::string &SuggestedPredefines) { + const PreprocessorOptions &PPOpts, StringRef Filename, bool ReadMacros, bool Complain, + std::string &SuggestedPredefines) { return First->ReadPreprocessorOptions(PPOpts, Filename, ReadMacros, Complain, SuggestedPredefines) || Second->ReadPreprocessorOptions(PPOpts, Filename, ReadMacros, Complain, @@ -283,34 +284,33 @@ static bool checkLanguageOptions(const LangOptions &LangOpts, const LangOptions &ExistingLangOpts, StringRef Filename, DiagnosticsEngine *Diags, bool AllowCompatibleDifferences = true) { -#define LANGOPT(Name, Bits, Default, Description) \ - if (ExistingLangOpts.Name != LangOpts.Name) { \ - if (Diags) { \ - if (Bits == 1) \ - Diags->Report(diag::err_ast_file_langopt_mismatch) \ - << Description << LangOpts.Name << ExistingLangOpts.Name \ - << Filename; \ - else \ - Diags->Report(diag::err_ast_file_langopt_value_mismatch) \ - << Description << Filename; \ - } \ - return true; \ - } - -#define VALUE_LANGOPT(Name, Bits, Default, Description) \ - if (ExistingLangOpts.Name != LangOpts.Name) { \ - if (Diags) \ - Diags->Report(diag::err_ast_file_langopt_value_mismatch) \ - << Description << Filename; \ - return true; \ - } - -#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ - if (ExistingLangOpts.get##Name() != LangOpts.get##Name()) { \ - if (Diags) \ - Diags->Report(diag::err_ast_file_langopt_value_mismatch) \ - << Description << Filename; \ - return true; \ +#define LANGOPT(Name, Bits, Default, Description) \ + if (ExistingLangOpts.Name != LangOpts.Name) { \ + if (Diags) { \ + if (Bits == 1) \ + Diags->Report(diag::err_ast_file_langopt_mismatch) \ + << Description << LangOpts.Name << ExistingLangOpts.Name << Filename; \ + else \ + Diags->Report(diag::err_ast_file_langopt_value_mismatch) \ + << Description << Filename; \ + } \ + return true; \ + } + +#define VALUE_LANGOPT(Name, Bits, Default, Description) \ + if (ExistingLangOpts.Name != LangOpts.Name) { \ + if (Diags) \ + Diags->Report(diag::err_ast_file_langopt_value_mismatch) \ + << Description << Filename; \ + return true; \ + } + +#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ + if (ExistingLangOpts.get##Name() != LangOpts.get##Name()) { \ + if (Diags) \ + Diags->Report(diag::err_ast_file_langopt_value_mismatch) \ + << Description << Filename; \ + return true; \ } #define COMPATIBLE_LANGOPT(Name, Bits, Default, Description) \ @@ -332,15 +332,14 @@ static bool checkLanguageOptions(const LangOptions &LangOpts, if (ExistingLangOpts.ModuleFeatures != LangOpts.ModuleFeatures) { if (Diags) - Diags->Report(diag::err_ast_file_langopt_value_mismatch) - << "module features" << Filename; + Diags->Report(diag::err_ast_file_langopt_value_mismatch) << "module features" << Filename; return true; } if (ExistingLangOpts.ObjCRuntime != LangOpts.ObjCRuntime) { if (Diags) Diags->Report(diag::err_ast_file_langopt_value_mismatch) - << "target Objective-C runtime" << Filename; + << "target Objective-C runtime" << Filename; return true; } @@ -348,7 +347,7 @@ static bool checkLanguageOptions(const LangOptions &LangOpts, LangOpts.CommentOpts.BlockCommandNames) { if (Diags) Diags->Report(diag::err_ast_file_langopt_value_mismatch) - << "block command names" << Filename; + << "block command names" << Filename; return true; } @@ -392,12 +391,12 @@ static bool checkTargetOptions(const TargetOptions &TargetOpts, const TargetOptions &ExistingTargetOpts, StringRef Filename, DiagnosticsEngine *Diags, bool AllowCompatibleDifferences = true) { -#define CHECK_TARGET_OPT(Field, Name) \ - if (TargetOpts.Field != ExistingTargetOpts.Field) { \ - if (Diags) \ - Diags->Report(diag::err_ast_file_targetopt_mismatch) \ - << Filename << Name << TargetOpts.Field << ExistingTargetOpts.Field; \ - return true; \ +#define CHECK_TARGET_OPT(Field, Name) \ + if (TargetOpts.Field != ExistingTargetOpts.Field) { \ + if (Diags) \ + Diags->Report(diag::err_ast_file_targetopt_mismatch) \ + << Filename << Name << TargetOpts.Field << ExistingTargetOpts.Field; \ + return true; \ } // The triple and ABI must match exactly. @@ -450,9 +449,11 @@ static bool checkTargetOptions(const TargetOptions &TargetOpts, return !UnmatchedReadFeatures.empty() || !UnmatchedExistingFeatures.empty(); } -bool PCHValidator::ReadLanguageOptions(const LangOptions &LangOpts, - StringRef Filename, bool Complain, - bool AllowCompatibleDifferences) { +bool +PCHValidator::ReadLanguageOptions(const LangOptions &LangOpts, + StringRef Filename, + bool Complain, + bool AllowCompatibleDifferences) { const LangOptions &ExistingLangOpts = PP.getLangOpts(); return checkLanguageOptions(LangOpts, ExistingLangOpts, Filename, Complain ? &Reader.Diags : nullptr, @@ -496,11 +497,8 @@ static bool checkDiagnosticGroupMappings(DiagnosticsEngine &StoredDiags, StoredDiags.getDiagnosticLevel(DiagID, SourceLocation()); if (StoredLevel < DiagnosticsEngine::Error) { if (Complain) - Diags.Report(diag::err_ast_file_diagopt_mismatch) - << "-Werror=" + Diags.getDiagnosticIDs() - ->getWarningOptionForDiag(DiagID) - .str() - << Filename; + Diags.Report(diag::err_ast_file_diagopt_mismatch) << "-Werror=" + + Diags.getDiagnosticIDs()->getWarningOptionForDiag(DiagID).str() << Filename; return true; } } @@ -517,8 +515,7 @@ static bool isExtHandlingFromDiagsError(DiagnosticsEngine &Diags) { } static bool checkDiagnosticMappings(DiagnosticsEngine &StoredDiags, - DiagnosticsEngine &Diags, - StringRef Filename, bool IsSystem, + DiagnosticsEngine &Diags, StringRef Filename, bool IsSystem, bool SystemHeaderWarningsInModule, bool Complain) { // Top-level options @@ -530,32 +527,28 @@ static bool checkDiagnosticMappings(DiagnosticsEngine &StoredDiags, if (StoredDiags.getSuppressSystemWarnings() && !SystemHeaderWarningsInModule) { if (Complain) - Diags.Report(diag::err_ast_file_diagopt_mismatch) - << "-Wsystem-headers" << Filename; + Diags.Report(diag::err_ast_file_diagopt_mismatch) << "-Wsystem-headers" << Filename; return true; } } if (Diags.getWarningsAsErrors() && !StoredDiags.getWarningsAsErrors()) { if (Complain) - Diags.Report(diag::err_ast_file_diagopt_mismatch) - << "-Werror" << Filename; + Diags.Report(diag::err_ast_file_diagopt_mismatch) << "-Werror" << Filename; return true; } if (Diags.getWarningsAsErrors() && Diags.getEnableAllWarnings() && !StoredDiags.getEnableAllWarnings()) { if (Complain) - Diags.Report(diag::err_ast_file_diagopt_mismatch) - << "-Weverything -Werror" << Filename; + Diags.Report(diag::err_ast_file_diagopt_mismatch) << "-Weverything -Werror" << Filename; return true; } if (isExtHandlingFromDiagsError(Diags) && !isExtHandlingFromDiagsError(StoredDiags)) { if (Complain) - Diags.Report(diag::err_ast_file_diagopt_mismatch) - << "-pedantic-errors" << Filename; + Diags.Report(diag::err_ast_file_diagopt_mismatch) << "-pedantic-errors" << Filename; return true; } @@ -588,8 +581,7 @@ static Module *getTopImportImplicitModule(ModuleManager &ModuleMgr, } bool PCHValidator::ReadDiagnosticOptions( - IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, StringRef Filename, - bool Complain) { + IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, StringRef Filename, bool Complain) { DiagnosticsEngine &ExistingDiags = PP.getDiagnostics(); IntrusiveRefCntPtr<DiagnosticIDs> DiagIDs(ExistingDiags.getDiagnosticIDs()); IntrusiveRefCntPtr<DiagnosticsEngine> Diags( @@ -614,9 +606,8 @@ bool PCHValidator::ReadDiagnosticOptions( // FIXME: if the diagnostics are incompatible, save a DiagnosticOptions that // contains the union of their flags. - return checkDiagnosticMappings(*Diags, ExistingDiags, Filename, - TopM->IsSystem, SystemHeaderWarningsInModule, - Complain); + return checkDiagnosticMappings(*Diags, ExistingDiags, Filename, TopM->IsSystem, + SystemHeaderWarningsInModule, Complain); } /// Collect the macro definitions provided by the given preprocessor @@ -675,8 +666,8 @@ enum OptionValidation { /// are no differences in the options between the two. static bool checkPreprocessorOptions( const PreprocessorOptions &PPOpts, - const PreprocessorOptions &ExistingPPOpts, StringRef Filename, - bool ReadMacros, DiagnosticsEngine *Diags, FileManager &FileMgr, + const PreprocessorOptions &ExistingPPOpts, StringRef Filename, bool ReadMacros, + DiagnosticsEngine *Diags, FileManager &FileMgr, std::string &SuggestedPredefines, const LangOptions &LangOpts, OptionValidation Validation = OptionValidateContradictions) { if (ReadMacros) { @@ -705,8 +696,7 @@ static bool checkPreprocessorOptions( // If strict matches are requested, don't tolerate any extra defines // on the command line that are missing in the AST file. if (Diags) { - Diags->Report(diag::err_ast_file_macro_def_undef) - << MacroName << true << Filename; + Diags->Report(diag::err_ast_file_macro_def_undef) << MacroName << true << Filename; } return true; } @@ -761,8 +751,7 @@ static bool checkPreprocessorOptions( // the AST file that are missing on the command line. for (const auto &MacroName : ASTFileMacros.keys()) { if (Diags) { - Diags->Report(diag::err_ast_file_macro_def_undef) - << MacroName << false << Filename; + Diags->Report(diag::err_ast_file_macro_def_undef) << MacroName << false << Filename; } return true; } @@ -773,8 +762,7 @@ static bool checkPreprocessorOptions( if (PPOpts.UsePredefines != ExistingPPOpts.UsePredefines && Validation != OptionValidateNone) { if (Diags) { - Diags->Report(diag::err_ast_file_undef) - << ExistingPPOpts.UsePredefines << Filename; + Diags->Report(diag::err_ast_file_undef) << ExistingPPOpts.UsePredefines << Filename; } return true; } @@ -784,8 +772,7 @@ static bool checkPreprocessorOptions( PPOpts.DetailedRecord != ExistingPPOpts.DetailedRecord && Validation != OptionValidateNone) { if (Diags) { - Diags->Report(diag::err_ast_file_pp_detailed_record) - << PPOpts.DetailedRecord << Filename; + Diags->Report(diag::err_ast_file_pp_detailed_record) << PPOpts.DetailedRecord << Filename; } return true; } @@ -829,22 +816,20 @@ static bool checkPreprocessorOptions( } bool PCHValidator::ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, - StringRef Filename, bool ReadMacros, - bool Complain, + StringRef Filename, bool ReadMacros, bool Complain, std::string &SuggestedPredefines) { const PreprocessorOptions &ExistingPPOpts = PP.getPreprocessorOpts(); - return checkPreprocessorOptions(PPOpts, ExistingPPOpts, Filename, ReadMacros, - Complain ? &Reader.Diags : nullptr, - PP.getFileManager(), SuggestedPredefines, - PP.getLangOpts()); + return checkPreprocessorOptions( + PPOpts, ExistingPPOpts, Filename, ReadMacros, Complain ? &Reader.Diags : nullptr, + PP.getFileManager(), SuggestedPredefines, PP.getLangOpts()); } bool SimpleASTReaderListener::ReadPreprocessorOptions( - const PreprocessorOptions &PPOpts, StringRef Filename, bool ReadMacros, - bool Complain, std::string &SuggestedPredefines) { - return checkPreprocessorOptions(PPOpts, PP.getPreprocessorOpts(), Filename, - ReadMacros, nullptr, PP.getFileManager(), + const PreprocessorOptions &PPOpts, StringRef Filename, bool ReadMacros, bool Complain, + std::string &SuggestedPredefines) { + return checkPreprocessorOptions(PPOpts, PP.getPreprocessorOpts(), Filename, ReadMacros, + nullptr, PP.getFileManager(), SuggestedPredefines, PP.getLangOpts(), OptionValidateNone); } @@ -2777,9 +2762,9 @@ static bool isDiagnosedResult(ASTReader::ASTReadResult ARR, unsigned Caps) { } ASTReader::ASTReadResult ASTReader::ReadOptionsBlock( - BitstreamCursor &Stream, StringRef Filename, - unsigned ClientLoadCapabilities, bool AllowCompatibleConfigurationMismatch, - ASTReaderListener &Listener, std::string &SuggestedPredefines) { + BitstreamCursor &Stream, StringRef Filename, unsigned ClientLoadCapabilities, + bool AllowCompatibleConfigurationMismatch, ASTReaderListener &Listener, + std::string &SuggestedPredefines) { if (llvm::Error Err = Stream.EnterSubBlock(OPTIONS_BLOCK_ID)) { // FIXME this drops errors on the floor. consumeError(std::move(Err)); @@ -4881,8 +4866,8 @@ ASTReader::readUnhashedControlBlock(ModuleFile &F, bool WasImportedBy, bool DisableValidation = shouldDisableValidationForFile(F); ASTReadResult Result = readUnhashedControlBlockImpl( - &F, F.Data, F.FileName, ClientLoadCapabilities, - AllowCompatibleConfigurationMismatch, Listener.get(), + &F, F.Data, F.FileName, ClientLoadCapabilities, AllowCompatibleConfigurationMismatch, + Listener.get(), WasImportedBy ? false : HSOpts.ModulesValidateDiagnosticOptions); // If F was directly imported by another module, it's implicitly validated by @@ -4925,9 +4910,9 @@ ASTReader::readUnhashedControlBlock(ModuleFile &F, bool WasImportedBy, } ASTReader::ASTReadResult ASTReader::readUnhashedControlBlockImpl( - ModuleFile *F, llvm::StringRef StreamData, StringRef Filename, - unsigned ClientLoadCapabilities, bool AllowCompatibleConfigurationMismatch, - ASTReaderListener *Listener, bool ValidateDiagnosticOptions) { + ModuleFile *F, llvm::StringRef StreamData, StringRef Filename, unsigned ClientLoadCapabilities, + bool AllowCompatibleConfigurationMismatch, ASTReaderListener *Listener, + bool ValidateDiagnosticOptions) { // Initialize a stream. BitstreamCursor Stream(StreamData); @@ -5382,37 +5367,34 @@ namespace { ExistingModuleCachePath(ExistingModuleCachePath), FileMgr(FileMgr), StrictOptionMatches(StrictOptionMatches) {} - bool ReadLanguageOptions(const LangOptions &LangOpts, StringRef Filename, - bool Complain, + bool ReadLanguageOptions(const LangOptions &LangOpts, StringRef Filename, bool Complain, bool AllowCompatibleDifferences) override { return checkLanguageOptions(ExistingLangOpts, LangOpts, Filename, nullptr, AllowCompatibleDifferences); } - bool ReadTargetOptions(const TargetOptions &TargetOpts, StringRef Filename, - bool Complain, + bool ReadTargetOptions(const TargetOptions &TargetOpts, StringRef Filename, bool Complain, bool AllowCompatibleDifferences) override { - return checkTargetOptions(ExistingTargetOpts, TargetOpts, Filename, - nullptr, AllowCompatibleDifferences); + return checkTargetOptions(ExistingTargetOpts, TargetOpts, Filename, nullptr, + AllowCompatibleDifferences); } bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, StringRef Filename, StringRef SpecificModuleCachePath, bool Complain) override { - return checkModuleCachePath(FileMgr.getVirtualFileSystem(), - SpecificModuleCachePath, - ExistingModuleCachePath, Filename, nullptr, - ExistingLangOpts, ExistingPPOpts); + return checkModuleCachePath( + FileMgr.getVirtualFileSystem(), SpecificModuleCachePath, + ExistingModuleCachePath, Filename, nullptr, ExistingLangOpts, ExistingPPOpts); } bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, - StringRef Filename, bool ReadMacros, - bool Complain, + StringRef Filename, + bool ReadMacros, bool Complain, std::string &SuggestedPredefines) override { return checkPreprocessorOptions( - PPOpts, ExistingPPOpts, Filename, ReadMacros, /*Diags=*/nullptr, - FileMgr, SuggestedPredefines, ExistingLangOpts, + PPOpts, ExistingPPOpts, Filename, ReadMacros, /*Diags=*/nullptr, FileMgr, + SuggestedPredefines, ExistingLangOpts, StrictOptionMatches ? OptionValidateStrictMatches : OptionValidateContradictions); } @@ -6088,8 +6070,8 @@ bool ASTReader::ParseLanguageOptions(const RecordData &Record, AllowCompatibleDifferences); } -bool ASTReader::ParseTargetOptions(const RecordData &Record, StringRef Filename, - bool Complain, ASTReaderListener &Listener, +bool ASTReader::ParseTargetOptions(const RecordData &Record, StringRef Filename, bool Complain, + ASTReaderListener &Listener, bool AllowCompatibleDifferences) { unsigned Idx = 0; TargetOptions TargetOpts; @@ -6108,8 +6090,7 @@ bool ASTReader::ParseTargetOptions(const RecordData &Record, StringRef Filename, AllowCompatibleDifferences); } -bool ASTReader::ParseDiagnosticOptions(const RecordData &Record, - StringRef Filename, bool Complain, +bool ASTReader::ParseDiagnosticOptions(const RecordData &Record, StringRef Filename, bool Complain, ASTReaderListener &Listener) { IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts(new DiagnosticOptions); unsigned Idx = 0; @@ -6154,8 +6135,8 @@ bool ASTReader::ParseHeaderSearchOptions(const RecordData &Record, HSOpts.UseLibcxx = Record[Idx++]; std::string SpecificModuleCachePath = ReadString(Record, Idx); - return Listener.ReadHeaderSearchOptions(HSOpts, Filename, - SpecificModuleCachePath, Complain); + return Listener.ReadHeaderSearchOptions(HSOpts, Filename, SpecificModuleCachePath, + Complain); } bool ASTReader::ParseHeaderSearchPaths(const RecordData &Record, bool Complain, @@ -6223,8 +6204,8 @@ bool ASTReader::ParsePreprocessorOptions(const RecordData &Record, PPOpts.ObjCXXARCStandardLibrary = static_cast<ObjCXXARCStandardLibraryKind>(Record[Idx++]); SuggestedPredefines.clear(); - return Listener.ReadPreprocessorOptions(PPOpts, Filename, ReadMacros, - Complain, SuggestedPredefines); + return Listener.ReadPreprocessorOptions(PPOpts, Filename, ReadMacros, Complain, + SuggestedPredefines); } std::pair<ModuleFile *, unsigned> _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits