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

Reply via email to