[clang] [clang][Serialization] Outline LangOptions mismatch diagnostics (PR #202843)
via cfe-commits
cfe-commits at lists.llvm.org
Tue Jul 7 11:50:25 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: David Zbarsky (dzbarsky)
<details>
<summary>Changes</summary>
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.
---
Full diff: https://github.com/llvm/llvm-project/pull/202843.diff
1 Files Affected:
- (modified) clang/lib/Serialization/ASTReader.cpp (+34-24)
``````````diff
diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp
index f8a6a38bb9b5c..9e9dcc57976fa 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 void diagnoseLanguageOptionFlagMismatch(
+ DiagnosticsEngine *Diags, StringRef Description, bool SerializedValue,
+ bool CurrentValue, StringRef ModuleFilename) {
+ if (!Diags)
+ return;
+ Diags->Report(diag::err_ast_file_langopt_mismatch)
+ << Description << SerializedValue << CurrentValue << ModuleFilename;
+}
+
+static LLVM_ATTRIBUTE_NOINLINE void diagnoseLanguageOptionValueMismatch(
+ DiagnosticsEngine *Diags, StringRef Description, StringRef ModuleFilename) {
+ if (!Diags)
+ 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,15 +315,13 @@ 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; \
- } \
+ if (Bits == 1) \
+ diagnoseLanguageOptionFlagMismatch( \
+ Diags, Description, LangOpts.Name, ExistingLangOpts.Name, \
+ ModuleFilename); \
+ else \
+ diagnoseLanguageOptionValueMismatch(Diags, Description, \
+ ModuleFilename); \
return true; \
} \
} \
@@ -318,9 +333,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; \
+ diagnoseLanguageOptionValueMismatch(Diags, Description, \
+ ModuleFilename); \
return true; \
} \
} \
@@ -332,9 +346,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; \
+ diagnoseLanguageOptionValueMismatch(Diags, Description, \
+ ModuleFilename); \
return true; \
} \
} \
@@ -343,24 +356,21 @@ 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;
+ diagnoseLanguageOptionValueMismatch(Diags, "module features",
+ ModuleFilename);
return true;
}
if (ExistingLangOpts.ObjCRuntime != LangOpts.ObjCRuntime) {
- if (Diags)
- Diags->Report(diag::err_ast_file_langopt_value_mismatch)
- << "target Objective-C runtime" << ModuleFilename;
+ diagnoseLanguageOptionValueMismatch(Diags, "target Objective-C runtime",
+ ModuleFilename);
return true;
}
if (ExistingLangOpts.CommentOpts.BlockCommandNames !=
LangOpts.CommentOpts.BlockCommandNames) {
- if (Diags)
- Diags->Report(diag::err_ast_file_langopt_value_mismatch)
- << "block command names" << ModuleFilename;
+ diagnoseLanguageOptionValueMismatch(Diags, "block command names",
+ ModuleFilename);
return true;
}
``````````
</details>
https://github.com/llvm/llvm-project/pull/202843
More information about the cfe-commits
mailing list