[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