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
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to