Skip to content

Conversation

jurahul
Copy link
Contributor

@jurahul jurahul commented Oct 5, 2025

Change emitSummaryAndDescComments to directly write to the output stream, avoiding creating large intermediate strings.

… os directly

Change `emitSummaryAndDescComments` to directly w rite to the output
stream, avoiding creating large intermediate strings.
@jurahul jurahul marked this pull request as ready for review October 5, 2025 14:08
@jurahul jurahul requested review from jpienaar and gysit October 5, 2025 14:08
@llvmbot llvmbot added mlir:core MLIR Core Infrastructure mlir labels Oct 5, 2025
@jurahul jurahul requested a review from joker-eph October 5, 2025 14:09
@llvmbot
Copy link
Member

llvmbot commented Oct 5, 2025

@llvm/pr-subscribers-mlir-core

@llvm/pr-subscribers-mlir

Author: Rahul Joshi (jurahul)

Changes

Change emitSummaryAndDescComments to directly w rite to the output stream, avoiding creating large intermediate strings.


Full diff: https://github.com/llvm/llvm-project/pull/162014.diff

6 Files Affected:

  • (modified) mlir/tools/mlir-tblgen/AttrOrTypeDefGen.cpp (+2-5)
  • (modified) mlir/tools/mlir-tblgen/CppGenUtilities.cpp (+11-6)
  • (modified) mlir/tools/mlir-tblgen/CppGenUtilities.h (+6-4)
  • (modified) mlir/tools/mlir-tblgen/DialectGen.cpp (+4-5)
  • (modified) mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp (+2-5)
  • (modified) mlir/tools/mlir-tblgen/OpInterfacesGen.cpp (+4-10)
diff --git a/mlir/tools/mlir-tblgen/AttrOrTypeDefGen.cpp b/mlir/tools/mlir-tblgen/AttrOrTypeDefGen.cpp
index 06ef396b9b21d..c1130a3632757 100644
--- a/mlir/tools/mlir-tblgen/AttrOrTypeDefGen.cpp
+++ b/mlir/tools/mlir-tblgen/AttrOrTypeDefGen.cpp
@@ -864,11 +864,8 @@ bool DefGenerator::emitDecls(StringRef selectedDialect) {
 
     // Declare all the def classes first (in case they reference each other).
     for (const AttrOrTypeDef &def : defs) {
-      std::string comments = tblgen::emitSummaryAndDescComments(
-          def.getSummary(), def.getDescription());
-      if (!comments.empty()) {
-        os << comments << "\n";
-      }
+      tblgen::emitSummaryAndDescComments(os, def.getSummary(),
+                                         def.getDescription());
       os << "class " << def.getCppClassName() << ";\n";
     }
 
diff --git a/mlir/tools/mlir-tblgen/CppGenUtilities.cpp b/mlir/tools/mlir-tblgen/CppGenUtilities.cpp
index ebca20cc685f4..fddd7790a4375 100644
--- a/mlir/tools/mlir-tblgen/CppGenUtilities.cpp
+++ b/mlir/tools/mlir-tblgen/CppGenUtilities.cpp
@@ -14,26 +14,31 @@
 #include "CppGenUtilities.h"
 #include "mlir/Support/IndentedOstream.h"
 
-std::string
-mlir::tblgen::emitSummaryAndDescComments(llvm::StringRef summary,
-                                         llvm::StringRef description) {
+void mlir::tblgen::emitSummaryAndDescComments(llvm::raw_ostream &os,
+                                              llvm::StringRef summary,
+                                              llvm::StringRef description,
+                                              bool terminateComment) {
 
   std::string comments = "";
   StringRef trimmedSummary = summary.trim();
   StringRef trimmedDesc = description.trim();
-  llvm::raw_string_ostream os(comments);
   raw_indented_ostream ros(os);
 
+  bool empty = true;
   if (!trimmedSummary.empty()) {
     ros.printReindented(trimmedSummary, "/// ");
+    empty = false;
   }
 
   if (!trimmedDesc.empty()) {
-    if (!trimmedSummary.empty()) {
+    if (!empty) {
       // If there is a summary, add a newline after it.
       ros << "\n";
     }
     ros.printReindented(trimmedDesc, "/// ");
+    empty = false;
   }
-  return comments;
+
+  if (!empty && terminateComment)
+    ros << "\n";
 }
diff --git a/mlir/tools/mlir-tblgen/CppGenUtilities.h b/mlir/tools/mlir-tblgen/CppGenUtilities.h
index 231c59a9e148f..69d8cd85ecf70 100644
--- a/mlir/tools/mlir-tblgen/CppGenUtilities.h
+++ b/mlir/tools/mlir-tblgen/CppGenUtilities.h
@@ -15,14 +15,16 @@
 #define MLIR_TOOLS_MLIRTBLGEN_CPPGENUTILITIES_H_
 
 #include "llvm/ADT/StringRef.h"
+#include "llvm/Support/raw_ostream.h"
 
 namespace mlir {
 namespace tblgen {
 
-// Emit the summary and description as a C++ comment, perperly aligned placed
-// adjacent to the class declaration of generated classes.
-std::string emitSummaryAndDescComments(llvm::StringRef summary,
-                                       llvm::StringRef description);
+// Emit the summary and description as a C++ comment. If `terminateComment` is
+// true, terminates the comment with a `\n`.
+void emitSummaryAndDescComments(llvm::raw_ostream &os, llvm::StringRef summary,
+                                llvm::StringRef description,
+                                bool terminateComment = true);
 } // namespace tblgen
 } // namespace mlir
 
diff --git a/mlir/tools/mlir-tblgen/DialectGen.cpp b/mlir/tools/mlir-tblgen/DialectGen.cpp
index 2e8810d5d37f4..c2c0c1f415254 100644
--- a/mlir/tools/mlir-tblgen/DialectGen.cpp
+++ b/mlir/tools/mlir-tblgen/DialectGen.cpp
@@ -109,9 +109,7 @@ tblgen::findDialectToGenerate(ArrayRef<Dialect> dialects) {
 /// {0}: The name of the dialect class.
 /// {1}: The dialect namespace.
 /// {2}: The dialect parent class.
-/// {3}: The summary and description comments.
 static const char *const dialectDeclBeginStr = R"(
-{3}
 class {0} : public ::mlir::{2} {
   explicit {0}(::mlir::MLIRContext *context);
 
@@ -249,10 +247,11 @@ static void emitDialectDecl(Dialect &dialect, raw_ostream &os) {
     StringRef superClassName =
         dialect.isExtensible() ? "ExtensibleDialect" : "Dialect";
 
-    std::string comments = tblgen::emitSummaryAndDescComments(
-        dialect.getSummary(), dialect.getDescription());
+    tblgen::emitSummaryAndDescComments(os, dialect.getSummary(),
+                                       dialect.getDescription(),
+                                       /*terminateCmment=*/false);
     os << llvm::formatv(dialectDeclBeginStr, cppName, dialect.getName(),
-                        superClassName, comments);
+                        superClassName);
 
     // If the dialect requested the default attribute printer and parser, emit
     // the declarations for the hooks.
diff --git a/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp b/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp
index c3420d433523a..9a7f95a94ceaf 100644
--- a/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp
+++ b/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp
@@ -4847,11 +4847,8 @@ static void emitOpClassDecls(const RecordKeeper &records,
   for (auto *def : defs) {
     Operator op(*def);
     NamespaceEmitter emitter(os, op.getCppNamespace());
-    std::string comments = tblgen::emitSummaryAndDescComments(
-        op.getSummary(), op.getDescription());
-    if (!comments.empty()) {
-      os << comments << "\n";
-    }
+    tblgen::emitSummaryAndDescComments(os, op.getSummary(),
+                                       op.getDescription());
     os << "class " << op.getCppClassName() << ";\n";
   }
 
diff --git a/mlir/tools/mlir-tblgen/OpInterfacesGen.cpp b/mlir/tools/mlir-tblgen/OpInterfacesGen.cpp
index 3cc1636ac3317..25f160d079f9d 100644
--- a/mlir/tools/mlir-tblgen/OpInterfacesGen.cpp
+++ b/mlir/tools/mlir-tblgen/OpInterfacesGen.cpp
@@ -536,11 +536,8 @@ void InterfaceGenerator::forwardDeclareInterface(const Interface &interface) {
 
   // Emit a forward declaration of the interface class so that it becomes usable
   // in the signature of its methods.
-  std::string comments = tblgen::emitSummaryAndDescComments(
-      "", interface.getDescription().value_or(""));
-  if (!comments.empty()) {
-    os << comments << "\n";
-  }
+  tblgen::emitSummaryAndDescComments(os, "",
+                                     interface.getDescription().value_or(""));
 
   StringRef interfaceName = interface.getName();
   os << "class " << interfaceName << ";\n";
@@ -560,11 +557,8 @@ void InterfaceGenerator::emitInterfaceDecl(const Interface &interface) {
 
   // Emit a forward declaration of the interface class so that it becomes usable
   // in the signature of its methods.
-  std::string comments = tblgen::emitSummaryAndDescComments(
-      "", interface.getDescription().value_or(""));
-  if (!comments.empty()) {
-    os << comments << "\n";
-  }
+  tblgen::emitSummaryAndDescComments(os, "",
+                                     interface.getDescription().value_or(""));
 
   // Emit the traits struct containing the concept and model declarations.
   os << "namespace detail {\n"

@jurahul jurahul merged commit 95215a3 into llvm:main Oct 6, 2025
14 checks passed
@jurahul jurahul deleted the mlir_tg_emitSummaryAndDescComments branch October 6, 2025 14:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
mlir:core MLIR Core Infrastructure mlir
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants