[clang] 51b007f - [NFC][clang][Serialization] Outline LangOptions mismatch diagnostics (#202843)
via cfe-commits
cfe-commits at lists.llvm.org
Wed Jul 8 07:07:53 PDT 2026
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
More information about the cfe-commits
mailing list