Author: David Zbarsky Date: 2026-07-08T14:07:48Z New Revision: 51b007f070b2b0f46da1c4e968600fa90fd0ceee
URL: https://github.com/llvm/llvm-project/commit/51b007f070b2b0f46da1c4e968600fa90fd0ceee DIFF: https://github.com/llvm/llvm-project/commit/51b007f070b2b0f46da1c4e968600fa90fd0ceee.diff LOG: [NFC][clang][Serialization] Outline LangOptions mismatch diagnostics (#202843) Outline language-option mismatch diagnostic construction into two `noinline` helpers. Generated comparisons remain direct and ordered as before, so successful imports add no indirect calls and the serialized format is unchanged. Linked `clang` and `clangd` shrink by 35,264 and 29,216 bytes respectively; `ASTReader.cpp.o` shrinks by 62,712 bytes with 1,347 fewer relocations, while linked fixups are unchanged. PCH, PCM, and BMI outputs and mismatch diagnostics are byte-identical, focused module/PCH tests pass, and batched PCH and module imports show no significant performance change. Work towards #202616 AI tool disclosure: Co-authored with OpenAI Codex. Added: Modified: clang/lib/Serialization/ASTReader.cpp Removed: ################################################################################ diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index b01b18fe3e0ec..de1287bbec7d4 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -276,6 +276,23 @@ void ChainedASTReaderListener::readModuleFileExtension( ASTReaderListener::~ASTReaderListener() = default; +static LLVM_ATTRIBUTE_NOINLINE bool diagnoseLanguageOptionFlagMismatch( + DiagnosticsEngine *Diags, StringRef Description, bool SerializedValue, + bool CurrentValue, StringRef ModuleFilename) { + if (!Diags) + return true; + return Diags->Report(diag::err_ast_file_langopt_mismatch) + << Description << SerializedValue << CurrentValue << ModuleFilename; +} + +static LLVM_ATTRIBUTE_NOINLINE bool diagnoseLanguageOptionValueMismatch( + DiagnosticsEngine *Diags, StringRef Description, StringRef ModuleFilename) { + if (!Diags) + return true; + return Diags->Report(diag::err_ast_file_langopt_value_mismatch) + << Description << ModuleFilename; +} + /// Compare the given set of language options against an existing set of /// language options. /// @@ -298,16 +315,12 @@ static bool checkLanguageOptions(const LangOptions &LangOpts, (CK::Compatibility == CK::Compatible && \ !AllowCompatibleDifferences)) { \ if (ExistingLangOpts.Name != LangOpts.Name) { \ - if (Diags) { \ - if (Bits == 1) \ - Diags->Report(diag::err_ast_file_langopt_mismatch) \ - << Description << LangOpts.Name << ExistingLangOpts.Name \ - << ModuleFilename; \ - else \ - Diags->Report(diag::err_ast_file_langopt_value_mismatch) \ - << Description << ModuleFilename; \ - } \ - return true; \ + if (Bits == 1) \ + return diagnoseLanguageOptionFlagMismatch( \ + Diags, Description, LangOpts.Name, ExistingLangOpts.Name, \ + ModuleFilename); \ + return diagnoseLanguageOptionValueMismatch(Diags, Description, \ + ModuleFilename); \ } \ } \ } @@ -318,10 +331,8 @@ static bool checkLanguageOptions(const LangOptions &LangOpts, (CK::Compatibility == CK::Compatible && \ !AllowCompatibleDifferences)) { \ if (ExistingLangOpts.Name != LangOpts.Name) { \ - if (Diags) \ - Diags->Report(diag::err_ast_file_langopt_value_mismatch) \ - << Description << ModuleFilename; \ - return true; \ + return diagnoseLanguageOptionValueMismatch(Diags, Description, \ + ModuleFilename); \ } \ } \ } @@ -332,10 +343,8 @@ static bool checkLanguageOptions(const LangOptions &LangOpts, (CK::Compatibility == CK::Compatible && \ !AllowCompatibleDifferences)) { \ if (ExistingLangOpts.get##Name() != LangOpts.get##Name()) { \ - if (Diags) \ - Diags->Report(diag::err_ast_file_langopt_value_mismatch) \ - << Description << ModuleFilename; \ - return true; \ + return diagnoseLanguageOptionValueMismatch(Diags, Description, \ + ModuleFilename); \ } \ } \ } @@ -343,25 +352,19 @@ static bool checkLanguageOptions(const LangOptions &LangOpts, #include "clang/Basic/LangOptions.def" if (ExistingLangOpts.ModuleFeatures != LangOpts.ModuleFeatures) { - if (Diags) - Diags->Report(diag::err_ast_file_langopt_value_mismatch) - << "module features" << ModuleFilename; - return true; + return diagnoseLanguageOptionValueMismatch(Diags, "module features", + ModuleFilename); } if (ExistingLangOpts.ObjCRuntime != LangOpts.ObjCRuntime) { - if (Diags) - Diags->Report(diag::err_ast_file_langopt_value_mismatch) - << "target Objective-C runtime" << ModuleFilename; - return true; + return diagnoseLanguageOptionValueMismatch( + Diags, "target Objective-C runtime", ModuleFilename); } if (ExistingLangOpts.CommentOpts.BlockCommandNames != LangOpts.CommentOpts.BlockCommandNames) { - if (Diags) - Diags->Report(diag::err_ast_file_langopt_value_mismatch) - << "block command names" << ModuleFilename; - return true; + return diagnoseLanguageOptionValueMismatch(Diags, "block command names", + ModuleFilename); } // Sanitizer feature mismatches are treated as compatible diff erences. If _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
