[Mlir-commits] [mlir] [mlir][tblgen] Expose more of MLIRTableGen as library (PR #113781)

Maksim Levental llvmlistbot at llvm.org
Sat Oct 26 22:00:09 PDT 2024


https://github.com/makslevental updated https://github.com/llvm/llvm-project/pull/113781

>From 9944fd2a516c49370a91bcc72b98ffd493c1a3b3 Mon Sep 17 00:00:00 2001
From: Maksim Levental <maksim.levental at gmail.com>
Date: Sat, 26 Oct 2024 16:36:46 -0400
Subject: [PATCH 01/27] blindly move stuff

---
 .../mlir/TableGen}/AttrOrTypeFormatGen.h      |  0
 .../mlir/TableGen}/DialectGenUtilities.h      |  0
 .../mlir/TableGen}/DocGenUtilities.h          |  0
 .../mlir/TableGen}/FormatGen.h                |  0
 .../mlir/TableGen}/OpClass.h                  |  0
 .../mlir/TableGen}/OpFormatGen.h              |  0
 .../mlir/TableGen}/OpGenHelpers.h             |  0
 .../TableGen}/AttrOrTypeDefGen.cpp            |  0
 .../TableGen}/AttrOrTypeFormatGen.cpp         |  0
 .../TableGen}/BytecodeDialectGen.cpp          |  0
 mlir/lib/TableGen/CMakeLists.txt              | 25 +++++++++++++++++-
 .../TableGen}/DialectGen.cpp                  |  0
 .../TableGen}/DirectiveCommonGen.cpp          |  0
 .../TableGen}/EnumPythonBindingGen.cpp        |  0
 .../mlir-tblgen => lib/TableGen}/EnumsGen.cpp |  0
 .../TableGen}/FormatGen.cpp                   |  0
 .../TableGen}/LLVMIRConversionGen.cpp         |  0
 .../TableGen}/LLVMIRIntrinsicGen.cpp          |  0
 .../mlir-tblgen => lib/TableGen}/OmpOpGen.cpp |  0
 .../mlir-tblgen => lib/TableGen}/OpClass.cpp  |  0
 .../TableGen}/OpDefinitionsGen.cpp            |  0
 .../mlir-tblgen => lib/TableGen}/OpDocGen.cpp |  0
 .../TableGen}/OpFormatGen.cpp                 |  0
 .../TableGen}/OpGenHelpers.cpp                |  0
 .../TableGen}/OpInterfacesGen.cpp             |  0
 .../TableGen}/OpPythonBindingGen.cpp          |  0
 .../TableGen}/PassCAPIGen.cpp                 |  0
 .../TableGen}/PassDocGen.cpp                  |  0
 .../mlir-tblgen => lib/TableGen}/PassGen.cpp  |  0
 .../TableGen}/RewriterGen.cpp                 |  0
 .../TableGen}/SPIRVUtilsGen.cpp               |  0
 mlir/tools/mlir-tblgen/CMakeLists.txt         | 26 +------------------
 32 files changed, 25 insertions(+), 26 deletions(-)
 rename mlir/{tools/mlir-tblgen => include/mlir/TableGen}/AttrOrTypeFormatGen.h (100%)
 rename mlir/{tools/mlir-tblgen => include/mlir/TableGen}/DialectGenUtilities.h (100%)
 rename mlir/{tools/mlir-tblgen => include/mlir/TableGen}/DocGenUtilities.h (100%)
 rename mlir/{tools/mlir-tblgen => include/mlir/TableGen}/FormatGen.h (100%)
 rename mlir/{tools/mlir-tblgen => include/mlir/TableGen}/OpClass.h (100%)
 rename mlir/{tools/mlir-tblgen => include/mlir/TableGen}/OpFormatGen.h (100%)
 rename mlir/{tools/mlir-tblgen => include/mlir/TableGen}/OpGenHelpers.h (100%)
 rename mlir/{tools/mlir-tblgen => lib/TableGen}/AttrOrTypeDefGen.cpp (100%)
 rename mlir/{tools/mlir-tblgen => lib/TableGen}/AttrOrTypeFormatGen.cpp (100%)
 rename mlir/{tools/mlir-tblgen => lib/TableGen}/BytecodeDialectGen.cpp (100%)
 rename mlir/{tools/mlir-tblgen => lib/TableGen}/DialectGen.cpp (100%)
 rename mlir/{tools/mlir-tblgen => lib/TableGen}/DirectiveCommonGen.cpp (100%)
 rename mlir/{tools/mlir-tblgen => lib/TableGen}/EnumPythonBindingGen.cpp (100%)
 rename mlir/{tools/mlir-tblgen => lib/TableGen}/EnumsGen.cpp (100%)
 rename mlir/{tools/mlir-tblgen => lib/TableGen}/FormatGen.cpp (100%)
 rename mlir/{tools/mlir-tblgen => lib/TableGen}/LLVMIRConversionGen.cpp (100%)
 rename mlir/{tools/mlir-tblgen => lib/TableGen}/LLVMIRIntrinsicGen.cpp (100%)
 rename mlir/{tools/mlir-tblgen => lib/TableGen}/OmpOpGen.cpp (100%)
 rename mlir/{tools/mlir-tblgen => lib/TableGen}/OpClass.cpp (100%)
 rename mlir/{tools/mlir-tblgen => lib/TableGen}/OpDefinitionsGen.cpp (100%)
 rename mlir/{tools/mlir-tblgen => lib/TableGen}/OpDocGen.cpp (100%)
 rename mlir/{tools/mlir-tblgen => lib/TableGen}/OpFormatGen.cpp (100%)
 rename mlir/{tools/mlir-tblgen => lib/TableGen}/OpGenHelpers.cpp (100%)
 rename mlir/{tools/mlir-tblgen => lib/TableGen}/OpInterfacesGen.cpp (100%)
 rename mlir/{tools/mlir-tblgen => lib/TableGen}/OpPythonBindingGen.cpp (100%)
 rename mlir/{tools/mlir-tblgen => lib/TableGen}/PassCAPIGen.cpp (100%)
 rename mlir/{tools/mlir-tblgen => lib/TableGen}/PassDocGen.cpp (100%)
 rename mlir/{tools/mlir-tblgen => lib/TableGen}/PassGen.cpp (100%)
 rename mlir/{tools/mlir-tblgen => lib/TableGen}/RewriterGen.cpp (100%)
 rename mlir/{tools/mlir-tblgen => lib/TableGen}/SPIRVUtilsGen.cpp (100%)

diff --git a/mlir/tools/mlir-tblgen/AttrOrTypeFormatGen.h b/mlir/include/mlir/TableGen/AttrOrTypeFormatGen.h
similarity index 100%
rename from mlir/tools/mlir-tblgen/AttrOrTypeFormatGen.h
rename to mlir/include/mlir/TableGen/AttrOrTypeFormatGen.h
diff --git a/mlir/tools/mlir-tblgen/DialectGenUtilities.h b/mlir/include/mlir/TableGen/DialectGenUtilities.h
similarity index 100%
rename from mlir/tools/mlir-tblgen/DialectGenUtilities.h
rename to mlir/include/mlir/TableGen/DialectGenUtilities.h
diff --git a/mlir/tools/mlir-tblgen/DocGenUtilities.h b/mlir/include/mlir/TableGen/DocGenUtilities.h
similarity index 100%
rename from mlir/tools/mlir-tblgen/DocGenUtilities.h
rename to mlir/include/mlir/TableGen/DocGenUtilities.h
diff --git a/mlir/tools/mlir-tblgen/FormatGen.h b/mlir/include/mlir/TableGen/FormatGen.h
similarity index 100%
rename from mlir/tools/mlir-tblgen/FormatGen.h
rename to mlir/include/mlir/TableGen/FormatGen.h
diff --git a/mlir/tools/mlir-tblgen/OpClass.h b/mlir/include/mlir/TableGen/OpClass.h
similarity index 100%
rename from mlir/tools/mlir-tblgen/OpClass.h
rename to mlir/include/mlir/TableGen/OpClass.h
diff --git a/mlir/tools/mlir-tblgen/OpFormatGen.h b/mlir/include/mlir/TableGen/OpFormatGen.h
similarity index 100%
rename from mlir/tools/mlir-tblgen/OpFormatGen.h
rename to mlir/include/mlir/TableGen/OpFormatGen.h
diff --git a/mlir/tools/mlir-tblgen/OpGenHelpers.h b/mlir/include/mlir/TableGen/OpGenHelpers.h
similarity index 100%
rename from mlir/tools/mlir-tblgen/OpGenHelpers.h
rename to mlir/include/mlir/TableGen/OpGenHelpers.h
diff --git a/mlir/tools/mlir-tblgen/AttrOrTypeDefGen.cpp b/mlir/lib/TableGen/AttrOrTypeDefGen.cpp
similarity index 100%
rename from mlir/tools/mlir-tblgen/AttrOrTypeDefGen.cpp
rename to mlir/lib/TableGen/AttrOrTypeDefGen.cpp
diff --git a/mlir/tools/mlir-tblgen/AttrOrTypeFormatGen.cpp b/mlir/lib/TableGen/AttrOrTypeFormatGen.cpp
similarity index 100%
rename from mlir/tools/mlir-tblgen/AttrOrTypeFormatGen.cpp
rename to mlir/lib/TableGen/AttrOrTypeFormatGen.cpp
diff --git a/mlir/tools/mlir-tblgen/BytecodeDialectGen.cpp b/mlir/lib/TableGen/BytecodeDialectGen.cpp
similarity index 100%
rename from mlir/tools/mlir-tblgen/BytecodeDialectGen.cpp
rename to mlir/lib/TableGen/BytecodeDialectGen.cpp
diff --git a/mlir/lib/TableGen/CMakeLists.txt b/mlir/lib/TableGen/CMakeLists.txt
index c4104e644147c6..449da8dca46973 100644
--- a/mlir/lib/TableGen/CMakeLists.txt
+++ b/mlir/lib/TableGen/CMakeLists.txt
@@ -13,22 +13,45 @@
 # this means that MLIRSupport (outside of header-only access) cannot be used.
 llvm_add_library(MLIRTableGen STATIC
   Argument.cpp
-  Attribute.cpp
   AttrOrTypeDef.cpp
+  AttrOrTypeDefGen.cpp
+  AttrOrTypeFormatGen.cpp
+  Attribute.cpp
   Builder.cpp
+  BytecodeDialectGen.cpp
   Class.cpp
   CodeGenHelpers.cpp
   Constraint.cpp
   Dialect.cpp
+  DialectGen.cpp
+  DirectiveCommonGen.cpp
+  EnumPythonBindingGen.cpp
+  EnumsGen.cpp
   Format.cpp
+  FormatGen.cpp
   GenInfo.cpp
   Interfaces.cpp
+  LLVMIRConversionGen.cpp
+  LLVMIRIntrinsicGen.cpp
+  OmpOpGen.cpp
+  OpClass.cpp
+  OpDefinitionsGen.cpp
+  OpDocGen.cpp
+  OpFormatGen.cpp
+  OpGenHelpers.cpp
+  OpInterfacesGen.cpp
+  OpPythonBindingGen.cpp
   Operator.cpp
   Pass.cpp
+  PassCAPIGen.cpp
+  PassDocGen.cpp
+  PassGen.cpp
   Pattern.cpp
   Predicate.cpp
   Property.cpp
   Region.cpp
+  RewriterGen.cpp
+  SPIRVUtilsGen.cpp
   SideEffects.cpp
   Successor.cpp
   Trait.cpp
diff --git a/mlir/tools/mlir-tblgen/DialectGen.cpp b/mlir/lib/TableGen/DialectGen.cpp
similarity index 100%
rename from mlir/tools/mlir-tblgen/DialectGen.cpp
rename to mlir/lib/TableGen/DialectGen.cpp
diff --git a/mlir/tools/mlir-tblgen/DirectiveCommonGen.cpp b/mlir/lib/TableGen/DirectiveCommonGen.cpp
similarity index 100%
rename from mlir/tools/mlir-tblgen/DirectiveCommonGen.cpp
rename to mlir/lib/TableGen/DirectiveCommonGen.cpp
diff --git a/mlir/tools/mlir-tblgen/EnumPythonBindingGen.cpp b/mlir/lib/TableGen/EnumPythonBindingGen.cpp
similarity index 100%
rename from mlir/tools/mlir-tblgen/EnumPythonBindingGen.cpp
rename to mlir/lib/TableGen/EnumPythonBindingGen.cpp
diff --git a/mlir/tools/mlir-tblgen/EnumsGen.cpp b/mlir/lib/TableGen/EnumsGen.cpp
similarity index 100%
rename from mlir/tools/mlir-tblgen/EnumsGen.cpp
rename to mlir/lib/TableGen/EnumsGen.cpp
diff --git a/mlir/tools/mlir-tblgen/FormatGen.cpp b/mlir/lib/TableGen/FormatGen.cpp
similarity index 100%
rename from mlir/tools/mlir-tblgen/FormatGen.cpp
rename to mlir/lib/TableGen/FormatGen.cpp
diff --git a/mlir/tools/mlir-tblgen/LLVMIRConversionGen.cpp b/mlir/lib/TableGen/LLVMIRConversionGen.cpp
similarity index 100%
rename from mlir/tools/mlir-tblgen/LLVMIRConversionGen.cpp
rename to mlir/lib/TableGen/LLVMIRConversionGen.cpp
diff --git a/mlir/tools/mlir-tblgen/LLVMIRIntrinsicGen.cpp b/mlir/lib/TableGen/LLVMIRIntrinsicGen.cpp
similarity index 100%
rename from mlir/tools/mlir-tblgen/LLVMIRIntrinsicGen.cpp
rename to mlir/lib/TableGen/LLVMIRIntrinsicGen.cpp
diff --git a/mlir/tools/mlir-tblgen/OmpOpGen.cpp b/mlir/lib/TableGen/OmpOpGen.cpp
similarity index 100%
rename from mlir/tools/mlir-tblgen/OmpOpGen.cpp
rename to mlir/lib/TableGen/OmpOpGen.cpp
diff --git a/mlir/tools/mlir-tblgen/OpClass.cpp b/mlir/lib/TableGen/OpClass.cpp
similarity index 100%
rename from mlir/tools/mlir-tblgen/OpClass.cpp
rename to mlir/lib/TableGen/OpClass.cpp
diff --git a/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp b/mlir/lib/TableGen/OpDefinitionsGen.cpp
similarity index 100%
rename from mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp
rename to mlir/lib/TableGen/OpDefinitionsGen.cpp
diff --git a/mlir/tools/mlir-tblgen/OpDocGen.cpp b/mlir/lib/TableGen/OpDocGen.cpp
similarity index 100%
rename from mlir/tools/mlir-tblgen/OpDocGen.cpp
rename to mlir/lib/TableGen/OpDocGen.cpp
diff --git a/mlir/tools/mlir-tblgen/OpFormatGen.cpp b/mlir/lib/TableGen/OpFormatGen.cpp
similarity index 100%
rename from mlir/tools/mlir-tblgen/OpFormatGen.cpp
rename to mlir/lib/TableGen/OpFormatGen.cpp
diff --git a/mlir/tools/mlir-tblgen/OpGenHelpers.cpp b/mlir/lib/TableGen/OpGenHelpers.cpp
similarity index 100%
rename from mlir/tools/mlir-tblgen/OpGenHelpers.cpp
rename to mlir/lib/TableGen/OpGenHelpers.cpp
diff --git a/mlir/tools/mlir-tblgen/OpInterfacesGen.cpp b/mlir/lib/TableGen/OpInterfacesGen.cpp
similarity index 100%
rename from mlir/tools/mlir-tblgen/OpInterfacesGen.cpp
rename to mlir/lib/TableGen/OpInterfacesGen.cpp
diff --git a/mlir/tools/mlir-tblgen/OpPythonBindingGen.cpp b/mlir/lib/TableGen/OpPythonBindingGen.cpp
similarity index 100%
rename from mlir/tools/mlir-tblgen/OpPythonBindingGen.cpp
rename to mlir/lib/TableGen/OpPythonBindingGen.cpp
diff --git a/mlir/tools/mlir-tblgen/PassCAPIGen.cpp b/mlir/lib/TableGen/PassCAPIGen.cpp
similarity index 100%
rename from mlir/tools/mlir-tblgen/PassCAPIGen.cpp
rename to mlir/lib/TableGen/PassCAPIGen.cpp
diff --git a/mlir/tools/mlir-tblgen/PassDocGen.cpp b/mlir/lib/TableGen/PassDocGen.cpp
similarity index 100%
rename from mlir/tools/mlir-tblgen/PassDocGen.cpp
rename to mlir/lib/TableGen/PassDocGen.cpp
diff --git a/mlir/tools/mlir-tblgen/PassGen.cpp b/mlir/lib/TableGen/PassGen.cpp
similarity index 100%
rename from mlir/tools/mlir-tblgen/PassGen.cpp
rename to mlir/lib/TableGen/PassGen.cpp
diff --git a/mlir/tools/mlir-tblgen/RewriterGen.cpp b/mlir/lib/TableGen/RewriterGen.cpp
similarity index 100%
rename from mlir/tools/mlir-tblgen/RewriterGen.cpp
rename to mlir/lib/TableGen/RewriterGen.cpp
diff --git a/mlir/tools/mlir-tblgen/SPIRVUtilsGen.cpp b/mlir/lib/TableGen/SPIRVUtilsGen.cpp
similarity index 100%
rename from mlir/tools/mlir-tblgen/SPIRVUtilsGen.cpp
rename to mlir/lib/TableGen/SPIRVUtilsGen.cpp
diff --git a/mlir/tools/mlir-tblgen/CMakeLists.txt b/mlir/tools/mlir-tblgen/CMakeLists.txt
index fb507dc7f8c3cc..544a95530a22bd 100644
--- a/mlir/tools/mlir-tblgen/CMakeLists.txt
+++ b/mlir/tools/mlir-tblgen/CMakeLists.txt
@@ -8,31 +8,7 @@ set(LLVM_LINK_COMPONENTS
 add_tablegen(mlir-tblgen MLIR
   DESTINATION "${MLIR_TOOLS_INSTALL_DIR}"
   EXPORT MLIR
-  AttrOrTypeDefGen.cpp
-  AttrOrTypeFormatGen.cpp
-  BytecodeDialectGen.cpp
-  DialectGen.cpp
-  DirectiveCommonGen.cpp
-  EnumsGen.cpp
-  EnumPythonBindingGen.cpp
-  FormatGen.cpp
-  LLVMIRConversionGen.cpp
-  LLVMIRIntrinsicGen.cpp
-  mlir-tblgen.cpp
-  OmpOpGen.cpp
-  OpClass.cpp
-  OpDefinitionsGen.cpp
-  OpDocGen.cpp
-  OpFormatGen.cpp
-  OpGenHelpers.cpp
-  OpInterfacesGen.cpp
-  OpPythonBindingGen.cpp
-  PassCAPIGen.cpp
-  PassDocGen.cpp
-  PassGen.cpp
-  RewriterGen.cpp
-  SPIRVUtilsGen.cpp
-  )
+  mlir-tblgen.cpp)
 
 target_link_libraries(mlir-tblgen
   PRIVATE

>From 07d233d31b00d04272ca8156b4fdcbc9a8ab59cd Mon Sep 17 00:00:00 2001
From: Maksim Levental <maksim.levental at gmail.com>
Date: Sat, 26 Oct 2024 16:40:58 -0400
Subject: [PATCH 02/27] fix header paths

---
 mlir/lib/TableGen/AttrOrTypeDefGen.cpp     | 2 +-
 mlir/lib/TableGen/AttrOrTypeFormatGen.cpp  | 4 ++--
 mlir/lib/TableGen/DialectGen.cpp           | 2 +-
 mlir/lib/TableGen/EnumPythonBindingGen.cpp | 2 +-
 mlir/lib/TableGen/EnumsGen.cpp             | 2 +-
 mlir/lib/TableGen/FormatGen.cpp            | 2 +-
 mlir/lib/TableGen/OpClass.cpp              | 2 +-
 mlir/lib/TableGen/OpDefinitionsGen.cpp     | 6 +++---
 mlir/lib/TableGen/OpDocGen.cpp             | 6 +++---
 mlir/lib/TableGen/OpFormatGen.cpp          | 6 +++---
 mlir/lib/TableGen/OpGenHelpers.cpp         | 2 +-
 mlir/lib/TableGen/OpInterfacesGen.cpp      | 2 +-
 mlir/lib/TableGen/OpPythonBindingGen.cpp   | 2 +-
 mlir/lib/TableGen/PassDocGen.cpp           | 2 +-
 14 files changed, 21 insertions(+), 21 deletions(-)

diff --git a/mlir/lib/TableGen/AttrOrTypeDefGen.cpp b/mlir/lib/TableGen/AttrOrTypeDefGen.cpp
index 6a39424bd463fd..e71fd8772e4c88 100644
--- a/mlir/lib/TableGen/AttrOrTypeDefGen.cpp
+++ b/mlir/lib/TableGen/AttrOrTypeDefGen.cpp
@@ -6,7 +6,7 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "AttrOrTypeFormatGen.h"
+#include "mlir/TableGen/AttrOrTypeFormatGen.h"
 #include "mlir/TableGen/AttrOrTypeDef.h"
 #include "mlir/TableGen/Class.h"
 #include "mlir/TableGen/CodeGenHelpers.h"
diff --git a/mlir/lib/TableGen/AttrOrTypeFormatGen.cpp b/mlir/lib/TableGen/AttrOrTypeFormatGen.cpp
index a4ae271edb6bd2..a7d61801cbcf96 100644
--- a/mlir/lib/TableGen/AttrOrTypeFormatGen.cpp
+++ b/mlir/lib/TableGen/AttrOrTypeFormatGen.cpp
@@ -6,8 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "AttrOrTypeFormatGen.h"
-#include "FormatGen.h"
+#include "mlir/TableGen/AttrOrTypeFormatGen.h"
+#include "mlir/TableGen/FormatGen.h"
 #include "mlir/Support/LLVM.h"
 #include "mlir/TableGen/AttrOrTypeDef.h"
 #include "mlir/TableGen/Format.h"
diff --git a/mlir/lib/TableGen/DialectGen.cpp b/mlir/lib/TableGen/DialectGen.cpp
index 414cad5e1dcc2e..1e8ab8f2576e79 100644
--- a/mlir/lib/TableGen/DialectGen.cpp
+++ b/mlir/lib/TableGen/DialectGen.cpp
@@ -10,7 +10,7 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "DialectGenUtilities.h"
+#include "mlir/TableGen/DialectGenUtilities.h"
 #include "mlir/TableGen/Class.h"
 #include "mlir/TableGen/CodeGenHelpers.h"
 #include "mlir/TableGen/Format.h"
diff --git a/mlir/lib/TableGen/EnumPythonBindingGen.cpp b/mlir/lib/TableGen/EnumPythonBindingGen.cpp
index 3f660ae151c749..e5f13ce4de3b08 100644
--- a/mlir/lib/TableGen/EnumPythonBindingGen.cpp
+++ b/mlir/lib/TableGen/EnumPythonBindingGen.cpp
@@ -10,7 +10,7 @@
 // generate the corresponding Python binding classes.
 //
 //===----------------------------------------------------------------------===//
-#include "OpGenHelpers.h"
+#include "mlir/TableGen/OpGenHelpers.h"
 
 #include "mlir/TableGen/AttrOrTypeDef.h"
 #include "mlir/TableGen/Attribute.h"
diff --git a/mlir/lib/TableGen/EnumsGen.cpp b/mlir/lib/TableGen/EnumsGen.cpp
index 47ffd291cae687..f64f1a038950d5 100644
--- a/mlir/lib/TableGen/EnumsGen.cpp
+++ b/mlir/lib/TableGen/EnumsGen.cpp
@@ -10,7 +10,7 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "FormatGen.h"
+#include "mlir/TableGen/FormatGen.h"
 #include "mlir/TableGen/Attribute.h"
 #include "mlir/TableGen/Format.h"
 #include "mlir/TableGen/GenInfo.h"
diff --git a/mlir/lib/TableGen/FormatGen.cpp b/mlir/lib/TableGen/FormatGen.cpp
index d145f3e5a23ddb..63568922a31b36 100644
--- a/mlir/lib/TableGen/FormatGen.cpp
+++ b/mlir/lib/TableGen/FormatGen.cpp
@@ -6,7 +6,7 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "FormatGen.h"
+#include "mlir/TableGen/FormatGen.h"
 #include "llvm/ADT/StringSwitch.h"
 #include "llvm/Support/SourceMgr.h"
 #include "llvm/TableGen/Error.h"
diff --git a/mlir/lib/TableGen/OpClass.cpp b/mlir/lib/TableGen/OpClass.cpp
index 60fa1833ce625e..7d4529835cdb4e 100644
--- a/mlir/lib/TableGen/OpClass.cpp
+++ b/mlir/lib/TableGen/OpClass.cpp
@@ -6,7 +6,7 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "OpClass.h"
+#include "mlir/TableGen/OpClass.h"
 
 using namespace mlir;
 using namespace mlir::tblgen;
diff --git a/mlir/lib/TableGen/OpDefinitionsGen.cpp b/mlir/lib/TableGen/OpDefinitionsGen.cpp
index 9badb7aa163a60..4ffdfec76c886f 100644
--- a/mlir/lib/TableGen/OpDefinitionsGen.cpp
+++ b/mlir/lib/TableGen/OpDefinitionsGen.cpp
@@ -11,9 +11,9 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "OpClass.h"
-#include "OpFormatGen.h"
-#include "OpGenHelpers.h"
+#include "mlir/TableGen/OpClass.h"
+#include "mlir/TableGen/OpFormatGen.h"
+#include "mlir/TableGen/OpGenHelpers.h"
 #include "mlir/TableGen/Argument.h"
 #include "mlir/TableGen/Attribute.h"
 #include "mlir/TableGen/Class.h"
diff --git a/mlir/lib/TableGen/OpDocGen.cpp b/mlir/lib/TableGen/OpDocGen.cpp
index d499c78a5cf44d..a8fb3ae8dfcd6a 100644
--- a/mlir/lib/TableGen/OpDocGen.cpp
+++ b/mlir/lib/TableGen/OpDocGen.cpp
@@ -11,9 +11,9 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "DialectGenUtilities.h"
-#include "DocGenUtilities.h"
-#include "OpGenHelpers.h"
+#include "mlir/TableGen/DialectGenUtilities.h"
+#include "mlir/TableGen/DocGenUtilities.h"
+#include "mlir/TableGen/OpGenHelpers.h"
 #include "mlir/Support/IndentedOstream.h"
 #include "mlir/TableGen/AttrOrTypeDef.h"
 #include "mlir/TableGen/Attribute.h"
diff --git a/mlir/lib/TableGen/OpFormatGen.cpp b/mlir/lib/TableGen/OpFormatGen.cpp
index 3bf6f2f6d38176..29a678d6a9dbd1 100644
--- a/mlir/lib/TableGen/OpFormatGen.cpp
+++ b/mlir/lib/TableGen/OpFormatGen.cpp
@@ -6,9 +6,9 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "OpFormatGen.h"
-#include "FormatGen.h"
-#include "OpClass.h"
+#include "mlir/TableGen/OpFormatGen.h"
+#include "mlir/TableGen/FormatGen.h"
+#include "mlir/TableGen/OpClass.h"
 #include "mlir/Support/LLVM.h"
 #include "mlir/TableGen/Class.h"
 #include "mlir/TableGen/Format.h"
diff --git a/mlir/lib/TableGen/OpGenHelpers.cpp b/mlir/lib/TableGen/OpGenHelpers.cpp
index 44dbacf19fffd4..4156427f9fc78c 100644
--- a/mlir/lib/TableGen/OpGenHelpers.cpp
+++ b/mlir/lib/TableGen/OpGenHelpers.cpp
@@ -10,7 +10,7 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "OpGenHelpers.h"
+#include "mlir/TableGen/OpGenHelpers.h"
 #include "llvm/ADT/StringSet.h"
 #include "llvm/Support/CommandLine.h"
 #include "llvm/Support/FormatVariadic.h"
diff --git a/mlir/lib/TableGen/OpInterfacesGen.cpp b/mlir/lib/TableGen/OpInterfacesGen.cpp
index 1f1b1d9a340391..f306e5e8e6e39d 100644
--- a/mlir/lib/TableGen/OpInterfacesGen.cpp
+++ b/mlir/lib/TableGen/OpInterfacesGen.cpp
@@ -10,7 +10,7 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "DocGenUtilities.h"
+#include "mlir/TableGen/DocGenUtilities.h"
 #include "mlir/TableGen/Format.h"
 #include "mlir/TableGen/GenInfo.h"
 #include "mlir/TableGen/Interfaces.h"
diff --git a/mlir/lib/TableGen/OpPythonBindingGen.cpp b/mlir/lib/TableGen/OpPythonBindingGen.cpp
index 0c5c936f5addee..68316ea359261b 100644
--- a/mlir/lib/TableGen/OpPythonBindingGen.cpp
+++ b/mlir/lib/TableGen/OpPythonBindingGen.cpp
@@ -11,7 +11,7 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "OpGenHelpers.h"
+#include "mlir/TableGen/OpGenHelpers.h"
 
 #include "mlir/TableGen/GenInfo.h"
 #include "mlir/TableGen/Operator.h"
diff --git a/mlir/lib/TableGen/PassDocGen.cpp b/mlir/lib/TableGen/PassDocGen.cpp
index a2cb514ece3eba..3bf2ba3323d47b 100644
--- a/mlir/lib/TableGen/PassDocGen.cpp
+++ b/mlir/lib/TableGen/PassDocGen.cpp
@@ -10,7 +10,7 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "DocGenUtilities.h"
+#include "mlir/TableGen/DocGenUtilities.h"
 #include "mlir/TableGen/GenInfo.h"
 #include "mlir/TableGen/Pass.h"
 #include "llvm/Support/FormatVariadic.h"

>From b0d0bf51010ba39086816f8327c98eed7ee223ed Mon Sep 17 00:00:00 2001
From: Maksim Levental <maksim.levental at gmail.com>
Date: Sat, 26 Oct 2024 17:17:11 -0400
Subject: [PATCH 03/27] rename statics to be more specific

---
 mlir/lib/TableGen/DirectiveCommonGen.cpp  |   6 +-
 mlir/lib/TableGen/EnumsGen.cpp            |   2 +-
 mlir/lib/TableGen/LLVMIRConversionGen.cpp |  38 +++++---
 mlir/lib/TableGen/LLVMIRIntrinsicGen.cpp  |   5 +-
 mlir/lib/TableGen/OmpOpGen.cpp            |  10 +-
 mlir/lib/TableGen/OpDefinitionsGen.cpp    |   6 +-
 mlir/lib/TableGen/OpDocGen.cpp            |  59 +++++------
 mlir/lib/TableGen/OpInterfacesGen.cpp     |  13 ++-
 mlir/lib/TableGen/OpPythonBindingGen.cpp  |   5 +-
 mlir/lib/TableGen/PassDocGen.cpp          |  12 +--
 mlir/lib/TableGen/PassGen.cpp             |   4 +-
 mlir/lib/TableGen/RewriterGen.cpp         |  10 +-
 mlir/lib/TableGen/SPIRVUtilsGen.cpp       | 114 +++++++++++-----------
 13 files changed, 151 insertions(+), 133 deletions(-)

diff --git a/mlir/lib/TableGen/DirectiveCommonGen.cpp b/mlir/lib/TableGen/DirectiveCommonGen.cpp
index 09c068fb766935..c9693f13bdfc36 100644
--- a/mlir/lib/TableGen/DirectiveCommonGen.cpp
+++ b/mlir/lib/TableGen/DirectiveCommonGen.cpp
@@ -42,8 +42,8 @@ using llvm::RecordKeeper;
 // Clause record in OMP.td. This name can be used to specify the type of the
 // OpenMP operation's operand. The allowedClauseValues field provides the list
 // of ClauseValues which are part of the enumeration.
-static bool emitDecls(const RecordKeeper &records, llvm::StringRef dialect,
-                      raw_ostream &os) {
+static bool emitDirectiveDecls(const RecordKeeper &records,
+                               llvm::StringRef dialect, raw_ostream &os) {
   // A dialect must be selected for the generated attributes.
   if (dialect.empty()) {
     llvm::PrintFatalError("a dialect must be selected for the directives via "
@@ -108,5 +108,5 @@ static mlir::GenRegistration genDirectiveDecls(
     "gen-directive-decl",
     "Generate declarations for directives (OpenMP/OpenACC etc.)",
     [](const RecordKeeper &records, raw_ostream &os) {
-      return emitDecls(records, dialect, os);
+      return emitDirectiveDecls(records, dialect, os);
     });
diff --git a/mlir/lib/TableGen/EnumsGen.cpp b/mlir/lib/TableGen/EnumsGen.cpp
index f64f1a038950d5..82339bb08a132e 100644
--- a/mlir/lib/TableGen/EnumsGen.cpp
+++ b/mlir/lib/TableGen/EnumsGen.cpp
@@ -10,9 +10,9 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "mlir/TableGen/FormatGen.h"
 #include "mlir/TableGen/Attribute.h"
 #include "mlir/TableGen/Format.h"
+#include "mlir/TableGen/FormatGen.h"
 #include "mlir/TableGen/GenInfo.h"
 #include "llvm/ADT/BitVector.h"
 #include "llvm/ADT/SmallVector.h"
diff --git a/mlir/lib/TableGen/LLVMIRConversionGen.cpp b/mlir/lib/TableGen/LLVMIRConversionGen.cpp
index 9e19f479d673a0..d057cf3255ed66 100644
--- a/mlir/lib/TableGen/LLVMIRConversionGen.cpp
+++ b/mlir/lib/TableGen/LLVMIRConversionGen.cpp
@@ -177,7 +177,8 @@ static LogicalResult emitOneBuilder(const Record &record, raw_ostream &os) {
 
 // Emit all builders.  Returns false on success because of the generator
 // registration requirements.
-static bool emitBuilders(const RecordKeeper &records, raw_ostream &os) {
+static bool emitLLVMIRConversionBuilders(const RecordKeeper &records,
+                                         raw_ostream &os) {
   for (const Record *def : records.getAllDerivedDefinitions("LLVM_OpBase")) {
     if (failed(emitOneBuilder(*def, os)))
       return true;
@@ -304,7 +305,8 @@ static LogicalResult emitOneMLIRBuilder(const Record &record, raw_ostream &os,
 
 // Emit all intrinsic MLIR builders. Returns false on success because of the
 // generator registration requirements.
-static bool emitIntrMLIRBuilders(const RecordKeeper &records, raw_ostream &os) {
+static bool emitLLVMIRIntrMLIRBuilders(const RecordKeeper &records,
+                                       raw_ostream &os) {
   // Emit condition to check if "llvmEnumName" matches the intrinsic id.
   auto emitIntrCond = [](const Record &record) {
     return "intrinsicID == llvm::Intrinsic::" +
@@ -320,7 +322,8 @@ static bool emitIntrMLIRBuilders(const RecordKeeper &records, raw_ostream &os) {
 
 // Emit all op builders. Returns false on success because of the
 // generator registration requirements.
-static bool emitOpMLIRBuilders(const RecordKeeper &records, raw_ostream &os) {
+static bool emitLLVMIROpMLIRBuilders(const RecordKeeper &records,
+                                     raw_ostream &os) {
   // Emit condition to check if "llvmInstName" matches the instruction opcode.
   auto emitOpcodeCond = [](const Record &record) {
     return "inst->getOpcode() == llvm::Instruction::" +
@@ -532,8 +535,8 @@ static void emitOneCEnumFromConversion(const Record *record, raw_ostream &os) {
 // Emits conversion functions between MLIR enum attribute case and corresponding
 // LLVM API enumerants for all registered LLVM dialect enum attributes.
 template <bool ConvertTo>
-static bool emitEnumConversionDefs(const RecordKeeper &records,
-                                   raw_ostream &os) {
+static bool emitLLVMIREnumConversionDefs(const RecordKeeper &records,
+                                         raw_ostream &os) {
   for (const Record *def : records.getAllDerivedDefinitions("LLVM_EnumAttr"))
     if (ConvertTo)
       emitOneEnumToConversion(def, os);
@@ -556,8 +559,8 @@ static void emitOneIntrinsic(const Record &record, raw_ostream &os) {
 
 // Emit the list of LLVM IR intrinsics identifiers that are convertible to a
 // matching MLIR LLVM dialect intrinsic operation.
-static bool emitConvertibleIntrinsics(const RecordKeeper &records,
-                                      raw_ostream &os) {
+static bool emitConvertibleLLVMIRIntrinsics(const RecordKeeper &records,
+                                            raw_ostream &os) {
   for (const Record *def : records.getAllDerivedDefinitions("LLVM_IntrOpBase"))
     emitOneIntrinsic(*def, os);
 
@@ -566,27 +569,30 @@ static bool emitConvertibleIntrinsics(const RecordKeeper &records,
 
 static mlir::GenRegistration
     genLLVMIRConversions("gen-llvmir-conversions",
-                         "Generate LLVM IR conversions", emitBuilders);
+                         "Generate LLVM IR conversions",
+                         emitLLVMIRConversionBuilders);
 
 static mlir::GenRegistration genOpFromLLVMIRConversions(
     "gen-op-from-llvmir-conversions",
-    "Generate conversions of operations from LLVM IR", emitOpMLIRBuilders);
+    "Generate conversions of operations from LLVM IR",
+    emitLLVMIROpMLIRBuilders);
 
 static mlir::GenRegistration genIntrFromLLVMIRConversions(
     "gen-intr-from-llvmir-conversions",
-    "Generate conversions of intrinsics from LLVM IR", emitIntrMLIRBuilders);
+    "Generate conversions of intrinsics from LLVM IR",
+    emitLLVMIRIntrMLIRBuilders);
 
 static mlir::GenRegistration
     genEnumToLLVMConversion("gen-enum-to-llvmir-conversions",
                             "Generate conversions of EnumAttrs to LLVM IR",
-                            emitEnumConversionDefs</*ConvertTo=*/true>);
+                            emitLLVMIREnumConversionDefs</*ConvertTo=*/true>);
 
-static mlir::GenRegistration
-    genEnumFromLLVMConversion("gen-enum-from-llvmir-conversions",
-                              "Generate conversions of EnumAttrs from LLVM IR",
-                              emitEnumConversionDefs</*ConvertTo=*/false>);
+static mlir::GenRegistration genEnumFromLLVMConversion(
+    "gen-enum-from-llvmir-conversions",
+    "Generate conversions of EnumAttrs from LLVM IR",
+    emitLLVMIREnumConversionDefs</*ConvertTo=*/false>);
 
 static mlir::GenRegistration genConvertibleLLVMIRIntrinsics(
     "gen-convertible-llvmir-intrinsics",
     "Generate list of convertible LLVM IR intrinsics",
-    emitConvertibleIntrinsics);
+    emitConvertibleLLVMIRIntrinsics);
diff --git a/mlir/lib/TableGen/LLVMIRIntrinsicGen.cpp b/mlir/lib/TableGen/LLVMIRIntrinsicGen.cpp
index 411a98a48bfb28..fa43dd8cd498bf 100644
--- a/mlir/lib/TableGen/LLVMIRIntrinsicGen.cpp
+++ b/mlir/lib/TableGen/LLVMIRIntrinsicGen.cpp
@@ -250,7 +250,8 @@ static bool emitIntrinsic(const Record &record, llvm::raw_ostream &os) {
 /// Traverses the list of TableGen definitions derived from the "Intrinsic"
 /// class and generates MLIR ODS definitions for those intrinsics that have
 /// the name matching the filter.
-static bool emitIntrinsics(const RecordKeeper &records, llvm::raw_ostream &os) {
+static bool emitLLVMIRIntrinsics(const RecordKeeper &records,
+                                 llvm::raw_ostream &os) {
   llvm::emitSourceFileHeader("Operations for LLVM intrinsics", os, records);
   os << "include \"mlir/Dialect/LLVMIR/LLVMOpBase.td\"\n";
   os << "include \"mlir/Interfaces/SideEffectInterfaces.td\"\n\n";
@@ -268,4 +269,4 @@ static bool emitIntrinsics(const RecordKeeper &records, llvm::raw_ostream &os) {
 
 static mlir::GenRegistration genLLVMIRIntrinsics("gen-llvmir-intrinsics",
                                                  "Generate LLVM IR intrinsics",
-                                                 emitIntrinsics);
+                                                 emitLLVMIRIntrinsics);
diff --git a/mlir/lib/TableGen/OmpOpGen.cpp b/mlir/lib/TableGen/OmpOpGen.cpp
index 04f81a4a2dce1a..b9988dfdffd5eb 100644
--- a/mlir/lib/TableGen/OmpOpGen.cpp
+++ b/mlir/lib/TableGen/OmpOpGen.cpp
@@ -329,7 +329,7 @@ static void genOperandsDef(const Record *op, raw_ostream &os) {
 
 /// Verify that all properties of `OpenMP_Clause`s of records deriving from
 /// `OpenMP_Op`s have been inherited by the latter.
-static bool verifyDecls(const RecordKeeper &records, raw_ostream &) {
+static bool verifyOpenmpDecls(const RecordKeeper &records, raw_ostream &) {
   for (const Record *op : records.getAllDerivedDefinitions("OpenMP_Op")) {
     for (const Record *clause : op->getValueAsListOfDefs("clauseList"))
       verifyClause(op, clause);
@@ -342,7 +342,7 @@ static bool verifyDecls(const RecordKeeper &records, raw_ostream &) {
 /// `OpenMP_Clause` definitions and aggregate them into operation-specific
 /// structures according to the `clauses` argument of each definition deriving
 /// from `OpenMP_Op`.
-static bool genClauseOps(const RecordKeeper &records, raw_ostream &os) {
+static bool genOpenmpClauseOps(const RecordKeeper &records, raw_ostream &os) {
   mlir::tblgen::NamespaceEmitter ns(os, "mlir::omp");
   for (const Record *clause : records.getAllDerivedDefinitions("OpenMP_Clause"))
     genClauseOpsStruct(clause, os);
@@ -360,9 +360,9 @@ static bool genClauseOps(const RecordKeeper &records, raw_ostream &os) {
 static mlir::GenRegistration
     verifyOpenmpOps("verify-openmp-ops",
                     "Verify OpenMP operations (produce no output file)",
-                    verifyDecls);
+                    verifyOpenmpDecls);
 
 static mlir::GenRegistration
-    genOpenmpClauseOps("gen-openmp-clause-ops",
+    regOpenmpClauseOps("gen-openmp-clause-ops",
                        "Generate OpenMP clause operand structures",
-                       genClauseOps);
+                       genOpenmpClauseOps);
diff --git a/mlir/lib/TableGen/OpDefinitionsGen.cpp b/mlir/lib/TableGen/OpDefinitionsGen.cpp
index 4ffdfec76c886f..4616a07163ea64 100644
--- a/mlir/lib/TableGen/OpDefinitionsGen.cpp
+++ b/mlir/lib/TableGen/OpDefinitionsGen.cpp
@@ -11,9 +11,6 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "mlir/TableGen/OpClass.h"
-#include "mlir/TableGen/OpFormatGen.h"
-#include "mlir/TableGen/OpGenHelpers.h"
 #include "mlir/TableGen/Argument.h"
 #include "mlir/TableGen/Attribute.h"
 #include "mlir/TableGen/Class.h"
@@ -21,6 +18,9 @@
 #include "mlir/TableGen/Format.h"
 #include "mlir/TableGen/GenInfo.h"
 #include "mlir/TableGen/Interfaces.h"
+#include "mlir/TableGen/OpClass.h"
+#include "mlir/TableGen/OpFormatGen.h"
+#include "mlir/TableGen/OpGenHelpers.h"
 #include "mlir/TableGen/Operator.h"
 #include "mlir/TableGen/Property.h"
 #include "mlir/TableGen/SideEffects.h"
diff --git a/mlir/lib/TableGen/OpDocGen.cpp b/mlir/lib/TableGen/OpDocGen.cpp
index a8fb3ae8dfcd6a..95841eac041ba7 100644
--- a/mlir/lib/TableGen/OpDocGen.cpp
+++ b/mlir/lib/TableGen/OpDocGen.cpp
@@ -11,13 +11,13 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "mlir/TableGen/DialectGenUtilities.h"
-#include "mlir/TableGen/DocGenUtilities.h"
-#include "mlir/TableGen/OpGenHelpers.h"
 #include "mlir/Support/IndentedOstream.h"
 #include "mlir/TableGen/AttrOrTypeDef.h"
 #include "mlir/TableGen/Attribute.h"
+#include "mlir/TableGen/DialectGenUtilities.h"
+#include "mlir/TableGen/DocGenUtilities.h"
 #include "mlir/TableGen/GenInfo.h"
+#include "mlir/TableGen/OpGenHelpers.h"
 #include "mlir/TableGen/Operator.h"
 #include "llvm/ADT/DenseMap.h"
 #include "llvm/ADT/SetVector.h"
@@ -232,7 +232,8 @@ static void emitOpDoc(const Operator &op, raw_ostream &os) {
         // Expandable description.
         // This appears as just the summary, but when clicked shows the full
         // description.
-        os << "<details>" << "<summary>" << it.attr.getSummary() << "</summary>"
+        os << "<details>"
+           << "<summary>" << it.attr.getSummary() << "</summary>"
            << "{{% markdown %}}" << description << "{{% /markdown %}}"
            << "</details>";
       } else {
@@ -608,36 +609,36 @@ static bool emitDialectDoc(const RecordKeeper &records, raw_ostream &os) {
 //===----------------------------------------------------------------------===//
 
 static mlir::GenRegistration
-    genAttrRegister("gen-attrdef-doc",
-                    "Generate dialect attribute documentation",
-                    [](const RecordKeeper &records, raw_ostream &os) {
-                      emitAttrOrTypeDefDoc(records, os, "AttrDef");
-                      return false;
-                    });
+    genAttrDocRegister("gen-attrdef-doc",
+                       "Generate dialect attribute documentation",
+                       [](const RecordKeeper &records, raw_ostream &os) {
+                         emitAttrOrTypeDefDoc(records, os, "AttrDef");
+                         return false;
+                       });
 
 static mlir::GenRegistration
-    genOpRegister("gen-op-doc", "Generate dialect documentation",
-                  [](const RecordKeeper &records, raw_ostream &os) {
-                    emitOpDoc(records, os);
-                    return false;
-                  });
+    genOpDocRegister("gen-op-doc", "Generate dialect documentation",
+                     [](const RecordKeeper &records, raw_ostream &os) {
+                       emitOpDoc(records, os);
+                       return false;
+                     });
 
 static mlir::GenRegistration
-    genTypeRegister("gen-typedef-doc", "Generate dialect type documentation",
-                    [](const RecordKeeper &records, raw_ostream &os) {
-                      emitAttrOrTypeDefDoc(records, os, "TypeDef");
-                      return false;
-                    });
+    genTypeDocRegister("gen-typedef-doc", "Generate dialect type documentation",
+                       [](const RecordKeeper &records, raw_ostream &os) {
+                         emitAttrOrTypeDefDoc(records, os, "TypeDef");
+                         return false;
+                       });
 
 static mlir::GenRegistration
-    genEnumRegister("gen-enum-doc", "Generate dialect enum documentation",
-                    [](const RecordKeeper &records, raw_ostream &os) {
-                      emitEnumDoc(records, os);
-                      return false;
-                    });
+    genEnumDocRegister("gen-enum-doc", "Generate dialect enum documentation",
+                       [](const RecordKeeper &records, raw_ostream &os) {
+                         emitEnumDoc(records, os);
+                         return false;
+                       });
 
 static mlir::GenRegistration
-    genRegister("gen-dialect-doc", "Generate dialect documentation",
-                [](const RecordKeeper &records, raw_ostream &os) {
-                  return emitDialectDoc(records, os);
-                });
+    genPassDocRegister("gen-dialect-doc", "Generate dialect documentation",
+                   [](const RecordKeeper &records, raw_ostream &os) {
+                     return emitDialectDoc(records, os);
+                   });
diff --git a/mlir/lib/TableGen/OpInterfacesGen.cpp b/mlir/lib/TableGen/OpInterfacesGen.cpp
index f306e5e8e6e39d..68b75574b1380f 100644
--- a/mlir/lib/TableGen/OpInterfacesGen.cpp
+++ b/mlir/lib/TableGen/OpInterfacesGen.cpp
@@ -589,7 +589,8 @@ void InterfaceGenerator::emitInterfaceDecl(const Interface &interface) {
        << "    auto* interface = getInterfaceFor(base);\n"
        << "    if (!interface)\n"
           "      return false;\n"
-          "    " << interfaceName << " odsInterfaceInstance(base, interface);\n"
+          "    "
+       << interfaceName << " odsInterfaceInstance(base, interface);\n"
        << "    " << tblgen::tgfmt(extraClassOf->trim(), &extraClassOfFmt)
        << "\n  }\n";
   }
@@ -702,7 +703,9 @@ struct InterfaceGenRegistration {
 };
 } // namespace
 
-static InterfaceGenRegistration<AttrInterfaceGenerator> attrGen("attr",
-                                                                "attribute");
-static InterfaceGenRegistration<OpInterfaceGenerator> opGen("op", "op");
-static InterfaceGenRegistration<TypeInterfaceGenerator> typeGen("type", "type");
+static InterfaceGenRegistration<AttrInterfaceGenerator>
+    attrInterfaceGen("attr", "attribute");
+static InterfaceGenRegistration<OpInterfaceGenerator> opInterfaceGen("op",
+                                                                     "op");
+static InterfaceGenRegistration<TypeInterfaceGenerator>
+    typeInterfaceGen("type", "type");
diff --git a/mlir/lib/TableGen/OpPythonBindingGen.cpp b/mlir/lib/TableGen/OpPythonBindingGen.cpp
index 68316ea359261b..ec065526aa9512 100644
--- a/mlir/lib/TableGen/OpPythonBindingGen.cpp
+++ b/mlir/lib/TableGen/OpPythonBindingGen.cpp
@@ -1027,7 +1027,7 @@ static void emitOpBindings(const Operator &op, raw_ostream &os) {
 /// Emits bindings for the dialect specified in the command line, including file
 /// headers and utilities. Returns `false` on success to comply with Tablegen
 /// registration requirements.
-static bool emitAllOps(const RecordKeeper &records, raw_ostream &os) {
+static bool emitAllPythonOps(const RecordKeeper &records, raw_ostream &os) {
   if (clDialectName.empty())
     llvm::PrintFatalError("dialect name not provided");
 
@@ -1047,4 +1047,5 @@ static bool emitAllOps(const RecordKeeper &records, raw_ostream &os) {
 
 static GenRegistration
     genPythonBindings("gen-python-op-bindings",
-                      "Generate Python bindings for MLIR Ops", &emitAllOps);
+                      "Generate Python bindings for MLIR Ops",
+                      &emitAllPythonOps);
diff --git a/mlir/lib/TableGen/PassDocGen.cpp b/mlir/lib/TableGen/PassDocGen.cpp
index 3bf2ba3323d47b..17b7ac4e12c71d 100644
--- a/mlir/lib/TableGen/PassDocGen.cpp
+++ b/mlir/lib/TableGen/PassDocGen.cpp
@@ -57,7 +57,7 @@ static void emitDoc(const Pass &pass, raw_ostream &os) {
   }
 }
 
-static void emitDocs(const RecordKeeper &records, raw_ostream &os) {
+static void emitPassDocs(const RecordKeeper &records, raw_ostream &os) {
   os << "<!-- Autogenerated by mlir-tblgen; don't manually edit -->\n";
   auto passDefs = records.getAllDerivedDefinitions("PassBase");
 
@@ -74,8 +74,8 @@ static void emitDocs(const RecordKeeper &records, raw_ostream &os) {
 }
 
 static mlir::GenRegistration
-    genRegister("gen-pass-doc", "Generate pass documentation",
-                [](const RecordKeeper &records, raw_ostream &os) {
-                  emitDocs(records, os);
-                  return false;
-                });
+    genPassDocRegister("gen-pass-doc", "Generate pass documentation",
+                       [](const RecordKeeper &records, raw_ostream &os) {
+                         emitPassDocs(records, os);
+                         return false;
+                       });
diff --git a/mlir/lib/TableGen/PassGen.cpp b/mlir/lib/TableGen/PassGen.cpp
index 4b4ac41b9effb8..2357058d395bd3 100644
--- a/mlir/lib/TableGen/PassGen.cpp
+++ b/mlir/lib/TableGen/PassGen.cpp
@@ -446,7 +446,7 @@ static void emitOldPassDecl(const Pass &pass, raw_ostream &os) {
   os << "};\n";
 }
 
-static void emitPasses(const RecordKeeper &records, raw_ostream &os) {
+static void emitPassDecls(const RecordKeeper &records, raw_ostream &os) {
   std::vector<Pass> passes = getPasses(records);
   os << "/* Autogenerated by mlir-tblgen; don't manually edit */\n";
 
@@ -476,6 +476,6 @@ static void emitPasses(const RecordKeeper &records, raw_ostream &os) {
 static mlir::GenRegistration
     genPassDecls("gen-pass-decls", "Generate pass declarations",
                  [](const RecordKeeper &records, raw_ostream &os) {
-                   emitPasses(records, os);
+                   emitPassDecls(records, os);
                    return false;
                  });
diff --git a/mlir/lib/TableGen/RewriterGen.cpp b/mlir/lib/TableGen/RewriterGen.cpp
index e2764f8493cd8a..408331ba1247a1 100644
--- a/mlir/lib/TableGen/RewriterGen.cpp
+++ b/mlir/lib/TableGen/RewriterGen.cpp
@@ -614,7 +614,8 @@ void PatternEmitter::emitOpMatch(DagNode tree, StringRef opName, int depth) {
         ++opArgIdx;
         continue;
       }
-      if (auto *operand = llvm::dyn_cast_if_present<NamedTypeConstraint *>(opArg)) {
+      if (auto *operand =
+              llvm::dyn_cast_if_present<NamedTypeConstraint *>(opArg)) {
         if (argTree.isVariadic()) {
           if (!operand->isVariadic()) {
             auto error = formatv("variadic DAG construct can't match op {0}'s "
@@ -1699,8 +1700,8 @@ void PatternEmitter::createSeparateLocalVarsForOpArgs(
 
   int valueIndex = 0; // An index for uniquing local variable names.
   for (int argIndex = 0, e = resultOp.getNumArgs(); argIndex < e; ++argIndex) {
-    const auto *operand =
-        llvm::dyn_cast_if_present<NamedTypeConstraint *>(resultOp.getArg(argIndex));
+    const auto *operand = llvm::dyn_cast_if_present<NamedTypeConstraint *>(
+        resultOp.getArg(argIndex));
     // We do not need special handling for attributes.
     if (!operand)
       continue;
@@ -1755,7 +1756,8 @@ void PatternEmitter::supplyValuesForOpArgs(
 
     Argument opArg = resultOp.getArg(argIndex);
     // Handle the case of operand first.
-    if (auto *operand = llvm::dyn_cast_if_present<NamedTypeConstraint *>(opArg)) {
+    if (auto *operand =
+            llvm::dyn_cast_if_present<NamedTypeConstraint *>(opArg)) {
       if (!operand->name.empty())
         os << "/*" << operand->name << "=*/";
       os << childNodeNames.lookup(argIndex);
diff --git a/mlir/lib/TableGen/SPIRVUtilsGen.cpp b/mlir/lib/TableGen/SPIRVUtilsGen.cpp
index 75286231f5902f..6711ae7a57220e 100644
--- a/mlir/lib/TableGen/SPIRVUtilsGen.cpp
+++ b/mlir/lib/TableGen/SPIRVUtilsGen.cpp
@@ -196,7 +196,8 @@ static void emitInterfaceDef(const Availability &availability,
      << "}\n";
 }
 
-static bool emitInterfaceDefs(const RecordKeeper &records, raw_ostream &os) {
+static bool emitSPRIVInterfaceDefs(const RecordKeeper &records,
+                                   raw_ostream &os) {
   llvm::emitSourceFileHeader("Availability Interface Definitions", os, records);
 
   auto defs = records.getAllDerivedDefinitions("Availability");
@@ -284,7 +285,8 @@ static void emitInterfaceDecl(const Availability &availability,
   os << "};\n\n";
 }
 
-static bool emitInterfaceDecls(const RecordKeeper &records, raw_ostream &os) {
+static bool emitSPRIVInterfaceDecls(const RecordKeeper &records,
+                                    raw_ostream &os) {
   llvm::emitSourceFileHeader("Availability Interface Declarations", os,
                              records);
 
@@ -313,19 +315,19 @@ static bool emitInterfaceDecls(const RecordKeeper &records, raw_ostream &os) {
 
 // Registers the operation interface generator to mlir-tblgen.
 static mlir::GenRegistration
-    genInterfaceDecls("gen-avail-interface-decls",
-                      "Generate availability interface declarations",
-                      [](const RecordKeeper &records, raw_ostream &os) {
-                        return emitInterfaceDecls(records, os);
-                      });
+    genSPIRVInterfaceDecls("gen-avail-interface-decls",
+                           "Generate availability interface declarations",
+                           [](const RecordKeeper &records, raw_ostream &os) {
+                             return emitSPRIVInterfaceDecls(records, os);
+                           });
 
 // Registers the operation interface generator to mlir-tblgen.
 static mlir::GenRegistration
-    genInterfaceDefs("gen-avail-interface-defs",
-                     "Generate op interface definitions",
-                     [](const RecordKeeper &records, raw_ostream &os) {
-                       return emitInterfaceDefs(records, os);
-                     });
+    genSPIRVInterfaceDefs("gen-avail-interface-defs",
+                          "Generate op interface definitions",
+                          [](const RecordKeeper &records, raw_ostream &os) {
+                            return emitSPRIVInterfaceDefs(records, os);
+                          });
 
 //===----------------------------------------------------------------------===//
 // Enum Availability Query AutoGen
@@ -397,10 +399,9 @@ static void emitAvailabilityQueryForBitEnum(const Record &enumDef,
                   avail.getMergeInstanceType(), avail.getQueryFnName(),
                   enumName);
 
-    os << formatv(
-        "  assert(::llvm::popcount(static_cast<{0}>(value)) <= 1"
-        " && \"cannot have more than one bit set\");\n",
-        underlyingType);
+    os << formatv("  assert(::llvm::popcount(static_cast<{0}>(value)) <= 1"
+                  " && \"cannot have more than one bit set\");\n",
+                  underlyingType);
 
     os << "  switch (value) {\n";
     for (const auto &caseSpecPair : classCasePair.getValue()) {
@@ -448,7 +449,7 @@ static void emitEnumDecl(const Record &enumDef, raw_ostream &os) {
     os << "} // namespace " << ns << "\n";
 }
 
-static bool emitEnumDecls(const RecordKeeper &records, raw_ostream &os) {
+static bool emitSPRIVEnumDecls(const RecordKeeper &records, raw_ostream &os) {
   llvm::emitSourceFileHeader("SPIR-V Enum Availability Declarations", os,
                              records);
 
@@ -480,7 +481,7 @@ static void emitEnumDef(const Record &enumDef, raw_ostream &os) {
   os << "\n";
 }
 
-static bool emitEnumDefs(const RecordKeeper &records, raw_ostream &os) {
+static bool emitSPIRVEnumDefs(const RecordKeeper &records, raw_ostream &os) {
   llvm::emitSourceFileHeader("SPIR-V Enum Availability Definitions", os,
                              records);
 
@@ -497,19 +498,19 @@ static bool emitEnumDefs(const RecordKeeper &records, raw_ostream &os) {
 
 // Registers the enum utility generator to mlir-tblgen.
 static mlir::GenRegistration
-    genEnumDecls("gen-spirv-enum-avail-decls",
-                 "Generate SPIR-V enum availability declarations",
-                 [](const RecordKeeper &records, raw_ostream &os) {
-                   return emitEnumDecls(records, os);
-                 });
+    genSPIRVEnumDecls("gen-spirv-enum-avail-decls",
+                      "Generate SPIR-V enum availability declarations",
+                      [](const RecordKeeper &records, raw_ostream &os) {
+                        return emitSPRIVEnumDecls(records, os);
+                      });
 
 // Registers the enum utility generator to mlir-tblgen.
 static mlir::GenRegistration
-    genEnumDefs("gen-spirv-enum-avail-defs",
-                "Generate SPIR-V enum availability definitions",
-                [](const RecordKeeper &records, raw_ostream &os) {
-                  return emitEnumDefs(records, os);
-                });
+    genSPIRVEnumDefs("gen-spirv-enum-avail-defs",
+                     "Generate SPIR-V enum availability definitions",
+                     [](const RecordKeeper &records, raw_ostream &os) {
+                       return emitSPIRVEnumDefs(records, os);
+                     });
 
 //===----------------------------------------------------------------------===//
 // Serialization AutoGen
@@ -933,7 +934,8 @@ static void emitOperandDeserialization(const Operator &op, ArrayRef<SMLoc> loc,
   // Process operands/attributes
   for (unsigned i = 0, e = op.getNumArgs(); i < e; ++i) {
     auto argument = op.getArg(i);
-    if (auto *valueArg = llvm::dyn_cast_if_present<NamedTypeConstraint *>(argument)) {
+    if (auto *valueArg =
+            llvm::dyn_cast_if_present<NamedTypeConstraint *>(argument)) {
       if (valueArg->isVariableLength()) {
         if (i != e - 1) {
           PrintFatalError(
@@ -1176,7 +1178,8 @@ static void emitExtendedSetDeserializationDispatch(const RecordKeeper &records,
 
 /// Emits all the autogenerated serialization/deserializations functions for the
 /// SPIRV_Ops.
-static bool emitSerializationFns(const RecordKeeper &records, raw_ostream &os) {
+static bool emitSPIRVSerializationFns(const RecordKeeper &records,
+                                      raw_ostream &os) {
   llvm::emitSourceFileHeader("SPIR-V Serialization Utilities/Functions", os,
                              records);
 
@@ -1228,11 +1231,11 @@ static bool emitSerializationFns(const RecordKeeper &records, raw_ostream &os) {
 // Serialization Hook Registration
 //===----------------------------------------------------------------------===//
 
-static mlir::GenRegistration genSerialization(
+static mlir::GenRegistration genSPIRVSerialization(
     "gen-spirv-serialization",
     "Generate SPIR-V (de)serialization utilities and functions",
     [](const RecordKeeper &records, raw_ostream &os) {
-      return emitSerializationFns(records, os);
+      return emitSPIRVSerializationFns(records, os);
     });
 
 //===----------------------------------------------------------------------===//
@@ -1256,7 +1259,7 @@ static void emitEnumGetAttrNameFnDefn(const EnumAttr &enumAttr,
   os << "}\n";
 }
 
-static bool emitAttrUtils(const RecordKeeper &records, raw_ostream &os) {
+static bool emitSPIRVAttrUtils(const RecordKeeper &records, raw_ostream &os) {
   llvm::emitSourceFileHeader("SPIR-V Attribute Utilities", os, records);
 
   auto defs = records.getAllDerivedDefinitions("EnumAttrInfo");
@@ -1276,17 +1279,17 @@ static bool emitAttrUtils(const RecordKeeper &records, raw_ostream &os) {
 //===----------------------------------------------------------------------===//
 
 static mlir::GenRegistration
-    genOpUtils("gen-spirv-attr-utils",
-               "Generate SPIR-V attribute utility definitions",
-               [](const RecordKeeper &records, raw_ostream &os) {
-                 return emitAttrUtils(records, os);
-               });
+    genSPIRVAttrUtils("gen-spirv-attr-utils",
+                      "Generate SPIR-V attribute utility definitions",
+                      [](const RecordKeeper &records, raw_ostream &os) {
+                        return emitSPIRVAttrUtils(records, os);
+                      });
 
 //===----------------------------------------------------------------------===//
 // SPIR-V Availability Impl AutoGen
 //===----------------------------------------------------------------------===//
 
-static void emitAvailabilityImpl(const Operator &srcOp, raw_ostream &os) {
+static void emitSPIRVAvailabilityImpl(const Operator &srcOp, raw_ostream &os) {
   mlir::tblgen::FmtContext fctx;
   fctx.addSubst("overall", "tblgen_overall");
 
@@ -1400,7 +1403,8 @@ static void emitAvailabilityImpl(const Operator &srcOp, raw_ostream &os) {
   }
 }
 
-static bool emitAvailabilityImpl(const RecordKeeper &records, raw_ostream &os) {
+static bool emitSPIRVAvailabilityImpl(const RecordKeeper &records,
+                                      raw_ostream &os) {
   llvm::emitSourceFileHeader("SPIR-V Op Availability Implementations", os,
                              records);
 
@@ -1408,7 +1412,7 @@ static bool emitAvailabilityImpl(const RecordKeeper &records, raw_ostream &os) {
   for (const auto *def : defs) {
     Operator op(def);
     if (def->getValueAsBit("autogenAvailability"))
-      emitAvailabilityImpl(op, os);
+      emitSPIRVAvailabilityImpl(op, os);
   }
   return false;
 }
@@ -1418,18 +1422,18 @@ static bool emitAvailabilityImpl(const RecordKeeper &records, raw_ostream &os) {
 //===----------------------------------------------------------------------===//
 
 static mlir::GenRegistration
-    genOpAvailabilityImpl("gen-spirv-avail-impls",
-                          "Generate SPIR-V operation utility definitions",
-                          [](const RecordKeeper &records, raw_ostream &os) {
-                            return emitAvailabilityImpl(records, os);
-                          });
+    genSPIRVAvailabilityImpl("gen-spirv-avail-impls",
+                             "Generate SPIR-V operation utility definitions",
+                             [](const RecordKeeper &records, raw_ostream &os) {
+                               return emitSPIRVAvailabilityImpl(records, os);
+                             });
 
 //===----------------------------------------------------------------------===//
 // SPIR-V Capability Implication AutoGen
 //===----------------------------------------------------------------------===//
 
-static bool emitCapabilityImplication(const RecordKeeper &records,
-                                      raw_ostream &os) {
+static bool emitSPIRVCapabilityImplication(const RecordKeeper &records,
+                                           raw_ostream &os) {
   llvm::emitSourceFileHeader("SPIR-V Capability Implication", os, records);
 
   EnumAttr enumAttr(
@@ -1465,10 +1469,10 @@ static bool emitCapabilityImplication(const RecordKeeper &records,
 // SPIR-V Capability Implication Hook Registration
 //===----------------------------------------------------------------------===//
 
-static mlir::GenRegistration
-    genCapabilityImplication("gen-spirv-capability-implication",
-                             "Generate utility function to return implied "
-                             "capabilities for a given capability",
-                             [](const RecordKeeper &records, raw_ostream &os) {
-                               return emitCapabilityImplication(records, os);
-                             });
+static mlir::GenRegistration genSPIRVCapabilityImplication(
+    "gen-spirv-capability-implication",
+    "Generate utility function to return implied "
+    "capabilities for a given capability",
+    [](const RecordKeeper &records, raw_ostream &os) {
+      return emitSPIRVCapabilityImplication(records, os);
+    });

>From fbdc59b4fe4a7d81e9052956fbb674a09e40616c Mon Sep 17 00:00:00 2001
From: Maksim Levental <maksim.levental at gmail.com>
Date: Sat, 26 Oct 2024 17:28:19 -0400
Subject: [PATCH 04/27] move registration hooks (doesn't compile)

---
 mlir/lib/TableGen/AttrOrTypeDefGen.cpp     |  65 +---
 mlir/lib/TableGen/BytecodeDialectGen.cpp   |   6 -
 mlir/lib/TableGen/DialectGen.cpp           |  18 +-
 mlir/lib/TableGen/DirectiveCommonGen.cpp   |  15 -
 mlir/lib/TableGen/EnumPythonBindingGen.cpp |   6 -
 mlir/lib/TableGen/EnumsGen.cpp             |  14 -
 mlir/lib/TableGen/LLVMIRConversionGen.cpp  |  30 --
 mlir/lib/TableGen/LLVMIRIntrinsicGen.cpp   |   4 -
 mlir/lib/TableGen/OmpOpGen.cpp             |  11 -
 mlir/lib/TableGen/OpDefinitionsGen.cpp     |  12 -
 mlir/lib/TableGen/OpDocGen.cpp             |  39 --
 mlir/lib/TableGen/OpInterfacesGen.cpp      |  40 --
 mlir/lib/TableGen/OpPythonBindingGen.cpp   |   5 -
 mlir/lib/TableGen/PassCAPIGen.cpp          |   8 -
 mlir/lib/TableGen/PassDocGen.cpp           |   7 -
 mlir/lib/TableGen/PassGen.cpp              |   7 -
 mlir/lib/TableGen/RewriterGen.cpp          |   7 -
 mlir/lib/TableGen/SPIRVUtilsGen.cpp        |  85 -----
 mlir/tools/mlir-tblgen/mlir-tblgen.cpp     | 406 +++++++++++++++++++++
 19 files changed, 408 insertions(+), 377 deletions(-)

diff --git a/mlir/lib/TableGen/AttrOrTypeDefGen.cpp b/mlir/lib/TableGen/AttrOrTypeDefGen.cpp
index e71fd8772e4c88..ff80752e5a0b32 100644
--- a/mlir/lib/TableGen/AttrOrTypeDefGen.cpp
+++ b/mlir/lib/TableGen/AttrOrTypeDefGen.cpp
@@ -6,8 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "mlir/TableGen/AttrOrTypeFormatGen.h"
 #include "mlir/TableGen/AttrOrTypeDef.h"
+#include "mlir/TableGen/AttrOrTypeFormatGen.h"
 #include "mlir/TableGen/Class.h"
 #include "mlir/TableGen/CodeGenHelpers.h"
 #include "mlir/TableGen/Format.h"
@@ -1073,66 +1073,3 @@ bool {0}(::mlir::Type type) {
     os << strfmt(typeConstraintDef, *constr.getCppFunctionName(), condition);
   }
 }
-
-//===----------------------------------------------------------------------===//
-// GEN: Registration hooks
-//===----------------------------------------------------------------------===//
-
-//===----------------------------------------------------------------------===//
-// AttrDef
-
-static llvm::cl::OptionCategory attrdefGenCat("Options for -gen-attrdef-*");
-static llvm::cl::opt<std::string>
-    attrDialect("attrdefs-dialect",
-                llvm::cl::desc("Generate attributes for this dialect"),
-                llvm::cl::cat(attrdefGenCat), llvm::cl::CommaSeparated);
-
-static mlir::GenRegistration
-    genAttrDefs("gen-attrdef-defs", "Generate AttrDef definitions",
-                [](const RecordKeeper &records, raw_ostream &os) {
-                  AttrDefGenerator generator(records, os);
-                  return generator.emitDefs(attrDialect);
-                });
-static mlir::GenRegistration
-    genAttrDecls("gen-attrdef-decls", "Generate AttrDef declarations",
-                 [](const RecordKeeper &records, raw_ostream &os) {
-                   AttrDefGenerator generator(records, os);
-                   return generator.emitDecls(attrDialect);
-                 });
-
-//===----------------------------------------------------------------------===//
-// TypeDef
-
-static llvm::cl::OptionCategory typedefGenCat("Options for -gen-typedef-*");
-static llvm::cl::opt<std::string>
-    typeDialect("typedefs-dialect",
-                llvm::cl::desc("Generate types for this dialect"),
-                llvm::cl::cat(typedefGenCat), llvm::cl::CommaSeparated);
-
-static mlir::GenRegistration
-    genTypeDefs("gen-typedef-defs", "Generate TypeDef definitions",
-                [](const RecordKeeper &records, raw_ostream &os) {
-                  TypeDefGenerator generator(records, os);
-                  return generator.emitDefs(typeDialect);
-                });
-static mlir::GenRegistration
-    genTypeDecls("gen-typedef-decls", "Generate TypeDef declarations",
-                 [](const RecordKeeper &records, raw_ostream &os) {
-                   TypeDefGenerator generator(records, os);
-                   return generator.emitDecls(typeDialect);
-                 });
-
-static mlir::GenRegistration
-    genTypeConstrDefs("gen-type-constraint-defs",
-                      "Generate type constraint definitions",
-                      [](const RecordKeeper &records, raw_ostream &os) {
-                        emitTypeConstraintDefs(records, os);
-                        return false;
-                      });
-static mlir::GenRegistration
-    genTypeConstrDecls("gen-type-constraint-decls",
-                       "Generate type constraint declarations",
-                       [](const RecordKeeper &records, raw_ostream &os) {
-                         emitTypeConstraintDecls(records, os);
-                         return false;
-                       });
diff --git a/mlir/lib/TableGen/BytecodeDialectGen.cpp b/mlir/lib/TableGen/BytecodeDialectGen.cpp
index d7967c7a77534d..c48f93f6987037 100644
--- a/mlir/lib/TableGen/BytecodeDialectGen.cpp
+++ b/mlir/lib/TableGen/BytecodeDialectGen.cpp
@@ -484,9 +484,3 @@ static bool emitBCRW(const RecordKeeper &records, raw_ostream &os) {
 
   return false;
 }
-
-static mlir::GenRegistration
-    genBCRW("gen-bytecode", "Generate dialect bytecode readers/writers",
-            [](const RecordKeeper &records, raw_ostream &os) {
-              return emitBCRW(records, os);
-            });
diff --git a/mlir/lib/TableGen/DialectGen.cpp b/mlir/lib/TableGen/DialectGen.cpp
index 1e8ab8f2576e79..a03ce4a404c9ee 100644
--- a/mlir/lib/TableGen/DialectGen.cpp
+++ b/mlir/lib/TableGen/DialectGen.cpp
@@ -10,9 +10,9 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "mlir/TableGen/DialectGenUtilities.h"
 #include "mlir/TableGen/Class.h"
 #include "mlir/TableGen/CodeGenHelpers.h"
+#include "mlir/TableGen/DialectGenUtilities.h"
 #include "mlir/TableGen/Format.h"
 #include "mlir/TableGen/GenInfo.h"
 #include "mlir/TableGen/Interfaces.h"
@@ -404,19 +404,3 @@ static bool emitDialectDefs(const RecordKeeper &records, raw_ostream &os) {
   emitDialectDef(*dialect, records, os);
   return false;
 }
-
-//===----------------------------------------------------------------------===//
-// GEN: Dialect registration hooks
-//===----------------------------------------------------------------------===//
-
-static mlir::GenRegistration
-    genDialectDecls("gen-dialect-decls", "Generate dialect declarations",
-                    [](const RecordKeeper &records, raw_ostream &os) {
-                      return emitDialectDecls(records, os);
-                    });
-
-static mlir::GenRegistration
-    genDialectDefs("gen-dialect-defs", "Generate dialect definitions",
-                   [](const RecordKeeper &records, raw_ostream &os) {
-                     return emitDialectDefs(records, os);
-                   });
diff --git a/mlir/lib/TableGen/DirectiveCommonGen.cpp b/mlir/lib/TableGen/DirectiveCommonGen.cpp
index c9693f13bdfc36..7d6a3688a63aa0 100644
--- a/mlir/lib/TableGen/DirectiveCommonGen.cpp
+++ b/mlir/lib/TableGen/DirectiveCommonGen.cpp
@@ -95,18 +95,3 @@ static bool emitDirectiveDecls(const RecordKeeper &records,
   }
   return false;
 }
-
-static llvm::cl::OptionCategory
-    directiveGenCat("Options for gen-directive-decl");
-static llvm::cl::opt<std::string>
-    dialect("directives-dialect",
-            llvm::cl::desc("Generate directives for this dialect"),
-            llvm::cl::cat(directiveGenCat), llvm::cl::CommaSeparated);
-
-// Registers the generator to mlir-tblgen.
-static mlir::GenRegistration genDirectiveDecls(
-    "gen-directive-decl",
-    "Generate declarations for directives (OpenMP/OpenACC etc.)",
-    [](const RecordKeeper &records, raw_ostream &os) {
-      return emitDirectiveDecls(records, dialect, os);
-    });
diff --git a/mlir/lib/TableGen/EnumPythonBindingGen.cpp b/mlir/lib/TableGen/EnumPythonBindingGen.cpp
index e5f13ce4de3b08..b063a1ec6c8e82 100644
--- a/mlir/lib/TableGen/EnumPythonBindingGen.cpp
+++ b/mlir/lib/TableGen/EnumPythonBindingGen.cpp
@@ -168,9 +168,3 @@ static bool emitPythonEnums(const RecordKeeper &records, raw_ostream &os) {
 
   return false;
 }
-
-// Registers the enum utility generator to mlir-tblgen.
-static mlir::GenRegistration
-    genPythonEnumBindings("gen-python-enum-bindings",
-                          "Generate Python bindings for enum attributes",
-                          &emitPythonEnums);
diff --git a/mlir/lib/TableGen/EnumsGen.cpp b/mlir/lib/TableGen/EnumsGen.cpp
index 82339bb08a132e..244a97e5a6d350 100644
--- a/mlir/lib/TableGen/EnumsGen.cpp
+++ b/mlir/lib/TableGen/EnumsGen.cpp
@@ -688,17 +688,3 @@ static bool emitEnumDefs(const RecordKeeper &records, raw_ostream &os) {
 
   return false;
 }
-
-// Registers the enum utility generator to mlir-tblgen.
-static mlir::GenRegistration
-    genEnumDecls("gen-enum-decls", "Generate enum utility declarations",
-                 [](const RecordKeeper &records, raw_ostream &os) {
-                   return emitEnumDecls(records, os);
-                 });
-
-// Registers the enum utility generator to mlir-tblgen.
-static mlir::GenRegistration
-    genEnumDefs("gen-enum-defs", "Generate enum utility definitions",
-                [](const RecordKeeper &records, raw_ostream &os) {
-                  return emitEnumDefs(records, os);
-                });
diff --git a/mlir/lib/TableGen/LLVMIRConversionGen.cpp b/mlir/lib/TableGen/LLVMIRConversionGen.cpp
index d057cf3255ed66..2cbcb19e294fa7 100644
--- a/mlir/lib/TableGen/LLVMIRConversionGen.cpp
+++ b/mlir/lib/TableGen/LLVMIRConversionGen.cpp
@@ -566,33 +566,3 @@ static bool emitConvertibleLLVMIRIntrinsics(const RecordKeeper &records,
 
   return false;
 }
-
-static mlir::GenRegistration
-    genLLVMIRConversions("gen-llvmir-conversions",
-                         "Generate LLVM IR conversions",
-                         emitLLVMIRConversionBuilders);
-
-static mlir::GenRegistration genOpFromLLVMIRConversions(
-    "gen-op-from-llvmir-conversions",
-    "Generate conversions of operations from LLVM IR",
-    emitLLVMIROpMLIRBuilders);
-
-static mlir::GenRegistration genIntrFromLLVMIRConversions(
-    "gen-intr-from-llvmir-conversions",
-    "Generate conversions of intrinsics from LLVM IR",
-    emitLLVMIRIntrMLIRBuilders);
-
-static mlir::GenRegistration
-    genEnumToLLVMConversion("gen-enum-to-llvmir-conversions",
-                            "Generate conversions of EnumAttrs to LLVM IR",
-                            emitLLVMIREnumConversionDefs</*ConvertTo=*/true>);
-
-static mlir::GenRegistration genEnumFromLLVMConversion(
-    "gen-enum-from-llvmir-conversions",
-    "Generate conversions of EnumAttrs from LLVM IR",
-    emitLLVMIREnumConversionDefs</*ConvertTo=*/false>);
-
-static mlir::GenRegistration genConvertibleLLVMIRIntrinsics(
-    "gen-convertible-llvmir-intrinsics",
-    "Generate list of convertible LLVM IR intrinsics",
-    emitConvertibleLLVMIRIntrinsics);
diff --git a/mlir/lib/TableGen/LLVMIRIntrinsicGen.cpp b/mlir/lib/TableGen/LLVMIRIntrinsicGen.cpp
index fa43dd8cd498bf..3c9d71d8934b80 100644
--- a/mlir/lib/TableGen/LLVMIRIntrinsicGen.cpp
+++ b/mlir/lib/TableGen/LLVMIRIntrinsicGen.cpp
@@ -266,7 +266,3 @@ static bool emitLLVMIRIntrinsics(const RecordKeeper &records,
 
   return false;
 }
-
-static mlir::GenRegistration genLLVMIRIntrinsics("gen-llvmir-intrinsics",
-                                                 "Generate LLVM IR intrinsics",
-                                                 emitLLVMIRIntrinsics);
diff --git a/mlir/lib/TableGen/OmpOpGen.cpp b/mlir/lib/TableGen/OmpOpGen.cpp
index b9988dfdffd5eb..4d92b2b2cbc645 100644
--- a/mlir/lib/TableGen/OmpOpGen.cpp
+++ b/mlir/lib/TableGen/OmpOpGen.cpp
@@ -355,14 +355,3 @@ static bool genOpenmpClauseOps(const RecordKeeper &records, raw_ostream &os) {
 
   return false;
 }
-
-// Registers the generator to mlir-tblgen.
-static mlir::GenRegistration
-    verifyOpenmpOps("verify-openmp-ops",
-                    "Verify OpenMP operations (produce no output file)",
-                    verifyOpenmpDecls);
-
-static mlir::GenRegistration
-    regOpenmpClauseOps("gen-openmp-clause-ops",
-                       "Generate OpenMP clause operand structures",
-                       genOpenmpClauseOps);
diff --git a/mlir/lib/TableGen/OpDefinitionsGen.cpp b/mlir/lib/TableGen/OpDefinitionsGen.cpp
index 4616a07163ea64..1d0632247c306f 100644
--- a/mlir/lib/TableGen/OpDefinitionsGen.cpp
+++ b/mlir/lib/TableGen/OpDefinitionsGen.cpp
@@ -4708,15 +4708,3 @@ static bool emitOpDefs(const RecordKeeper &records, raw_ostream &os) {
   }
   return false;
 }
-
-static mlir::GenRegistration
-    genOpDecls("gen-op-decls", "Generate op declarations",
-               [](const RecordKeeper &records, raw_ostream &os) {
-                 return emitOpDecls(records, os);
-               });
-
-static mlir::GenRegistration genOpDefs("gen-op-defs", "Generate op definitions",
-                                       [](const RecordKeeper &records,
-                                          raw_ostream &os) {
-                                         return emitOpDefs(records, os);
-                                       });
diff --git a/mlir/lib/TableGen/OpDocGen.cpp b/mlir/lib/TableGen/OpDocGen.cpp
index 95841eac041ba7..7831126c2e1a89 100644
--- a/mlir/lib/TableGen/OpDocGen.cpp
+++ b/mlir/lib/TableGen/OpDocGen.cpp
@@ -603,42 +603,3 @@ static bool emitDialectDoc(const RecordKeeper &records, raw_ostream &os) {
                  dialectEnums, os);
   return false;
 }
-
-//===----------------------------------------------------------------------===//
-// Gen Registration
-//===----------------------------------------------------------------------===//
-
-static mlir::GenRegistration
-    genAttrDocRegister("gen-attrdef-doc",
-                       "Generate dialect attribute documentation",
-                       [](const RecordKeeper &records, raw_ostream &os) {
-                         emitAttrOrTypeDefDoc(records, os, "AttrDef");
-                         return false;
-                       });
-
-static mlir::GenRegistration
-    genOpDocRegister("gen-op-doc", "Generate dialect documentation",
-                     [](const RecordKeeper &records, raw_ostream &os) {
-                       emitOpDoc(records, os);
-                       return false;
-                     });
-
-static mlir::GenRegistration
-    genTypeDocRegister("gen-typedef-doc", "Generate dialect type documentation",
-                       [](const RecordKeeper &records, raw_ostream &os) {
-                         emitAttrOrTypeDefDoc(records, os, "TypeDef");
-                         return false;
-                       });
-
-static mlir::GenRegistration
-    genEnumDocRegister("gen-enum-doc", "Generate dialect enum documentation",
-                       [](const RecordKeeper &records, raw_ostream &os) {
-                         emitEnumDoc(records, os);
-                         return false;
-                       });
-
-static mlir::GenRegistration
-    genPassDocRegister("gen-dialect-doc", "Generate dialect documentation",
-                   [](const RecordKeeper &records, raw_ostream &os) {
-                     return emitDialectDoc(records, os);
-                   });
diff --git a/mlir/lib/TableGen/OpInterfacesGen.cpp b/mlir/lib/TableGen/OpInterfacesGen.cpp
index 68b75574b1380f..e2cf18e0318e13 100644
--- a/mlir/lib/TableGen/OpInterfacesGen.cpp
+++ b/mlir/lib/TableGen/OpInterfacesGen.cpp
@@ -669,43 +669,3 @@ bool InterfaceGenerator::emitInterfaceDocs() {
     emitInterfaceDoc(*def, os);
   return false;
 }
-
-//===----------------------------------------------------------------------===//
-// GEN: Interface registration hooks
-//===----------------------------------------------------------------------===//
-
-namespace {
-template <typename GeneratorT>
-struct InterfaceGenRegistration {
-  InterfaceGenRegistration(StringRef genArg, StringRef genDesc)
-      : genDeclArg(("gen-" + genArg + "-interface-decls").str()),
-        genDefArg(("gen-" + genArg + "-interface-defs").str()),
-        genDocArg(("gen-" + genArg + "-interface-docs").str()),
-        genDeclDesc(("Generate " + genDesc + " interface declarations").str()),
-        genDefDesc(("Generate " + genDesc + " interface definitions").str()),
-        genDocDesc(("Generate " + genDesc + " interface documentation").str()),
-        genDecls(genDeclArg, genDeclDesc,
-                 [](const RecordKeeper &records, raw_ostream &os) {
-                   return GeneratorT(records, os).emitInterfaceDecls();
-                 }),
-        genDefs(genDefArg, genDefDesc,
-                [](const RecordKeeper &records, raw_ostream &os) {
-                  return GeneratorT(records, os).emitInterfaceDefs();
-                }),
-        genDocs(genDocArg, genDocDesc,
-                [](const RecordKeeper &records, raw_ostream &os) {
-                  return GeneratorT(records, os).emitInterfaceDocs();
-                }) {}
-
-  std::string genDeclArg, genDefArg, genDocArg;
-  std::string genDeclDesc, genDefDesc, genDocDesc;
-  mlir::GenRegistration genDecls, genDefs, genDocs;
-};
-} // namespace
-
-static InterfaceGenRegistration<AttrInterfaceGenerator>
-    attrInterfaceGen("attr", "attribute");
-static InterfaceGenRegistration<OpInterfaceGenerator> opInterfaceGen("op",
-                                                                     "op");
-static InterfaceGenRegistration<TypeInterfaceGenerator>
-    typeInterfaceGen("type", "type");
diff --git a/mlir/lib/TableGen/OpPythonBindingGen.cpp b/mlir/lib/TableGen/OpPythonBindingGen.cpp
index ec065526aa9512..db1e76c5a9899e 100644
--- a/mlir/lib/TableGen/OpPythonBindingGen.cpp
+++ b/mlir/lib/TableGen/OpPythonBindingGen.cpp
@@ -1044,8 +1044,3 @@ static bool emitAllPythonOps(const RecordKeeper &records, raw_ostream &os) {
   }
   return false;
 }
-
-static GenRegistration
-    genPythonBindings("gen-python-op-bindings",
-                      "Generate Python bindings for MLIR Ops",
-                      &emitAllPythonOps);
diff --git a/mlir/lib/TableGen/PassCAPIGen.cpp b/mlir/lib/TableGen/PassCAPIGen.cpp
index 8c13c9b0313352..e853e12908564b 100644
--- a/mlir/lib/TableGen/PassCAPIGen.cpp
+++ b/mlir/lib/TableGen/PassCAPIGen.cpp
@@ -111,11 +111,3 @@ static bool emitCAPIImpl(const RecordKeeper &records, raw_ostream &os) {
   }
   return false;
 }
-
-static mlir::GenRegistration genCAPIHeader("gen-pass-capi-header",
-                                           "Generate pass C API header",
-                                           &emitCAPIHeader);
-
-static mlir::GenRegistration genCAPIImpl("gen-pass-capi-impl",
-                                         "Generate pass C API implementation",
-                                         &emitCAPIImpl);
diff --git a/mlir/lib/TableGen/PassDocGen.cpp b/mlir/lib/TableGen/PassDocGen.cpp
index 17b7ac4e12c71d..5e25f1dc763d1b 100644
--- a/mlir/lib/TableGen/PassDocGen.cpp
+++ b/mlir/lib/TableGen/PassDocGen.cpp
@@ -72,10 +72,3 @@ static void emitPassDocs(const RecordKeeper &records, raw_ostream &os) {
   for (Pass *pass : sortedPasses)
     emitDoc(*pass, os);
 }
-
-static mlir::GenRegistration
-    genPassDocRegister("gen-pass-doc", "Generate pass documentation",
-                       [](const RecordKeeper &records, raw_ostream &os) {
-                         emitPassDocs(records, os);
-                         return false;
-                       });
diff --git a/mlir/lib/TableGen/PassGen.cpp b/mlir/lib/TableGen/PassGen.cpp
index 2357058d395bd3..5ab3933150259f 100644
--- a/mlir/lib/TableGen/PassGen.cpp
+++ b/mlir/lib/TableGen/PassGen.cpp
@@ -472,10 +472,3 @@ static void emitPassDecls(const RecordKeeper &records, raw_ostream &os) {
   os << "#undef GEN_PASS_CLASSES\n";
   os << "#endif // GEN_PASS_CLASSES\n";
 }
-
-static mlir::GenRegistration
-    genPassDecls("gen-pass-decls", "Generate pass declarations",
-                 [](const RecordKeeper &records, raw_ostream &os) {
-                   emitPassDecls(records, os);
-                   return false;
-                 });
diff --git a/mlir/lib/TableGen/RewriterGen.cpp b/mlir/lib/TableGen/RewriterGen.cpp
index 408331ba1247a1..449dfce7f16b82 100644
--- a/mlir/lib/TableGen/RewriterGen.cpp
+++ b/mlir/lib/TableGen/RewriterGen.cpp
@@ -2000,10 +2000,3 @@ static void emitRewriters(const RecordKeeper &records, raw_ostream &os) {
   }
   os << "}\n";
 }
-
-static mlir::GenRegistration
-    genRewriters("gen-rewriters", "Generate pattern rewriters",
-                 [](const RecordKeeper &records, raw_ostream &os) {
-                   emitRewriters(records, os);
-                   return false;
-                 });
diff --git a/mlir/lib/TableGen/SPIRVUtilsGen.cpp b/mlir/lib/TableGen/SPIRVUtilsGen.cpp
index 6711ae7a57220e..18f6fbd389178b 100644
--- a/mlir/lib/TableGen/SPIRVUtilsGen.cpp
+++ b/mlir/lib/TableGen/SPIRVUtilsGen.cpp
@@ -309,26 +309,6 @@ static bool emitSPRIVInterfaceDecls(const RecordKeeper &records,
   return false;
 }
 
-//===----------------------------------------------------------------------===//
-// Availability Interface Hook Registration
-//===----------------------------------------------------------------------===//
-
-// Registers the operation interface generator to mlir-tblgen.
-static mlir::GenRegistration
-    genSPIRVInterfaceDecls("gen-avail-interface-decls",
-                           "Generate availability interface declarations",
-                           [](const RecordKeeper &records, raw_ostream &os) {
-                             return emitSPRIVInterfaceDecls(records, os);
-                           });
-
-// Registers the operation interface generator to mlir-tblgen.
-static mlir::GenRegistration
-    genSPIRVInterfaceDefs("gen-avail-interface-defs",
-                          "Generate op interface definitions",
-                          [](const RecordKeeper &records, raw_ostream &os) {
-                            return emitSPRIVInterfaceDefs(records, os);
-                          });
-
 //===----------------------------------------------------------------------===//
 // Enum Availability Query AutoGen
 //===----------------------------------------------------------------------===//
@@ -492,26 +472,6 @@ static bool emitSPIRVEnumDefs(const RecordKeeper &records, raw_ostream &os) {
   return false;
 }
 
-//===----------------------------------------------------------------------===//
-// Enum Availability Query Hook Registration
-//===----------------------------------------------------------------------===//
-
-// Registers the enum utility generator to mlir-tblgen.
-static mlir::GenRegistration
-    genSPIRVEnumDecls("gen-spirv-enum-avail-decls",
-                      "Generate SPIR-V enum availability declarations",
-                      [](const RecordKeeper &records, raw_ostream &os) {
-                        return emitSPRIVEnumDecls(records, os);
-                      });
-
-// Registers the enum utility generator to mlir-tblgen.
-static mlir::GenRegistration
-    genSPIRVEnumDefs("gen-spirv-enum-avail-defs",
-                     "Generate SPIR-V enum availability definitions",
-                     [](const RecordKeeper &records, raw_ostream &os) {
-                       return emitSPIRVEnumDefs(records, os);
-                     });
-
 //===----------------------------------------------------------------------===//
 // Serialization AutoGen
 //===----------------------------------------------------------------------===//
@@ -1227,17 +1187,6 @@ static bool emitSPIRVSerializationFns(const RecordKeeper &records,
   return false;
 }
 
-//===----------------------------------------------------------------------===//
-// Serialization Hook Registration
-//===----------------------------------------------------------------------===//
-
-static mlir::GenRegistration genSPIRVSerialization(
-    "gen-spirv-serialization",
-    "Generate SPIR-V (de)serialization utilities and functions",
-    [](const RecordKeeper &records, raw_ostream &os) {
-      return emitSPIRVSerializationFns(records, os);
-    });
-
 //===----------------------------------------------------------------------===//
 // Op Utils AutoGen
 //===----------------------------------------------------------------------===//
@@ -1274,17 +1223,6 @@ static bool emitSPIRVAttrUtils(const RecordKeeper &records, raw_ostream &os) {
   return false;
 }
 
-//===----------------------------------------------------------------------===//
-// Op Utils Hook Registration
-//===----------------------------------------------------------------------===//
-
-static mlir::GenRegistration
-    genSPIRVAttrUtils("gen-spirv-attr-utils",
-                      "Generate SPIR-V attribute utility definitions",
-                      [](const RecordKeeper &records, raw_ostream &os) {
-                        return emitSPIRVAttrUtils(records, os);
-                      });
-
 //===----------------------------------------------------------------------===//
 // SPIR-V Availability Impl AutoGen
 //===----------------------------------------------------------------------===//
@@ -1417,17 +1355,6 @@ static bool emitSPIRVAvailabilityImpl(const RecordKeeper &records,
   return false;
 }
 
-//===----------------------------------------------------------------------===//
-// Op Availability Implementation Hook Registration
-//===----------------------------------------------------------------------===//
-
-static mlir::GenRegistration
-    genSPIRVAvailabilityImpl("gen-spirv-avail-impls",
-                             "Generate SPIR-V operation utility definitions",
-                             [](const RecordKeeper &records, raw_ostream &os) {
-                               return emitSPIRVAvailabilityImpl(records, os);
-                             });
-
 //===----------------------------------------------------------------------===//
 // SPIR-V Capability Implication AutoGen
 //===----------------------------------------------------------------------===//
@@ -1464,15 +1391,3 @@ static bool emitSPIRVCapabilityImplication(const RecordKeeper &records,
 
   return false;
 }
-
-//===----------------------------------------------------------------------===//
-// SPIR-V Capability Implication Hook Registration
-//===----------------------------------------------------------------------===//
-
-static mlir::GenRegistration genSPIRVCapabilityImplication(
-    "gen-spirv-capability-implication",
-    "Generate utility function to return implied "
-    "capabilities for a given capability",
-    [](const RecordKeeper &records, raw_ostream &os) {
-      return emitSPIRVCapabilityImplication(records, os);
-    });
diff --git a/mlir/tools/mlir-tblgen/mlir-tblgen.cpp b/mlir/tools/mlir-tblgen/mlir-tblgen.cpp
index 6c4b619598eb63..a338674f3ff6fb 100644
--- a/mlir/tools/mlir-tblgen/mlir-tblgen.cpp
+++ b/mlir/tools/mlir-tblgen/mlir-tblgen.cpp
@@ -12,11 +12,417 @@
 
 #include "mlir/TableGen/GenInfo.h"
 #include "mlir/Tools/mlir-tblgen/MlirTblgenMain.h"
+
+#include "llvm/Support/CommandLine.h"
 #include "llvm/TableGen/Record.h"
 
 using namespace llvm;
 using namespace mlir;
 
+//===----------------------------------------------------------------------===//
+// AttrDef registration hooks
+//===----------------------------------------------------------------------===//
+
+static llvm::cl::OptionCategory attrdefGenCat("Options for -gen-attrdef-*");
+static llvm::cl::opt<std::string>
+    attrDialect("attrdefs-dialect",
+                llvm::cl::desc("Generate attributes for this dialect"),
+                llvm::cl::cat(attrdefGenCat), llvm::cl::CommaSeparated);
+
+static mlir::GenRegistration
+    genAttrDefs("gen-attrdef-defs", "Generate AttrDef definitions",
+                [](const RecordKeeper &records, raw_ostream &os) {
+                  AttrDefGenerator generator(records, os);
+                  return generator.emitDefs(attrDialect);
+                });
+static mlir::GenRegistration
+    genAttrDecls("gen-attrdef-decls", "Generate AttrDef declarations",
+                 [](const RecordKeeper &records, raw_ostream &os) {
+                   AttrDefGenerator generator(records, os);
+                   return generator.emitDecls(attrDialect);
+                 });
+
+//===----------------------------------------------------------------------===//
+// TypeDef registration hooks
+//===----------------------------------------------------------------------===//
+
+static llvm::cl::OptionCategory typedefGenCat("Options for -gen-typedef-*");
+static llvm::cl::opt<std::string>
+    typeDialect("typedefs-dialect",
+                llvm::cl::desc("Generate types for this dialect"),
+                llvm::cl::cat(typedefGenCat), llvm::cl::CommaSeparated);
+
+static mlir::GenRegistration
+    genTypeDefs("gen-typedef-defs", "Generate TypeDef definitions",
+                [](const RecordKeeper &records, raw_ostream &os) {
+                  TypeDefGenerator generator(records, os);
+                  return generator.emitDefs(typeDialect);
+                });
+static mlir::GenRegistration
+    genTypeDecls("gen-typedef-decls", "Generate TypeDef declarations",
+                 [](const RecordKeeper &records, raw_ostream &os) {
+                   TypeDefGenerator generator(records, os);
+                   return generator.emitDecls(typeDialect);
+                 });
+
+static mlir::GenRegistration
+    genTypeConstrDefs("gen-type-constraint-defs",
+                      "Generate type constraint definitions",
+                      [](const RecordKeeper &records, raw_ostream &os) {
+                        emitTypeConstraintDefs(records, os);
+                        return false;
+                      });
+static mlir::GenRegistration
+    genTypeConstrDecls("gen-type-constraint-decls",
+                       "Generate type constraint declarations",
+                       [](const RecordKeeper &records, raw_ostream &os) {
+                         emitTypeConstraintDecls(records, os);
+                         return false;
+                       });
+
+//===----------------------------------------------------------------------===//
+// Bytecode registration hooks
+//===----------------------------------------------------------------------===//
+
+static mlir::GenRegistration
+    genBCRW("gen-bytecode", "Generate dialect bytecode readers/writers",
+            [](const RecordKeeper &records, raw_ostream &os) {
+              return emitBCRW(records, os);
+            });
+
+//===----------------------------------------------------------------------===//
+// GEN: Dialect registration hooks
+//===----------------------------------------------------------------------===//
+
+static mlir::GenRegistration
+    genDialectDecls("gen-dialect-decls", "Generate dialect declarations",
+                    [](const RecordKeeper &records, raw_ostream &os) {
+                      return emitDialectDecls(records, os);
+                    });
+
+static mlir::GenRegistration
+    genDialectDefs("gen-dialect-defs", "Generate dialect definitions",
+                   [](const RecordKeeper &records, raw_ostream &os) {
+                     return emitDialectDefs(records, os);
+                   });
+
+//===----------------------------------------------------------------------===//
+// Directive registration hooks
+//===----------------------------------------------------------------------===//
+
+static llvm::cl::OptionCategory
+    directiveGenCat("Options for gen-directive-decl");
+static llvm::cl::opt<std::string>
+    dialect("directives-dialect",
+            llvm::cl::desc("Generate directives for this dialect"),
+            llvm::cl::cat(directiveGenCat), llvm::cl::CommaSeparated);
+
+// Registers the generator to mlir-tblgen.
+static mlir::GenRegistration genDirectiveDecls(
+    "gen-directive-decl",
+    "Generate declarations for directives (OpenMP/OpenACC etc.)",
+    [](const RecordKeeper &records, raw_ostream &os) {
+      return emitDirectiveDecls(records, dialect, os);
+    });
+
+//===----------------------------------------------------------------------===//
+// Python Enum registration hooks
+//===----------------------------------------------------------------------===//
+
+// Registers the enum utility generator to mlir-tblgen.
+static mlir::GenRegistration
+    genPythonEnumBindings("gen-python-enum-bindings",
+                          "Generate Python bindings for enum attributes",
+                          &emitPythonEnums);
+
+//===----------------------------------------------------------------------===//
+// Enum registration hooks
+//===----------------------------------------------------------------------===//
+
+// Registers the enum utility generator to mlir-tblgen.
+static mlir::GenRegistration
+    genEnumDecls("gen-enum-decls", "Generate enum utility declarations",
+                 [](const RecordKeeper &records, raw_ostream &os) {
+                   return emitEnumDecls(records, os);
+                 });
+
+// Registers the enum utility generator to mlir-tblgen.
+static mlir::GenRegistration
+    genEnumDefs("gen-enum-defs", "Generate enum utility definitions",
+                [](const RecordKeeper &records, raw_ostream &os) {
+                  return emitEnumDefs(records, os);
+                });
+
+//===----------------------------------------------------------------------===//
+// LLVMIR registration hooks
+//===----------------------------------------------------------------------===//
+
+static mlir::GenRegistration
+    genLLVMIRConversions("gen-llvmir-conversions",
+                         "Generate LLVM IR conversions",
+                         emitLLVMIRConversionBuilders);
+
+static mlir::GenRegistration genOpFromLLVMIRConversions(
+    "gen-op-from-llvmir-conversions",
+    "Generate conversions of operations from LLVM IR",
+    emitLLVMIROpMLIRBuilders);
+
+static mlir::GenRegistration genIntrFromLLVMIRConversions(
+    "gen-intr-from-llvmir-conversions",
+    "Generate conversions of intrinsics from LLVM IR",
+    emitLLVMIRIntrMLIRBuilders);
+
+static mlir::GenRegistration
+    genEnumToLLVMConversion("gen-enum-to-llvmir-conversions",
+                            "Generate conversions of EnumAttrs to LLVM IR",
+                            emitLLVMIREnumConversionDefs</*ConvertTo=*/true>);
+
+static mlir::GenRegistration genEnumFromLLVMConversion(
+    "gen-enum-from-llvmir-conversions",
+    "Generate conversions of EnumAttrs from LLVM IR",
+    emitLLVMIREnumConversionDefs</*ConvertTo=*/false>);
+
+static mlir::GenRegistration genConvertibleLLVMIRIntrinsics(
+    "gen-convertible-llvmir-intrinsics",
+    "Generate list of convertible LLVM IR intrinsics",
+    emitConvertibleLLVMIRIntrinsics);
+
+static mlir::GenRegistration genLLVMIRIntrinsics("gen-llvmir-intrinsics",
+                                                 "Generate LLVM IR intrinsics",
+                                                 emitLLVMIRIntrinsics);
+
+//===----------------------------------------------------------------------===//
+// OpenMP registration hooks
+//===----------------------------------------------------------------------===//
+
+// Registers the generator to mlir-tblgen.
+static mlir::GenRegistration
+    verifyOpenmpOps("verify-openmp-ops",
+                    "Verify OpenMP operations (produce no output file)",
+                    verifyOpenmpDecls);
+
+static mlir::GenRegistration
+    regOpenmpClauseOps("gen-openmp-clause-ops",
+                       "Generate OpenMP clause operand structures",
+                       genOpenmpClauseOps);
+
+//===----------------------------------------------------------------------===//
+// OpDefinition registration hooks
+//===----------------------------------------------------------------------===//
+
+static mlir::GenRegistration
+    genOpDecls("gen-op-decls", "Generate op declarations",
+               [](const RecordKeeper &records, raw_ostream &os) {
+                 return emitOpDecls(records, os);
+               });
+
+static mlir::GenRegistration genOpDefs("gen-op-defs", "Generate op definitions",
+                                       [](const RecordKeeper &records,
+                                          raw_ostream &os) {
+                                         return emitOpDefs(records, os);
+                                       });
+//===----------------------------------------------------------------------===//
+// Op Doc Registration
+//===----------------------------------------------------------------------===//
+
+static mlir::GenRegistration
+    genAttrDocRegister("gen-attrdef-doc",
+                       "Generate dialect attribute documentation",
+                       [](const RecordKeeper &records, raw_ostream &os) {
+                         emitAttrOrTypeDefDoc(records, os, "AttrDef");
+                         return false;
+                       });
+
+static mlir::GenRegistration
+    genOpDocRegister("gen-op-doc", "Generate dialect documentation",
+                     [](const RecordKeeper &records, raw_ostream &os) {
+                       emitOpDoc(records, os);
+                       return false;
+                     });
+
+static mlir::GenRegistration
+    genTypeDocRegister("gen-typedef-doc", "Generate dialect type documentation",
+                       [](const RecordKeeper &records, raw_ostream &os) {
+                         emitAttrOrTypeDefDoc(records, os, "TypeDef");
+                         return false;
+                       });
+
+static mlir::GenRegistration
+    genEnumDocRegister("gen-enum-doc", "Generate dialect enum documentation",
+                       [](const RecordKeeper &records, raw_ostream &os) {
+                         emitEnumDoc(records, os);
+                         return false;
+                       });
+
+static mlir::GenRegistration
+    genDialectDocRegister("gen-dialect-doc", "Generate dialect documentation",
+                          [](const RecordKeeper &records, raw_ostream &os) {
+                            return emitDialectDoc(records, os);
+                          });
+
+//===----------------------------------------------------------------------===//
+// Interface registration hooks
+//===----------------------------------------------------------------------===//
+
+namespace {
+template <typename GeneratorT>
+struct InterfaceGenRegistration {
+  InterfaceGenRegistration(StringRef genArg, StringRef genDesc)
+      : genDeclArg(("gen-" + genArg + "-interface-decls").str()),
+        genDefArg(("gen-" + genArg + "-interface-defs").str()),
+        genDocArg(("gen-" + genArg + "-interface-docs").str()),
+        genDeclDesc(("Generate " + genDesc + " interface declarations").str()),
+        genDefDesc(("Generate " + genDesc + " interface definitions").str()),
+        genDocDesc(("Generate " + genDesc + " interface documentation").str()),
+        genDecls(genDeclArg, genDeclDesc,
+                 [](const RecordKeeper &records, raw_ostream &os) {
+                   return GeneratorT(records, os).emitInterfaceDecls();
+                 }),
+        genDefs(genDefArg, genDefDesc,
+                [](const RecordKeeper &records, raw_ostream &os) {
+                  return GeneratorT(records, os).emitInterfaceDefs();
+                }),
+        genDocs(genDocArg, genDocDesc,
+                [](const RecordKeeper &records, raw_ostream &os) {
+                  return GeneratorT(records, os).emitInterfaceDocs();
+                }) {}
+
+  std::string genDeclArg, genDefArg, genDocArg;
+  std::string genDeclDesc, genDefDesc, genDocDesc;
+  mlir::GenRegistration genDecls, genDefs, genDocs;
+};
+} // namespace
+
+static InterfaceGenRegistration<AttrInterfaceGenerator>
+    attrInterfaceGen("attr", "attribute");
+static InterfaceGenRegistration<OpInterfaceGenerator> opInterfaceGen("op",
+                                                                     "op");
+static InterfaceGenRegistration<TypeInterfaceGenerator>
+    typeInterfaceGen("type", "type");
+
+//===----------------------------------------------------------------------===//
+// Python bindings registration hooks
+//===----------------------------------------------------------------------===//
+
+static GenRegistration
+    genPythonBindings("gen-python-op-bindings",
+                      "Generate Python bindings for MLIR Ops",
+                      &emitAllPythonOps);
+
+//===----------------------------------------------------------------------===//
+// Pass CAPI registration hooks
+//===----------------------------------------------------------------------===//
+
+static mlir::GenRegistration genCAPIHeader("gen-pass-capi-header",
+                                           "Generate pass C API header",
+                                           &emitCAPIHeader);
+
+static mlir::GenRegistration genCAPIImpl("gen-pass-capi-impl",
+                                         "Generate pass C API implementation",
+                                         &emitCAPIImpl);
+
+//===----------------------------------------------------------------------===//
+// Pass Doc registration hooks
+//===----------------------------------------------------------------------===//
+
+static mlir::GenRegistration
+    genPassDocRegister("gen-pass-doc", "Generate pass documentation",
+                       [](const RecordKeeper &records, raw_ostream &os) {
+                         emitPassDocs(records, os);
+                         return false;
+                       });
+
+//===----------------------------------------------------------------------===//
+// Pass registration hooks
+//===----------------------------------------------------------------------===//
+
+static mlir::GenRegistration
+    genPassDecls("gen-pass-decls", "Generate pass declarations",
+                 [](const RecordKeeper &records, raw_ostream &os) {
+                   emitPassDecls(records, os);
+                   return false;
+                 });
+
+//===----------------------------------------------------------------------===//
+// Rewriter registration hooks
+//===----------------------------------------------------------------------===//
+
+static mlir::GenRegistration
+    genRewriters("gen-rewriters", "Generate pattern rewriters",
+                 [](const RecordKeeper &records, raw_ostream &os) {
+                   emitRewriters(records, os);
+                   return false;
+                 });
+
+//===----------------------------------------------------------------------===//
+// SPIRV registration hooks
+//===----------------------------------------------------------------------===//
+
+// Registers the operation interface generator to mlir-tblgen.
+static mlir::GenRegistration
+    genSPIRVInterfaceDecls("gen-avail-interface-decls",
+                           "Generate availability interface declarations",
+                           [](const RecordKeeper &records, raw_ostream &os) {
+                             return emitSPRIVInterfaceDecls(records, os);
+                           });
+
+// Registers the operation interface generator to mlir-tblgen.
+static mlir::GenRegistration
+    genSPIRVInterfaceDefs("gen-avail-interface-defs",
+                          "Generate op interface definitions",
+                          [](const RecordKeeper &records, raw_ostream &os) {
+                            return emitSPRIVInterfaceDefs(records, os);
+                          });
+
+// Registers the enum utility generator to mlir-tblgen.
+static mlir::GenRegistration
+    genSPIRVEnumDecls("gen-spirv-enum-avail-decls",
+                      "Generate SPIR-V enum availability declarations",
+                      [](const RecordKeeper &records, raw_ostream &os) {
+                        return emitSPRIVEnumDecls(records, os);
+                      });
+
+// Registers the enum utility generator to mlir-tblgen.
+static mlir::GenRegistration
+    genSPIRVEnumDefs("gen-spirv-enum-avail-defs",
+                     "Generate SPIR-V enum availability definitions",
+                     [](const RecordKeeper &records, raw_ostream &os) {
+                       return emitSPIRVEnumDefs(records, os);
+                     });
+
+static mlir::GenRegistration genSPIRVSerialization(
+    "gen-spirv-serialization",
+    "Generate SPIR-V (de)serialization utilities and functions",
+    [](const RecordKeeper &records, raw_ostream &os) {
+      return emitSPIRVSerializationFns(records, os);
+    });
+
+static mlir::GenRegistration
+    genSPIRVAttrUtils("gen-spirv-attr-utils",
+                      "Generate SPIR-V attribute utility definitions",
+                      [](const RecordKeeper &records, raw_ostream &os) {
+                        return emitSPIRVAttrUtils(records, os);
+                      });
+
+static mlir::GenRegistration
+    genSPIRVAvailabilityImpl("gen-spirv-avail-impls",
+                             "Generate SPIR-V operation utility definitions",
+                             [](const RecordKeeper &records, raw_ostream &os) {
+                               return emitSPIRVAvailabilityImpl(records, os);
+                             });
+
+static mlir::GenRegistration genSPIRVCapabilityImplication(
+    "gen-spirv-capability-implication",
+    "Generate utility function to return implied "
+    "capabilities for a given capability",
+    [](const RecordKeeper &records, raw_ostream &os) {
+      return emitSPIRVCapabilityImplication(records, os);
+    });
+
+//===----------------------------------------------------------------------===//
+// main registration hooks
+//===----------------------------------------------------------------------===//
+
 // Generator that prints records.
 GenRegistration printRecords("print-records", "Print all records to stdout",
                              [](const RecordKeeper &records, raw_ostream &os) {

>From 93d33fa80fae9a672a659f79fa97e24b62af34b9 Mon Sep 17 00:00:00 2001
From: Maksim Levental <maksim.levental at gmail.com>
Date: Sat, 26 Oct 2024 17:45:25 -0400
Subject: [PATCH 05/27] remove anon namespaces

---
 mlir/lib/TableGen/AttrOrTypeDefGen.cpp    |  8 ++---
 mlir/lib/TableGen/AttrOrTypeFormatGen.cpp | 14 ++++-----
 mlir/lib/TableGen/BytecodeDialectGen.cpp  | 38 ++++++++++++-----------
 mlir/lib/TableGen/DialectGen.cpp          |  4 +--
 mlir/lib/TableGen/LLVMIRConversionGen.cpp | 22 ++++++-------
 mlir/lib/TableGen/LLVMIRIntrinsicGen.cpp  |  6 ++--
 mlir/lib/TableGen/OpDefinitionsGen.cpp    | 12 +++----
 mlir/lib/TableGen/OpFormatGen.cpp         | 24 +++++++-------
 mlir/lib/TableGen/OpInterfacesGen.cpp     |  5 +--
 mlir/lib/TableGen/Predicate.cpp           |  8 ++---
 mlir/lib/TableGen/RewriterGen.cpp         |  4 +--
 mlir/lib/TableGen/SPIRVUtilsGen.cpp       |  4 +--
 12 files changed, 76 insertions(+), 73 deletions(-)

diff --git a/mlir/lib/TableGen/AttrOrTypeDefGen.cpp b/mlir/lib/TableGen/AttrOrTypeDefGen.cpp
index ff80752e5a0b32..44100629fb3edf 100644
--- a/mlir/lib/TableGen/AttrOrTypeDefGen.cpp
+++ b/mlir/lib/TableGen/AttrOrTypeDefGen.cpp
@@ -62,7 +62,7 @@ static void collectAllDefs(StringRef selectedDialect,
 // DefGen
 //===----------------------------------------------------------------------===//
 
-namespace {
+namespace mlir::tblgen {
 class DefGen {
 public:
   /// Create the attribute or type class.
@@ -170,7 +170,7 @@ class DefGen {
   /// The prefix/suffix of the TableGen def name, either "Attr" or "Type".
   StringRef defType;
 };
-} // namespace
+} // namespace mlir::tblgen
 
 DefGen::DefGen(const AttrOrTypeDef &def)
     : def(def), params(def.getParameters()), defCls(def.getCppClassName()),
@@ -684,7 +684,7 @@ void DefGen::emitStorageClass() {
 // DefGenerator
 //===----------------------------------------------------------------------===//
 
-namespace {
+namespace mlir::tblgen {
 /// This struct is the base generator used when processing tablegen interfaces.
 class DefGenerator {
 public:
@@ -733,7 +733,7 @@ struct TypeDefGenerator : public DefGenerator {
       : DefGenerator(records.getAllDerivedDefinitionsIfDefined("TypeDef"), os,
                      "Type", "Type", /*isAttrGenerator=*/false) {}
 };
-} // namespace
+} // namespace mlir::tblgen
 
 //===----------------------------------------------------------------------===//
 // GEN: Declarations
diff --git a/mlir/lib/TableGen/AttrOrTypeFormatGen.cpp b/mlir/lib/TableGen/AttrOrTypeFormatGen.cpp
index a7d61801cbcf96..2cdacf05639cca 100644
--- a/mlir/lib/TableGen/AttrOrTypeFormatGen.cpp
+++ b/mlir/lib/TableGen/AttrOrTypeFormatGen.cpp
@@ -7,10 +7,10 @@
 //===----------------------------------------------------------------------===//
 
 #include "mlir/TableGen/AttrOrTypeFormatGen.h"
-#include "mlir/TableGen/FormatGen.h"
 #include "mlir/Support/LLVM.h"
 #include "mlir/TableGen/AttrOrTypeDef.h"
 #include "mlir/TableGen/Format.h"
+#include "mlir/TableGen/FormatGen.h"
 #include "mlir/TableGen/GenInfo.h"
 #include "llvm/ADT/BitVector.h"
 #include "llvm/ADT/StringExtras.h"
@@ -31,7 +31,7 @@ using llvm::formatv;
 // Element
 //===----------------------------------------------------------------------===//
 
-namespace {
+namespace mlir::tblgen {
 /// This class represents an instance of a variable element. A variable refers
 /// to an attribute or type parameter.
 class ParameterElement
@@ -131,7 +131,7 @@ class StructDirective : public ParamsDirectiveBase<DirectiveElement::Struct> {
   using Base::Base;
 };
 
-} // namespace
+} // namespace mlir::tblgen
 
 //===----------------------------------------------------------------------===//
 // Format Strings
@@ -177,7 +177,7 @@ if (::mlir::failed(_result_{0})) {{
 // DefFormat
 //===----------------------------------------------------------------------===//
 
-namespace {
+namespace mlir::tblgen {
 class DefFormat {
 public:
   DefFormat(const AttrOrTypeDef &def, std::vector<FormatElement *> &&elements)
@@ -242,7 +242,7 @@ class DefFormat {
   bool shouldEmitSpace = false;
   bool lastWasPunctuation = false;
 };
-} // namespace
+} // namespace mlir::tblgen
 
 //===----------------------------------------------------------------------===//
 // ParserGen
@@ -939,7 +939,7 @@ void DefFormat::genWhitespacePrinter(WhitespaceElement *el, FmtContext &ctx,
 // DefFormatParser
 //===----------------------------------------------------------------------===//
 
-namespace {
+namespace mlir::tblgen {
 class DefFormatParser : public FormatParser {
 public:
   DefFormatParser(llvm::SourceMgr &mgr, const AttrOrTypeDef &def)
@@ -982,7 +982,7 @@ class DefFormatParser : public FormatParser {
   /// Seen attribute or type parameters.
   BitVector seenParams;
 };
-} // namespace
+} // namespace mlir::tblgen
 
 LogicalResult DefFormatParser::verify(SMLoc loc,
                                       ArrayRef<FormatElement *> elements) {
diff --git a/mlir/lib/TableGen/BytecodeDialectGen.cpp b/mlir/lib/TableGen/BytecodeDialectGen.cpp
index c48f93f6987037..d0e5bcce075dec 100644
--- a/mlir/lib/TableGen/BytecodeDialectGen.cpp
+++ b/mlir/lib/TableGen/BytecodeDialectGen.cpp
@@ -23,7 +23,7 @@ static cl::opt<std::string>
     selectedBcDialect("bytecode-dialect", cl::desc("The dialect to gen for"),
                       cl::cat(dialectGenCat), cl::CommaSeparated);
 
-namespace {
+namespace mlir::tblgen {
 
 /// Helper class to generate C++ bytecode parser helpers.
 class Generator {
@@ -57,7 +57,7 @@ class Generator {
 
   raw_ostream &output;
 };
-} // namespace
+} // namespace mlir::tblgen
 
 /// Helper to replace set of from strings to target in `s`.
 /// Assumed: non-overlapping replacements.
@@ -93,8 +93,8 @@ static std::string getCType(const Record *def) {
   return formatv(format.c_str(), cType.str());
 }
 
-void Generator::emitParseDispatch(StringRef kind,
-                                  ArrayRef<const Record *> vec) {
+void mlir::tblgen::Generator::emitParseDispatch(StringRef kind,
+                                                ArrayRef<const Record *> vec) {
   mlir::raw_indented_ostream os(output);
   char const *head =
       R"(static {0} read{0}(MLIRContext* context, DialectBytecodeReader &reader))";
@@ -128,7 +128,7 @@ void Generator::emitParseDispatch(StringRef kind,
   os << "return " << capitalize(kind) << "();\n";
 }
 
-void Generator::emitParse(StringRef kind, const Record &x) {
+void mlir::tblgen::Generator::emitParse(StringRef kind, const Record &x) {
   if (x.getNameInitAsString() == "ReservedOrDead")
     return;
 
@@ -198,11 +198,10 @@ void printParseConditional(mlir::raw_indented_ostream &ios,
       [&]() { ios << " &&\n"; });
 }
 
-void Generator::emitParseHelper(StringRef kind, StringRef returnType,
-                                StringRef builder, ArrayRef<const Init *> args,
-                                ArrayRef<std::string> argNames,
-                                StringRef failure,
-                                mlir::raw_indented_ostream &ios) {
+void mlir::tblgen::Generator::emitParseHelper(
+    StringRef kind, StringRef returnType, StringRef builder,
+    ArrayRef<const Init *> args, ArrayRef<std::string> argNames,
+    StringRef failure, mlir::raw_indented_ostream &ios) {
   auto funScope = ios.scope("{\n", "}");
 
   if (args.empty()) {
@@ -296,8 +295,9 @@ void Generator::emitParseHelper(StringRef kind, StringRef returnType,
   ios << "}\nreturn " << failure << ";\n";
 }
 
-void Generator::emitPrint(StringRef kind, StringRef type,
-                          ArrayRef<std::pair<int64_t, const Record *>> vec) {
+void mlir::tblgen::Generator::emitPrint(
+    StringRef kind, StringRef type,
+    ArrayRef<std::pair<int64_t, const Record *>> vec) {
   if (type == "ReservedOrDead")
     return;
 
@@ -348,9 +348,10 @@ void Generator::emitPrint(StringRef kind, StringRef type,
   }
 }
 
-void Generator::emitPrintHelper(const Record *memberRec, StringRef kind,
-                                StringRef parent, StringRef name,
-                                mlir::raw_indented_ostream &ios) {
+void mlir::tblgen::Generator::emitPrintHelper(const Record *memberRec,
+                                              StringRef kind, StringRef parent,
+                                              StringRef name,
+                                              mlir::raw_indented_ostream &ios) {
   std::string getter;
   if (auto cGetter = memberRec->getValueAsOptionalString("cGetter");
       cGetter && !cGetter->empty()) {
@@ -403,7 +404,8 @@ void Generator::emitPrintHelper(const Record *memberRec, StringRef kind,
         << ";\n";
 }
 
-void Generator::emitPrintDispatch(StringRef kind, ArrayRef<std::string> vec) {
+void mlir::tblgen::Generator::emitPrintDispatch(StringRef kind,
+                                                ArrayRef<std::string> vec) {
   mlir::raw_indented_ostream os(output);
   char const *head = R"(static LogicalResult write{0}({0} {1},
                                 DialectBytecodeWriter &writer))";
@@ -424,12 +426,11 @@ void Generator::emitPrintDispatch(StringRef kind, ArrayRef<std::string> vec) {
   os << "\n.Default([&](" << capitalize(kind) << ") { return failure(); });\n";
 }
 
-namespace {
+namespace mlir::tblgen {
 /// Container of Attribute or Type for Dialect.
 struct AttrOrType {
   std::vector<const Record *> attr, type;
 };
-} // namespace
 
 static bool emitBCRW(const RecordKeeper &records, raw_ostream &os) {
   MapVector<StringRef, AttrOrType> dialectAttrOrType;
@@ -484,3 +485,4 @@ static bool emitBCRW(const RecordKeeper &records, raw_ostream &os) {
 
   return false;
 }
+} // namespace mlir::tblgen
diff --git a/mlir/lib/TableGen/DialectGen.cpp b/mlir/lib/TableGen/DialectGen.cpp
index a03ce4a404c9ee..33ede2a3208263 100644
--- a/mlir/lib/TableGen/DialectGen.cpp
+++ b/mlir/lib/TableGen/DialectGen.cpp
@@ -39,11 +39,11 @@ llvm::cl::opt<std::string>
                     llvm::cl::cat(dialectGenCat), llvm::cl::CommaSeparated);
 
 /// Utility iterator used for filtering records for a specific dialect.
-namespace {
+namespace mlir::tblgen {
 using DialectFilterIterator =
     llvm::filter_iterator<ArrayRef<Record *>::iterator,
                           std::function<bool(const Record *)>>;
-} // namespace
+} // namespace mlir::tblgen
 
 static void populateDiscardableAttributes(
     Dialect &dialect, const llvm::DagInit *discardableAttrDag,
diff --git a/mlir/lib/TableGen/LLVMIRConversionGen.cpp b/mlir/lib/TableGen/LLVMIRConversionGen.cpp
index 2cbcb19e294fa7..5c6457450a8d08 100644
--- a/mlir/lib/TableGen/LLVMIRConversionGen.cpp
+++ b/mlir/lib/TableGen/LLVMIRConversionGen.cpp
@@ -33,7 +33,7 @@ static LogicalResult emitError(const Record &record, const Twine &message) {
   return failure();
 }
 
-namespace {
+namespace mlir::tblgen {
 // Helper structure to return a position of the substring in a string.
 struct StringLoc {
   size_t pos;
@@ -45,13 +45,13 @@ struct StringLoc {
   // A location is invalid if its position is outside the string.
   explicit operator bool() { return pos != std::string::npos; }
 };
-} // namespace
+} // namespace mlir::tblgen
 
 // Find the next TableGen variable in the given pattern.  These variables start
 // with a `$` character and can contain alphanumeric characters or underscores.
 // Return the position of the variable in the pattern and its length, including
 // the `$` character.  The escape syntax `$$` is also detected and returned.
-static StringLoc findNextVariable(StringRef str) {
+static tblgen::StringLoc findNextVariable(StringRef str) {
   size_t startPos = str.find('$');
   if (startPos == std::string::npos)
     return {startPos, 0};
@@ -130,7 +130,7 @@ static LogicalResult emitOneBuilder(const Record &record, raw_ostream &os) {
   // to avoid re-traversing the string multiple times.
   std::string builder;
   llvm::raw_string_ostream bs(builder);
-  while (StringLoc loc = findNextVariable(builderStrRef)) {
+  while (tblgen::StringLoc loc = findNextVariable(builderStrRef)) {
     auto name = loc.in(builderStrRef).drop_front();
     auto getterName = op.getGetterName(name);
     // First, insert the non-matched part as is.
@@ -225,7 +225,7 @@ static LogicalResult emitOneMLIRBuilder(const Record &record, raw_ostream &os,
   // the conversions fails.
   std::string arguments, builder;
   llvm::raw_string_ostream as(arguments), bs(builder);
-  while (StringLoc loc = findNextVariable(builderStrRef)) {
+  while (tblgen::StringLoc loc = findNextVariable(builderStrRef)) {
     auto name = loc.in(builderStrRef).drop_front();
     // First, insert the non-matched part as is.
     bs << builderStrRef.substr(0, loc.pos);
@@ -336,7 +336,7 @@ static bool emitLLVMIROpMLIRBuilders(const RecordKeeper &records,
   return false;
 }
 
-namespace {
+namespace mlir::tblgen {
 // Wrapper class around a Tablegen definition of an LLVM enum attribute case.
 class LLVMEnumAttrCase : public tblgen::EnumAttrCase {
 public:
@@ -405,13 +405,13 @@ class LLVMCEnumAttr : public tblgen::EnumAttr {
     return cases;
   }
 };
-} // namespace
+} // namespace mlir::tblgen
 
 // Emits conversion function "LLVMClass convertEnumToLLVM(Enum)" and containing
 // switch-based logic to convert from the MLIR LLVM dialect enum attribute case
 // (Enum) to the corresponding LLVM API enumerant
 static void emitOneEnumToConversion(const Record *record, raw_ostream &os) {
-  LLVMEnumAttr enumAttr(record);
+  tblgen::LLVMEnumAttr enumAttr(record);
   StringRef llvmClass = enumAttr.getLLVMClassName();
   StringRef cppClassName = enumAttr.getEnumClassName();
   StringRef cppNamespace = enumAttr.getCppNamespace();
@@ -440,7 +440,7 @@ static void emitOneEnumToConversion(const Record *record, raw_ostream &os) {
 // switch-based logic to convert from the MLIR LLVM dialect enum attribute case
 // (Enum) to the corresponding LLVM API C-style enumerant
 static void emitOneCEnumToConversion(const Record *record, raw_ostream &os) {
-  LLVMCEnumAttr enumAttr(record);
+  tblgen::LLVMCEnumAttr enumAttr(record);
   StringRef llvmClass = enumAttr.getLLVMClassName();
   StringRef cppClassName = enumAttr.getEnumClassName();
   StringRef cppNamespace = enumAttr.getCppNamespace();
@@ -470,7 +470,7 @@ static void emitOneCEnumToConversion(const Record *record, raw_ostream &os) {
 // containing switch-based logic to convert from the LLVM API enumerant to MLIR
 // LLVM dialect enum attribute (Enum).
 static void emitOneEnumFromConversion(const Record *record, raw_ostream &os) {
-  LLVMEnumAttr enumAttr(record);
+  tblgen::LLVMEnumAttr enumAttr(record);
   StringRef llvmClass = enumAttr.getLLVMClassName();
   StringRef cppClassName = enumAttr.getEnumClassName();
   StringRef cppNamespace = enumAttr.getCppNamespace();
@@ -505,7 +505,7 @@ static void emitOneEnumFromConversion(const Record *record, raw_ostream &os) {
 // containing switch-based logic to convert from the LLVM API C-style enumerant
 // to MLIR LLVM dialect enum attribute (Enum).
 static void emitOneCEnumFromConversion(const Record *record, raw_ostream &os) {
-  LLVMCEnumAttr enumAttr(record);
+  tblgen::LLVMCEnumAttr enumAttr(record);
   StringRef llvmClass = enumAttr.getLLVMClassName();
   StringRef cppClassName = enumAttr.getEnumClassName();
   StringRef cppNamespace = enumAttr.getCppNamespace();
diff --git a/mlir/lib/TableGen/LLVMIRIntrinsicGen.cpp b/mlir/lib/TableGen/LLVMIRIntrinsicGen.cpp
index 3c9d71d8934b80..e1c95f05aab851 100644
--- a/mlir/lib/TableGen/LLVMIRIntrinsicGen.cpp
+++ b/mlir/lib/TableGen/LLVMIRIntrinsicGen.cpp
@@ -87,7 +87,7 @@ static IndicesTy getOverloadableTypeIdxs(const Record &record,
   return overloadedOps;
 }
 
-namespace {
+namespace mlir::tblgen {
 /// A wrapper for LLVM's Tablegen class `Intrinsic` that provides accessors to
 /// the fields of the record.
 class LLVMIntrinsic {
@@ -187,7 +187,7 @@ class LLVMIntrinsic {
 
   const Record &record;
 };
-} // namespace
+} // namespace mlir::tblgen
 
 /// Prints the elements in "range" separated by commas and surrounded by "[]".
 template <typename Range>
@@ -200,7 +200,7 @@ void printBracketedRange(const Range &range, llvm::raw_ostream &os) {
 /// Emits ODS (TableGen-based) code for `record` representing an LLVM intrinsic.
 /// Returns true on error, false on success.
 static bool emitIntrinsic(const Record &record, llvm::raw_ostream &os) {
-  LLVMIntrinsic intr(record);
+  tblgen::LLVMIntrinsic intr(record);
 
   Regex accessGroupMatcher(accessGroupRegexp);
   bool requiresAccessGroup =
diff --git a/mlir/lib/TableGen/OpDefinitionsGen.cpp b/mlir/lib/TableGen/OpDefinitionsGen.cpp
index 1d0632247c306f..83e26d1377206e 100644
--- a/mlir/lib/TableGen/OpDefinitionsGen.cpp
+++ b/mlir/lib/TableGen/OpDefinitionsGen.cpp
@@ -283,7 +283,7 @@ static std::string constBuildAttrFromParam(const tblgen::Attribute &attr,
   return tgfmt(builderTemplate, &fctx, paramName).str();
 }
 
-namespace {
+namespace mlir::tblgen {
 /// Metadata on a registered attribute. Given that attributes are stored in
 /// sorted order on operations, we can use information from ODS to deduce the
 /// number of required attributes less and and greater than each attribute,
@@ -467,7 +467,7 @@ class OpOrAdaptorHelper {
   unsigned numRequired;
 };
 
-} // namespace
+} // namespace mlir::tblgen
 
 void OpOrAdaptorHelper::computeAttrMetadata() {
   // Enumerate the attribute names of this op, ensuring the attribute names are
@@ -579,7 +579,7 @@ void OpOrAdaptorHelper::computeAttrMetadata() {
 // Op emitter
 //===----------------------------------------------------------------------===//
 
-namespace {
+namespace mlir::tblgen {
 // Helper class to emit a record into the given output stream.
 class OpEmitter {
   using ConstArgument =
@@ -785,7 +785,7 @@ class OpEmitter {
   OpOrAdaptorHelper emitHelper;
 };
 
-} // namespace
+} // namespace mlir::tblgen
 
 // Populate the format context `ctx` with substitutions of attributes, operands
 // and results.
@@ -4037,7 +4037,7 @@ void OpEmitter::genOpAsmInterface() {
 // OpOperandAdaptor emitter
 //===----------------------------------------------------------------------===//
 
-namespace {
+namespace mlir::tblgen {
 // Helper class to emit Op operand adaptors to an output stream.  Operand
 // adaptors are wrappers around random access ranges that provide named operand
 // getters identical to those defined in the Op.
@@ -4086,7 +4086,7 @@ class OpOperandAdaptorEmitter {
   // Helper for emitting adaptor code.
   OpOrAdaptorHelper emitHelper;
 };
-} // namespace
+} // namespace mlir::tblgen
 
 OpOperandAdaptorEmitter::OpOperandAdaptorEmitter(
     const Operator &op,
diff --git a/mlir/lib/TableGen/OpFormatGen.cpp b/mlir/lib/TableGen/OpFormatGen.cpp
index 29a678d6a9dbd1..56c0e73034069f 100644
--- a/mlir/lib/TableGen/OpFormatGen.cpp
+++ b/mlir/lib/TableGen/OpFormatGen.cpp
@@ -7,11 +7,11 @@
 //===----------------------------------------------------------------------===//
 
 #include "mlir/TableGen/OpFormatGen.h"
-#include "mlir/TableGen/FormatGen.h"
-#include "mlir/TableGen/OpClass.h"
 #include "mlir/Support/LLVM.h"
 #include "mlir/TableGen/Class.h"
 #include "mlir/TableGen/Format.h"
+#include "mlir/TableGen/FormatGen.h"
+#include "mlir/TableGen/OpClass.h"
 #include "mlir/TableGen/Operator.h"
 #include "mlir/TableGen/Trait.h"
 #include "llvm/ADT/MapVector.h"
@@ -35,7 +35,7 @@ using llvm::StringMap;
 //===----------------------------------------------------------------------===//
 // VariableElement
 
-namespace {
+namespace mlir::tblgen {
 /// This class represents an instance of an op variable element. A variable
 /// refers to something registered on the operation itself, e.g. an operand,
 /// result, attribute, region, or successor.
@@ -132,12 +132,12 @@ struct AttributeLikeVariable : public VariableElement {
     llvm_unreachable("Type that wasn't listed in classof()");
   }
 };
-} // namespace
+} // namespace mlir::tblgen
 
 //===----------------------------------------------------------------------===//
 // DirectiveElement
 
-namespace {
+namespace mlir::tblgen {
 /// This class represents the `operands` directive. This directive represents
 /// all of the operands of an operation.
 using OperandsDirective = DirectiveElementBase<DirectiveElement::Operands>;
@@ -280,13 +280,13 @@ class OIListElement : public DirectiveElementBase<DirectiveElement::OIList> {
   /// ```
   std::vector<std::vector<FormatElement *>> parsingElements;
 };
-} // namespace
+} // namespace mlir::tblgen
 
 //===----------------------------------------------------------------------===//
 // OperationFormat
 //===----------------------------------------------------------------------===//
 
-namespace {
+namespace mlir::tblgen {
 
 using ConstArgument =
     llvm::PointerUnion<const NamedAttribute *, const NamedTypeConstraint *>;
@@ -417,7 +417,7 @@ struct OperationFormat {
   /// The set of properties explicitly used within the format.
   llvm::SmallSetVector<const NamedProperty *, 8> usedProperties;
 };
-} // namespace
+} // namespace mlir::tblgen
 
 //===----------------------------------------------------------------------===//
 // Parser Gen
@@ -777,7 +777,7 @@ const char *oilistParserCode = R"(
   {0}Clause = true;
 )";
 
-namespace {
+namespace mlir::tblgen {
 /// The type of length for a given parse argument.
 enum class ArgumentLengthKind {
   /// The argument is a variadic of a variadic, and may contain 0->N range
@@ -790,7 +790,7 @@ enum class ArgumentLengthKind {
   /// The argument is a single element, i.e. always represents 1 element.
   Single
 };
-} // namespace
+} // namespace mlir::tblgen
 
 /// Get the length kind for the given constraint.
 static ArgumentLengthKind
@@ -2656,7 +2656,7 @@ static auto findArg(RangeT &&range, StringRef name) {
   return it != range.end() ? &*it : nullptr;
 }
 
-namespace {
+namespace mlir::tblgen {
 /// This class implements a parser for an instance of an operation assembly
 /// format.
 class OpFormatParser : public FormatParser {
@@ -2784,7 +2784,7 @@ class OpFormatParser : public FormatParser {
   llvm::DenseSet<const NamedSuccessor *> seenSuccessors;
   llvm::SmallSetVector<const NamedProperty *, 8> seenProperties;
 };
-} // namespace
+} // namespace mlir::tblgen
 
 LogicalResult OpFormatParser::verify(SMLoc loc,
                                      ArrayRef<FormatElement *> elements) {
diff --git a/mlir/lib/TableGen/OpInterfacesGen.cpp b/mlir/lib/TableGen/OpInterfacesGen.cpp
index e2cf18e0318e13..370de62b90a01f 100644
--- a/mlir/lib/TableGen/OpInterfacesGen.cpp
+++ b/mlir/lib/TableGen/OpInterfacesGen.cpp
@@ -80,7 +80,7 @@ getAllInterfaceDefinitions(const RecordKeeper &records, StringRef name) {
   return defs;
 }
 
-namespace {
+namespace mlir::tblgen {
 /// This struct is the base generator used when processing tablegen interfaces.
 class InterfaceGenerator {
 public:
@@ -163,7 +163,6 @@ struct TypeInterfaceGenerator : public InterfaceGenerator {
     extraDeclsFmt.addSubst(substVar, "(*this)");
   }
 };
-} // namespace
 
 //===----------------------------------------------------------------------===//
 // GEN: Interface definitions
@@ -669,3 +668,5 @@ bool InterfaceGenerator::emitInterfaceDocs() {
     emitInterfaceDoc(*def, os);
   return false;
 }
+
+} // namespace mlir::tblgen
diff --git a/mlir/lib/TableGen/Predicate.cpp b/mlir/lib/TableGen/Predicate.cpp
index f71dd0bd35f86c..282bcf121144e7 100644
--- a/mlir/lib/TableGen/Predicate.cpp
+++ b/mlir/lib/TableGen/Predicate.cpp
@@ -88,7 +88,7 @@ std::vector<const Record *> CombinedPred::getChildren() const {
   return def->getValueAsListOfDefs("children");
 }
 
-namespace {
+namespace mlir::tblgen {
 // Kinds of nodes in a logical predicate tree.
 enum class PredCombinerKind {
   Leaf,
@@ -113,7 +113,7 @@ struct PredNode {
   std::string prefix;
   std::string suffix;
 };
-} // namespace
+} // namespace mlir::tblgen
 
 // Get a predicate tree node kind based on the kind used in the predicate
 // TableGen record.
@@ -131,10 +131,10 @@ static PredCombinerKind getPredCombinerKind(const Pred &pred) {
       .Case("PredCombinerConcat", PredCombinerKind::Concat);
 }
 
-namespace {
+namespace mlir::tblgen {
 // Substitution<pattern, replacement>.
 using Subst = std::pair<StringRef, StringRef>;
-} // namespace
+} // namespace mlir::tblgen
 
 /// Perform the given substitutions on 'str' in-place.
 static void performSubstitutions(std::string &str,
diff --git a/mlir/lib/TableGen/RewriterGen.cpp b/mlir/lib/TableGen/RewriterGen.cpp
index 449dfce7f16b82..a4e47fe59123ab 100644
--- a/mlir/lib/TableGen/RewriterGen.cpp
+++ b/mlir/lib/TableGen/RewriterGen.cpp
@@ -58,7 +58,7 @@ struct format_provider<mlir::tblgen::Pattern::IdentifierLine> {
 // PatternEmitter
 //===----------------------------------------------------------------------===//
 
-namespace {
+namespace mlir::tblgen {
 
 class StaticMatcherHelper;
 
@@ -345,7 +345,7 @@ class StaticMatcherHelper {
   StaticVerifierFunctionEmitter staticVerifierEmitter;
 };
 
-} // namespace
+} // namespace mlir::tblgen
 
 PatternEmitter::PatternEmitter(const Record *pat, RecordOperatorMap *mapper,
                                raw_ostream &os, StaticMatcherHelper &helper)
diff --git a/mlir/lib/TableGen/SPIRVUtilsGen.cpp b/mlir/lib/TableGen/SPIRVUtilsGen.cpp
index 18f6fbd389178b..799220dedceeb7 100644
--- a/mlir/lib/TableGen/SPIRVUtilsGen.cpp
+++ b/mlir/lib/TableGen/SPIRVUtilsGen.cpp
@@ -54,7 +54,7 @@ using mlir::tblgen::Operator;
 // Availability Wrapper Class
 //===----------------------------------------------------------------------===//
 
-namespace {
+namespace mlir::tblgen {
 // Wrapper class with helper methods for accessing availability defined in
 // TableGen.
 class Availability {
@@ -104,7 +104,6 @@ class Availability {
   // The TableGen definition of this availability.
   const Record *def;
 };
-} // namespace
 
 Availability::Availability(const Record *def) : def(def) {
   assert(def->isSubClassOf("Availability") &&
@@ -1391,3 +1390,4 @@ static bool emitSPIRVCapabilityImplication(const RecordKeeper &records,
 
   return false;
 }
+} // namespace mlir::tblgen

>From c94a76a98b2823903cc464cc5bd0de25f77cc36a Mon Sep 17 00:00:00 2001
From: Maksim Levental <maksim.levental at gmail.com>
Date: Sat, 26 Oct 2024 17:56:50 -0400
Subject: [PATCH 06/27] expose AttrDefGenerator and TypeDefGenerator

---
 mlir/include/mlir/TableGen/AttrOrTypeDef.h | 146 ++++++++++++++++
 mlir/lib/TableGen/AttrOrTypeDefGen.cpp     | 185 +++------------------
 mlir/tools/mlir-tblgen/mlir-tblgen.cpp     |  13 +-
 3 files changed, 179 insertions(+), 165 deletions(-)

diff --git a/mlir/include/mlir/TableGen/AttrOrTypeDef.h b/mlir/include/mlir/TableGen/AttrOrTypeDef.h
index c3d730e42ef70e..38748bd35dc0b2 100644
--- a/mlir/include/mlir/TableGen/AttrOrTypeDef.h
+++ b/mlir/include/mlir/TableGen/AttrOrTypeDef.h
@@ -16,6 +16,7 @@
 
 #include "mlir/Support/LLVM.h"
 #include "mlir/TableGen/Builder.h"
+#include "mlir/TableGen/Class.h"
 #include "mlir/TableGen/Constraint.h"
 #include "mlir/TableGen/Trait.h"
 
@@ -27,6 +28,9 @@ class SMLoc;
 
 namespace mlir {
 namespace tblgen {
+class MethodParameter;
+class MethodParameter;
+class InterfaceMethod;
 class Dialect;
 
 //===----------------------------------------------------------------------===//
@@ -285,6 +289,148 @@ class TypeDef : public AttrOrTypeDef {
   StringRef getTypeName() const;
 };
 
+class DefGen {
+public:
+  /// Create the attribute or type class.
+  DefGen(const AttrOrTypeDef &def);
+
+  void emitDecl(raw_ostream &os) const;
+  void emitDef(raw_ostream &os) const;
+
+private:
+  /// Add traits from the TableGen definition to the class.
+  void createParentWithTraits();
+  /// Emit top-level declarations: using declarations and any extra class
+  /// declarations.
+  void emitTopLevelDeclarations();
+  /// Emit the function that returns the type or attribute name.
+  void emitName();
+  /// Emit the dialect name as a static member variable.
+  void emitDialectName();
+  /// Emit attribute or type builders.
+  void emitBuilders();
+  /// Emit a verifier declaration for custom verification (impl. provided by
+  /// the users).
+  void emitVerifierDecl();
+  /// Emit a verifier that checks type constraints.
+  void emitInvariantsVerifierImpl();
+  /// Emit an entry poiunt for verification that calls the invariants and
+  /// custom verifier.
+  void emitInvariantsVerifier(bool hasImpl, bool hasCustomVerifier);
+  /// Emit parsers and printers.
+  void emitParserPrinter();
+  /// Emit parameter accessors, if required.
+  void emitAccessors();
+  /// Emit interface methods.
+  void emitInterfaceMethods();
+
+  //===--------------------------------------------------------------------===//
+  // Builder Emission
+
+  /// Emit the default builder `Attribute::get`
+  void emitDefaultBuilder();
+  /// Emit the checked builder `Attribute::getChecked`
+  void emitCheckedBuilder();
+  /// Emit a custom builder.
+  void emitCustomBuilder(const AttrOrTypeBuilder &builder);
+  /// Emit a checked custom builder.
+  void emitCheckedCustomBuilder(const AttrOrTypeBuilder &builder);
+
+  //===--------------------------------------------------------------------===//
+  // Interface Method Emission
+
+  /// Emit methods for a trait.
+  void emitTraitMethods(const InterfaceTrait &trait);
+  /// Emit a trait method.
+  void emitTraitMethod(const InterfaceMethod &method);
+
+  //===--------------------------------------------------------------------===//
+  // Storage Class Emission
+  void emitStorageClass();
+  /// Generate the storage class constructor.
+  void emitStorageConstructor();
+  /// Emit the key type `KeyTy`.
+  void emitKeyType();
+  /// Emit the equality comparison operator.
+  void emitEquals();
+  /// Emit the key hash function.
+  void emitHashKey();
+  /// Emit the function to construct the storage class.
+  void emitConstruct();
+
+  //===--------------------------------------------------------------------===//
+  // Utility Function Declarations
+
+  /// Get the method parameters for a def builder, where the first several
+  /// parameters may be different.
+  SmallVector<MethodParameter>
+  getBuilderParams(std::initializer_list<MethodParameter> prefix) const;
+
+  //===--------------------------------------------------------------------===//
+  // Class fields
+
+  /// The attribute or type definition.
+  const AttrOrTypeDef &def;
+  /// The list of attribute or type parameters.
+  ArrayRef<AttrOrTypeParameter> params;
+  /// The attribute or type class.
+  Class defCls;
+  /// An optional attribute or type storage class. The storage class will
+  /// exist if and only if the def has more than zero parameters.
+  std::optional<Class> storageCls;
+
+  /// The C++ base value of the def, either "Attribute" or "Type".
+  StringRef valueType;
+  /// The prefix/suffix of the TableGen def name, either "Attr" or "Type".
+  StringRef defType;
+};
+
+class DefGenerator {
+public:
+  bool emitDecls(StringRef selectedDialect);
+  bool emitDefs(StringRef selectedDialect);
+
+protected:
+  DefGenerator(ArrayRef<const llvm::Record *> defs, raw_ostream &os,
+               StringRef defType, StringRef valueType, bool isAttrGenerator);
+
+  /// Emit the list of def type names.
+  void emitTypeDefList(ArrayRef<AttrOrTypeDef> defs);
+  /// Emit the code to dispatch between different defs during parsing/printing.
+  void emitParsePrintDispatch(ArrayRef<AttrOrTypeDef> defs);
+
+  /// The set of def records to emit.
+  std::vector<const llvm::Record *> defRecords;
+  /// The attribute or type class to emit.
+  /// The stream to emit to.
+  raw_ostream &os;
+  /// The prefix of the tablegen def name, e.g. Attr or Type.
+  StringRef defType;
+  /// The C++ base value type of the def, e.g. Attribute or Type.
+  StringRef valueType;
+  /// Flag indicating if this generator is for Attributes. False if the
+  /// generator is for types.
+  bool isAttrGenerator;
+};
+
+/// A specialized generator for AttrDefs.
+struct AttrDefGenerator : public DefGenerator {
+  AttrDefGenerator(const llvm::RecordKeeper &records, raw_ostream &os)
+      : DefGenerator(records.getAllDerivedDefinitionsIfDefined("AttrDef"), os,
+                     "Attr", "Attribute", /*isAttrGenerator=*/true) {}
+};
+/// A specialized generator for TypeDefs.
+struct TypeDefGenerator : public DefGenerator {
+  TypeDefGenerator(const llvm::RecordKeeper &records, raw_ostream &os)
+      : DefGenerator(records.getAllDerivedDefinitionsIfDefined("TypeDef"), os,
+                     "Type", "Type", /*isAttrGenerator=*/false) {}
+};
+
+void emitTypeConstraintDecls(const llvm::RecordKeeper &records,
+                             raw_ostream &os);
+
+void emitTypeConstraintDefs(const llvm::RecordKeeper &records, raw_ostream &os);
+
 } // namespace tblgen
 } // namespace mlir
 
diff --git a/mlir/lib/TableGen/AttrOrTypeDefGen.cpp b/mlir/lib/TableGen/AttrOrTypeDefGen.cpp
index 44100629fb3edf..238631f77f34c4 100644
--- a/mlir/lib/TableGen/AttrOrTypeDefGen.cpp
+++ b/mlir/lib/TableGen/AttrOrTypeDefGen.cpp
@@ -63,114 +63,20 @@ static void collectAllDefs(StringRef selectedDialect,
 //===----------------------------------------------------------------------===//
 
 namespace mlir::tblgen {
-class DefGen {
-public:
-  /// Create the attribute or type class.
-  DefGen(const AttrOrTypeDef &def);
-
-  void emitDecl(raw_ostream &os) const {
-    if (storageCls && def.genStorageClass()) {
-      NamespaceEmitter ns(os, def.getStorageNamespace());
-      os << "struct " << def.getStorageClassName() << ";\n";
-    }
-    defCls.writeDeclTo(os);
+void DefGen::emitDecl(raw_ostream &os) const {
+  if (storageCls && def.genStorageClass()) {
+    NamespaceEmitter ns(os, def.getStorageNamespace());
+    os << "struct " << def.getStorageClassName() << ";\n";
   }
-  void emitDef(raw_ostream &os) const {
-    if (storageCls && def.genStorageClass()) {
-      NamespaceEmitter ns(os, def.getStorageNamespace());
-      storageCls->writeDeclTo(os); // everything is inline
-    }
-    defCls.writeDefTo(os);
+  defCls.writeDeclTo(os);
+}
+void DefGen::emitDef(raw_ostream &os) const {
+  if (storageCls && def.genStorageClass()) {
+    NamespaceEmitter ns(os, def.getStorageNamespace());
+    storageCls->writeDeclTo(os); // everything is inline
   }
-
-private:
-  /// Add traits from the TableGen definition to the class.
-  void createParentWithTraits();
-  /// Emit top-level declarations: using declarations and any extra class
-  /// declarations.
-  void emitTopLevelDeclarations();
-  /// Emit the function that returns the type or attribute name.
-  void emitName();
-  /// Emit the dialect name as a static member variable.
-  void emitDialectName();
-  /// Emit attribute or type builders.
-  void emitBuilders();
-  /// Emit a verifier declaration for custom verification (impl. provided by
-  /// the users).
-  void emitVerifierDecl();
-  /// Emit a verifier that checks type constraints.
-  void emitInvariantsVerifierImpl();
-  /// Emit an entry poiunt for verification that calls the invariants and
-  /// custom verifier.
-  void emitInvariantsVerifier(bool hasImpl, bool hasCustomVerifier);
-  /// Emit parsers and printers.
-  void emitParserPrinter();
-  /// Emit parameter accessors, if required.
-  void emitAccessors();
-  /// Emit interface methods.
-  void emitInterfaceMethods();
-
-  //===--------------------------------------------------------------------===//
-  // Builder Emission
-
-  /// Emit the default builder `Attribute::get`
-  void emitDefaultBuilder();
-  /// Emit the checked builder `Attribute::getChecked`
-  void emitCheckedBuilder();
-  /// Emit a custom builder.
-  void emitCustomBuilder(const AttrOrTypeBuilder &builder);
-  /// Emit a checked custom builder.
-  void emitCheckedCustomBuilder(const AttrOrTypeBuilder &builder);
-
-  //===--------------------------------------------------------------------===//
-  // Interface Method Emission
-
-  /// Emit methods for a trait.
-  void emitTraitMethods(const InterfaceTrait &trait);
-  /// Emit a trait method.
-  void emitTraitMethod(const InterfaceMethod &method);
-
-  //===--------------------------------------------------------------------===//
-  // Storage Class Emission
-  void emitStorageClass();
-  /// Generate the storage class constructor.
-  void emitStorageConstructor();
-  /// Emit the key type `KeyTy`.
-  void emitKeyType();
-  /// Emit the equality comparison operator.
-  void emitEquals();
-  /// Emit the key hash function.
-  void emitHashKey();
-  /// Emit the function to construct the storage class.
-  void emitConstruct();
-
-  //===--------------------------------------------------------------------===//
-  // Utility Function Declarations
-
-  /// Get the method parameters for a def builder, where the first several
-  /// parameters may be different.
-  SmallVector<MethodParameter>
-  getBuilderParams(std::initializer_list<MethodParameter> prefix) const;
-
-  //===--------------------------------------------------------------------===//
-  // Class fields
-
-  /// The attribute or type definition.
-  const AttrOrTypeDef &def;
-  /// The list of attribute or type parameters.
-  ArrayRef<AttrOrTypeParameter> params;
-  /// The attribute or type class.
-  Class defCls;
-  /// An optional attribute or type storage class. The storage class will
-  /// exist if and only if the def has more than zero parameters.
-  std::optional<Class> storageCls;
-
-  /// The C++ base value of the def, either "Attribute" or "Type".
-  StringRef valueType;
-  /// The prefix/suffix of the TableGen def name, either "Attr" or "Type".
-  StringRef defType;
-};
-} // namespace mlir::tblgen
+  defCls.writeDefTo(os);
+}
 
 DefGen::DefGen(const AttrOrTypeDef &def)
     : def(def), params(def.getParameters()), defCls(def.getCppClassName()),
@@ -684,56 +590,17 @@ void DefGen::emitStorageClass() {
 // DefGenerator
 //===----------------------------------------------------------------------===//
 
-namespace mlir::tblgen {
 /// This struct is the base generator used when processing tablegen interfaces.
-class DefGenerator {
-public:
-  bool emitDecls(StringRef selectedDialect);
-  bool emitDefs(StringRef selectedDialect);
-
-protected:
-  DefGenerator(ArrayRef<const Record *> defs, raw_ostream &os,
-               StringRef defType, StringRef valueType, bool isAttrGenerator)
-      : defRecords(defs), os(os), defType(defType), valueType(valueType),
-        isAttrGenerator(isAttrGenerator) {
-    // Sort by occurrence in file.
-    llvm::sort(defRecords, [](const Record *lhs, const Record *rhs) {
-      return lhs->getID() < rhs->getID();
-    });
-  }
-
-  /// Emit the list of def type names.
-  void emitTypeDefList(ArrayRef<AttrOrTypeDef> defs);
-  /// Emit the code to dispatch between different defs during parsing/printing.
-  void emitParsePrintDispatch(ArrayRef<AttrOrTypeDef> defs);
-
-  /// The set of def records to emit.
-  std::vector<const Record *> defRecords;
-  /// The attribute or type class to emit.
-  /// The stream to emit to.
-  raw_ostream &os;
-  /// The prefix of the tablegen def name, e.g. Attr or Type.
-  StringRef defType;
-  /// The C++ base value type of the def, e.g. Attribute or Type.
-  StringRef valueType;
-  /// Flag indicating if this generator is for Attributes. False if the
-  /// generator is for types.
-  bool isAttrGenerator;
-};
-
-/// A specialized generator for AttrDefs.
-struct AttrDefGenerator : public DefGenerator {
-  AttrDefGenerator(const RecordKeeper &records, raw_ostream &os)
-      : DefGenerator(records.getAllDerivedDefinitionsIfDefined("AttrDef"), os,
-                     "Attr", "Attribute", /*isAttrGenerator=*/true) {}
-};
-/// A specialized generator for TypeDefs.
-struct TypeDefGenerator : public DefGenerator {
-  TypeDefGenerator(const RecordKeeper &records, raw_ostream &os)
-      : DefGenerator(records.getAllDerivedDefinitionsIfDefined("TypeDef"), os,
-                     "Type", "Type", /*isAttrGenerator=*/false) {}
-};
-} // namespace mlir::tblgen
+DefGenerator::DefGenerator(ArrayRef<const Record *> defs, raw_ostream &os,
+                           StringRef defType, StringRef valueType,
+                           bool isAttrGenerator)
+    : defRecords(defs), os(os), defType(defType), valueType(valueType),
+      isAttrGenerator(isAttrGenerator) {
+  // Sort by occurrence in file.
+  llvm::sort(defRecords, [](const Record *lhs, const Record *rhs) {
+    return lhs->getID() < rhs->getID();
+  });
+}
 
 //===----------------------------------------------------------------------===//
 // GEN: Declarations
@@ -1048,8 +915,7 @@ getAllTypeConstraints(const RecordKeeper &records) {
   return result;
 }
 
-static void emitTypeConstraintDecls(const RecordKeeper &records,
-                                    raw_ostream &os) {
+void emitTypeConstraintDecls(const RecordKeeper &records, raw_ostream &os) {
   static const char *const typeConstraintDecl = R"(
 bool {0}(::mlir::Type type);
 )";
@@ -1058,8 +924,7 @@ bool {0}(::mlir::Type type);
     os << strfmt(typeConstraintDecl, *constr.getCppFunctionName());
 }
 
-static void emitTypeConstraintDefs(const RecordKeeper &records,
-                                   raw_ostream &os) {
+void emitTypeConstraintDefs(const RecordKeeper &records, raw_ostream &os) {
   static const char *const typeConstraintDef = R"(
 bool {0}(::mlir::Type type) {
   return ({1});
@@ -1073,3 +938,5 @@ bool {0}(::mlir::Type type) {
     os << strfmt(typeConstraintDef, *constr.getCppFunctionName(), condition);
   }
 }
+
+} // namespace mlir::tblgen
diff --git a/mlir/tools/mlir-tblgen/mlir-tblgen.cpp b/mlir/tools/mlir-tblgen/mlir-tblgen.cpp
index a338674f3ff6fb..144c2f4225b8d8 100644
--- a/mlir/tools/mlir-tblgen/mlir-tblgen.cpp
+++ b/mlir/tools/mlir-tblgen/mlir-tblgen.cpp
@@ -10,6 +10,7 @@
 //
 //===----------------------------------------------------------------------===//
 
+#include "mlir/TableGen/AttrOrTypeDef.h"
 #include "mlir/TableGen/GenInfo.h"
 #include "mlir/Tools/mlir-tblgen/MlirTblgenMain.h"
 
@@ -32,13 +33,13 @@ static llvm::cl::opt<std::string>
 static mlir::GenRegistration
     genAttrDefs("gen-attrdef-defs", "Generate AttrDef definitions",
                 [](const RecordKeeper &records, raw_ostream &os) {
-                  AttrDefGenerator generator(records, os);
+                  tblgen::AttrDefGenerator generator(records, os);
                   return generator.emitDefs(attrDialect);
                 });
 static mlir::GenRegistration
     genAttrDecls("gen-attrdef-decls", "Generate AttrDef declarations",
                  [](const RecordKeeper &records, raw_ostream &os) {
-                   AttrDefGenerator generator(records, os);
+                   tblgen::AttrDefGenerator generator(records, os);
                    return generator.emitDecls(attrDialect);
                  });
 
@@ -55,13 +56,13 @@ static llvm::cl::opt<std::string>
 static mlir::GenRegistration
     genTypeDefs("gen-typedef-defs", "Generate TypeDef definitions",
                 [](const RecordKeeper &records, raw_ostream &os) {
-                  TypeDefGenerator generator(records, os);
+                  tblgen::TypeDefGenerator generator(records, os);
                   return generator.emitDefs(typeDialect);
                 });
 static mlir::GenRegistration
     genTypeDecls("gen-typedef-decls", "Generate TypeDef declarations",
                  [](const RecordKeeper &records, raw_ostream &os) {
-                   TypeDefGenerator generator(records, os);
+                   tblgen::TypeDefGenerator generator(records, os);
                    return generator.emitDecls(typeDialect);
                  });
 
@@ -69,14 +70,14 @@ static mlir::GenRegistration
     genTypeConstrDefs("gen-type-constraint-defs",
                       "Generate type constraint definitions",
                       [](const RecordKeeper &records, raw_ostream &os) {
-                        emitTypeConstraintDefs(records, os);
+                        tblgen::emitTypeConstraintDefs(records, os);
                         return false;
                       });
 static mlir::GenRegistration
     genTypeConstrDecls("gen-type-constraint-decls",
                        "Generate type constraint declarations",
                        [](const RecordKeeper &records, raw_ostream &os) {
-                         emitTypeConstraintDecls(records, os);
+                         tblgen::emitTypeConstraintDecls(records, os);
                          return false;
                        });
 

>From 9ecf9fd6250b492fb561d41ca5ba5064a81ca72a Mon Sep 17 00:00:00 2001
From: Maksim Levental <maksim.levental at gmail.com>
Date: Sat, 26 Oct 2024 18:04:00 -0400
Subject: [PATCH 07/27] expose bytecode

---
 mlir/include/mlir/TableGen/Bytecode.h    | 18 ++++++++++++++++++
 mlir/lib/TableGen/BytecodeDialectGen.cpp |  3 ++-
 mlir/tools/mlir-tblgen/mlir-tblgen.cpp   |  4 +++-
 3 files changed, 23 insertions(+), 2 deletions(-)
 create mode 100644 mlir/include/mlir/TableGen/Bytecode.h

diff --git a/mlir/include/mlir/TableGen/Bytecode.h b/mlir/include/mlir/TableGen/Bytecode.h
new file mode 100644
index 00000000000000..33a0b1466d4366
--- /dev/null
+++ b/mlir/include/mlir/TableGen/Bytecode.h
@@ -0,0 +1,18 @@
+//===-- Bytecode.h - Bytecode definitions -*- C++ -----------------------*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+
+#ifndef MLIR_TABLEGEN_BYTECODE_H
+#define MLIR_TABLEGEN_BYTECODE_H
+
+namespace llvm {
+class RecordKeeper;
+} // namespace llvm
+
+namespace mlir::tblgen {
+bool emitBCRW(const llvm::RecordKeeper &records, raw_ostream &os);
+} // namespace mlir::tblgen
+
+#endif // MLIR_TABLEGEN_BYTECODE_H
diff --git a/mlir/lib/TableGen/BytecodeDialectGen.cpp b/mlir/lib/TableGen/BytecodeDialectGen.cpp
index d0e5bcce075dec..726d9c8975493a 100644
--- a/mlir/lib/TableGen/BytecodeDialectGen.cpp
+++ b/mlir/lib/TableGen/BytecodeDialectGen.cpp
@@ -7,6 +7,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "mlir/Support/IndentedOstream.h"
+#include "mlir/TableGen/Bytecode.h"
 #include "mlir/TableGen/GenInfo.h"
 #include "llvm/ADT/MapVector.h"
 #include "llvm/ADT/STLExtras.h"
@@ -432,7 +433,7 @@ struct AttrOrType {
   std::vector<const Record *> attr, type;
 };
 
-static bool emitBCRW(const RecordKeeper &records, raw_ostream &os) {
+bool emitBCRW(const RecordKeeper &records, raw_ostream &os) {
   MapVector<StringRef, AttrOrType> dialectAttrOrType;
   for (const Record *it :
        records.getAllDerivedDefinitions("DialectAttributes")) {
diff --git a/mlir/tools/mlir-tblgen/mlir-tblgen.cpp b/mlir/tools/mlir-tblgen/mlir-tblgen.cpp
index 144c2f4225b8d8..c23c40aba356ba 100644
--- a/mlir/tools/mlir-tblgen/mlir-tblgen.cpp
+++ b/mlir/tools/mlir-tblgen/mlir-tblgen.cpp
@@ -17,6 +17,8 @@
 #include "llvm/Support/CommandLine.h"
 #include "llvm/TableGen/Record.h"
 
+#include <mlir/TableGen/Bytecode.h>
+
 using namespace llvm;
 using namespace mlir;
 
@@ -88,7 +90,7 @@ static mlir::GenRegistration
 static mlir::GenRegistration
     genBCRW("gen-bytecode", "Generate dialect bytecode readers/writers",
             [](const RecordKeeper &records, raw_ostream &os) {
-              return emitBCRW(records, os);
+              return tblgen::emitBCRW(records, os);
             });
 
 //===----------------------------------------------------------------------===//

>From 6d5497864c5a9f1c5f6df3c66465414f69b716a8 Mon Sep 17 00:00:00 2001
From: Maksim Levental <maksim.levental at gmail.com>
Date: Sat, 26 Oct 2024 18:07:01 -0400
Subject: [PATCH 08/27] expose dialect

---
 mlir/include/mlir/TableGen/Dialect.h   | 4 ++++
 mlir/lib/TableGen/DialectGen.cpp       | 4 ++--
 mlir/tools/mlir-tblgen/mlir-tblgen.cpp | 4 ++--
 3 files changed, 8 insertions(+), 4 deletions(-)

diff --git a/mlir/include/mlir/TableGen/Dialect.h b/mlir/include/mlir/TableGen/Dialect.h
index ea8f40555e4451..4f5380d8bab1c7 100644
--- a/mlir/include/mlir/TableGen/Dialect.h
+++ b/mlir/include/mlir/TableGen/Dialect.h
@@ -112,6 +112,10 @@ class Dialect {
   const llvm::Record *def;
   std::vector<StringRef> dependentDialects;
 };
+
+bool emitDialectDecls(const llvm::RecordKeeper &records, raw_ostream &os);
+bool emitDialectDefs(const llvm::RecordKeeper &records, raw_ostream &os);
+
 } // namespace tblgen
 } // namespace mlir
 
diff --git a/mlir/lib/TableGen/DialectGen.cpp b/mlir/lib/TableGen/DialectGen.cpp
index 33ede2a3208263..5298f86e22e1f1 100644
--- a/mlir/lib/TableGen/DialectGen.cpp
+++ b/mlir/lib/TableGen/DialectGen.cpp
@@ -298,7 +298,7 @@ static void emitDialectDecl(Dialect &dialect, raw_ostream &os) {
        << "::" << dialect.getCppClassName() << ")\n";
 }
 
-static bool emitDialectDecls(const RecordKeeper &records, raw_ostream &os) {
+bool emitDialectDecls(const RecordKeeper &records, raw_ostream &os) {
   emitSourceFileHeader("Dialect Declarations", os, records);
 
   auto dialectDefs = records.getAllDerivedDefinitions("Dialect");
@@ -390,7 +390,7 @@ static void emitDialectDef(Dialect &dialect, const RecordKeeper &records,
     os << llvm::formatv(dialectDestructorStr, cppClassName);
 }
 
-static bool emitDialectDefs(const RecordKeeper &records, raw_ostream &os) {
+bool emitDialectDefs(const RecordKeeper &records, raw_ostream &os) {
   emitSourceFileHeader("Dialect Definitions", os, records);
 
   auto dialectDefs = records.getAllDerivedDefinitions("Dialect");
diff --git a/mlir/tools/mlir-tblgen/mlir-tblgen.cpp b/mlir/tools/mlir-tblgen/mlir-tblgen.cpp
index c23c40aba356ba..bb722956d05f39 100644
--- a/mlir/tools/mlir-tblgen/mlir-tblgen.cpp
+++ b/mlir/tools/mlir-tblgen/mlir-tblgen.cpp
@@ -100,13 +100,13 @@ static mlir::GenRegistration
 static mlir::GenRegistration
     genDialectDecls("gen-dialect-decls", "Generate dialect declarations",
                     [](const RecordKeeper &records, raw_ostream &os) {
-                      return emitDialectDecls(records, os);
+                      return tblgen::emitDialectDecls(records, os);
                     });
 
 static mlir::GenRegistration
     genDialectDefs("gen-dialect-defs", "Generate dialect definitions",
                    [](const RecordKeeper &records, raw_ostream &os) {
-                     return emitDialectDefs(records, os);
+                     return tblgen::emitDialectDefs(records, os);
                    });
 
 //===----------------------------------------------------------------------===//

>From bb301e1c0184b809a599065f0cc9c4c24ac0b94b Mon Sep 17 00:00:00 2001
From: Maksim Levental <maksim.levental at gmail.com>
Date: Sat, 26 Oct 2024 18:09:35 -0400
Subject: [PATCH 09/27] expose directives

---
 mlir/include/mlir/TableGen/Directive.h   | 25 ++++++++++++++++++++++++
 mlir/lib/TableGen/DirectiveCommonGen.cpp |  6 ++++--
 mlir/tools/mlir-tblgen/mlir-tblgen.cpp   |  6 +++---
 3 files changed, 32 insertions(+), 5 deletions(-)
 create mode 100644 mlir/include/mlir/TableGen/Directive.h

diff --git a/mlir/include/mlir/TableGen/Directive.h b/mlir/include/mlir/TableGen/Directive.h
new file mode 100644
index 00000000000000..27e537b0ce8529
--- /dev/null
+++ b/mlir/include/mlir/TableGen/Directive.h
@@ -0,0 +1,25 @@
+//===- Directive.h - Directive class --------------------------------*- C++
+//-*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+
+#ifndef MLIR_TABLEGEN_DIRECTIVE_H_
+#define MLIR_TABLEGEN_DIRECTIVE_H_
+
+#include "mlir/Support/LLVM.h"
+#include "llvm/TableGen/Record.h"
+
+#include <string>
+#include <vector>
+
+namespace mlir {
+namespace tblgen {
+bool emitDirectiveDecls(const llvm::RecordKeeper &records,
+                        llvm::StringRef dialect, raw_ostream &os);
+
+} // namespace tblgen
+} // namespace mlir
+
+#endif // MLIR_TABLEGEN_DIRECTIVE_H_
diff --git a/mlir/lib/TableGen/DirectiveCommonGen.cpp b/mlir/lib/TableGen/DirectiveCommonGen.cpp
index 7d6a3688a63aa0..1fff4c1517ffbc 100644
--- a/mlir/lib/TableGen/DirectiveCommonGen.cpp
+++ b/mlir/lib/TableGen/DirectiveCommonGen.cpp
@@ -11,6 +11,7 @@
 //
 //===----------------------------------------------------------------------===//
 
+#include "mlir/TableGen/Directive.h"
 #include "mlir/TableGen/GenInfo.h"
 
 #include "llvm/ADT/Twine.h"
@@ -42,8 +43,9 @@ using llvm::RecordKeeper;
 // Clause record in OMP.td. This name can be used to specify the type of the
 // OpenMP operation's operand. The allowedClauseValues field provides the list
 // of ClauseValues which are part of the enumeration.
-static bool emitDirectiveDecls(const RecordKeeper &records,
-                               llvm::StringRef dialect, raw_ostream &os) {
+bool mlir::tblgen::emitDirectiveDecls(const RecordKeeper &records,
+                                      llvm::StringRef dialect,
+                                      raw_ostream &os) {
   // A dialect must be selected for the generated attributes.
   if (dialect.empty()) {
     llvm::PrintFatalError("a dialect must be selected for the directives via "
diff --git a/mlir/tools/mlir-tblgen/mlir-tblgen.cpp b/mlir/tools/mlir-tblgen/mlir-tblgen.cpp
index bb722956d05f39..0604aa1223eaab 100644
--- a/mlir/tools/mlir-tblgen/mlir-tblgen.cpp
+++ b/mlir/tools/mlir-tblgen/mlir-tblgen.cpp
@@ -11,14 +11,14 @@
 //===----------------------------------------------------------------------===//
 
 #include "mlir/TableGen/AttrOrTypeDef.h"
+#include "mlir/TableGen/Bytecode.h"
+#include "mlir/TableGen/Directive.h"
 #include "mlir/TableGen/GenInfo.h"
 #include "mlir/Tools/mlir-tblgen/MlirTblgenMain.h"
 
 #include "llvm/Support/CommandLine.h"
 #include "llvm/TableGen/Record.h"
 
-#include <mlir/TableGen/Bytecode.h>
-
 using namespace llvm;
 using namespace mlir;
 
@@ -125,7 +125,7 @@ static mlir::GenRegistration genDirectiveDecls(
     "gen-directive-decl",
     "Generate declarations for directives (OpenMP/OpenACC etc.)",
     [](const RecordKeeper &records, raw_ostream &os) {
-      return emitDirectiveDecls(records, dialect, os);
+      return tblgen::emitDirectiveDecls(records, dialect, os);
     });
 
 //===----------------------------------------------------------------------===//

>From 05073f1a860ec9d8bf1e4db9ec1b97b411d91589 Mon Sep 17 00:00:00 2001
From: Maksim Levental <maksim.levental at gmail.com>
Date: Sat, 26 Oct 2024 18:17:06 -0400
Subject: [PATCH 10/27] expose python

---
 mlir/include/mlir/TableGen/Python.h        | 19 +++++++++++++++++++
 mlir/lib/TableGen/EnumPythonBindingGen.cpp |  6 ++++--
 mlir/lib/TableGen/OpPythonBindingGen.cpp   |  7 ++++---
 mlir/tools/mlir-tblgen/mlir-tblgen.cpp     |  5 +++--
 4 files changed, 30 insertions(+), 7 deletions(-)
 create mode 100644 mlir/include/mlir/TableGen/Python.h

diff --git a/mlir/include/mlir/TableGen/Python.h b/mlir/include/mlir/TableGen/Python.h
new file mode 100644
index 00000000000000..d350fca7e574fc
--- /dev/null
+++ b/mlir/include/mlir/TableGen/Python.h
@@ -0,0 +1,19 @@
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+
+#ifndef MLIR_TABLEGEN_PYTHON_H_
+#define MLIR_TABLEGEN_PYTHON_H_
+
+#include "mlir/Support/LLVM.h"
+#include "llvm/TableGen/Record.h"
+
+namespace mlir {
+namespace tblgen {
+bool emitPythonEnums(const llvm::RecordKeeper &records, raw_ostream &os);
+bool emitAllPythonOps(const llvm::RecordKeeper &records, raw_ostream &os);
+
+} // namespace tblgen
+} // namespace mlir
+
+#endif // MLIR_TABLEGEN_PYTHON_H_
diff --git a/mlir/lib/TableGen/EnumPythonBindingGen.cpp b/mlir/lib/TableGen/EnumPythonBindingGen.cpp
index b063a1ec6c8e82..29fb2501233156 100644
--- a/mlir/lib/TableGen/EnumPythonBindingGen.cpp
+++ b/mlir/lib/TableGen/EnumPythonBindingGen.cpp
@@ -10,12 +10,13 @@
 // generate the corresponding Python binding classes.
 //
 //===----------------------------------------------------------------------===//
-#include "mlir/TableGen/OpGenHelpers.h"
 
 #include "mlir/TableGen/AttrOrTypeDef.h"
 #include "mlir/TableGen/Attribute.h"
 #include "mlir/TableGen/Dialect.h"
 #include "mlir/TableGen/GenInfo.h"
+#include "mlir/TableGen/OpGenHelpers.h"
+#include "mlir/TableGen/Python.h"
 #include "llvm/Support/FormatVariadic.h"
 #include "llvm/TableGen/Record.h"
 
@@ -132,7 +133,8 @@ static bool emitDialectEnumAttributeBuilder(StringRef attrDefName,
 
 /// Emits Python bindings for all enums in the record keeper. Returns
 /// `false` on success, `true` on failure.
-static bool emitPythonEnums(const RecordKeeper &records, raw_ostream &os) {
+bool mlir::tblgen::emitPythonEnums(const RecordKeeper &records,
+                                   raw_ostream &os) {
   os << fileHeader;
   for (const Record *it :
        records.getAllDerivedDefinitionsIfDefined("EnumAttrInfo")) {
diff --git a/mlir/lib/TableGen/OpPythonBindingGen.cpp b/mlir/lib/TableGen/OpPythonBindingGen.cpp
index db1e76c5a9899e..d47e21702e0c34 100644
--- a/mlir/lib/TableGen/OpPythonBindingGen.cpp
+++ b/mlir/lib/TableGen/OpPythonBindingGen.cpp
@@ -11,10 +11,10 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "mlir/TableGen/OpGenHelpers.h"
-
 #include "mlir/TableGen/GenInfo.h"
+#include "mlir/TableGen/OpGenHelpers.h"
 #include "mlir/TableGen/Operator.h"
+#include "mlir/TableGen/Python.h"
 #include "llvm/ADT/StringSet.h"
 #include "llvm/Support/CommandLine.h"
 #include "llvm/Support/FormatVariadic.h"
@@ -1027,7 +1027,8 @@ static void emitOpBindings(const Operator &op, raw_ostream &os) {
 /// Emits bindings for the dialect specified in the command line, including file
 /// headers and utilities. Returns `false` on success to comply with Tablegen
 /// registration requirements.
-static bool emitAllPythonOps(const RecordKeeper &records, raw_ostream &os) {
+bool mlir::tblgen::emitAllPythonOps(const RecordKeeper &records,
+                                    raw_ostream &os) {
   if (clDialectName.empty())
     llvm::PrintFatalError("dialect name not provided");
 
diff --git a/mlir/tools/mlir-tblgen/mlir-tblgen.cpp b/mlir/tools/mlir-tblgen/mlir-tblgen.cpp
index 0604aa1223eaab..f976f70d3a4e34 100644
--- a/mlir/tools/mlir-tblgen/mlir-tblgen.cpp
+++ b/mlir/tools/mlir-tblgen/mlir-tblgen.cpp
@@ -14,6 +14,7 @@
 #include "mlir/TableGen/Bytecode.h"
 #include "mlir/TableGen/Directive.h"
 #include "mlir/TableGen/GenInfo.h"
+#include "mlir/TableGen/Python.h"
 #include "mlir/Tools/mlir-tblgen/MlirTblgenMain.h"
 
 #include "llvm/Support/CommandLine.h"
@@ -136,7 +137,7 @@ static mlir::GenRegistration genDirectiveDecls(
 static mlir::GenRegistration
     genPythonEnumBindings("gen-python-enum-bindings",
                           "Generate Python bindings for enum attributes",
-                          &emitPythonEnums);
+                          &tblgen::emitPythonEnums);
 
 //===----------------------------------------------------------------------===//
 // Enum registration hooks
@@ -310,7 +311,7 @@ static InterfaceGenRegistration<TypeInterfaceGenerator>
 static GenRegistration
     genPythonBindings("gen-python-op-bindings",
                       "Generate Python bindings for MLIR Ops",
-                      &emitAllPythonOps);
+                      &tblgen::emitAllPythonOps);
 
 //===----------------------------------------------------------------------===//
 // Pass CAPI registration hooks

>From 828ed7125547bc6a451f9783c1f28a02da22e85b Mon Sep 17 00:00:00 2001
From: Maksim Levental <maksim.levental at gmail.com>
Date: Sat, 26 Oct 2024 18:18:17 -0400
Subject: [PATCH 11/27] expose interfaces

---
 mlir/include/mlir/TableGen/Interfaces.h |  53 +++++++++++
 mlir/lib/TableGen/OpInterfacesGen.cpp   | 120 +++++++++---------------
 mlir/tools/mlir-tblgen/mlir-tblgen.cpp  |   9 +-
 3 files changed, 100 insertions(+), 82 deletions(-)

diff --git a/mlir/include/mlir/TableGen/Interfaces.h b/mlir/include/mlir/TableGen/Interfaces.h
index 15f667e0ffce00..660e9854b2244e 100644
--- a/mlir/include/mlir/TableGen/Interfaces.h
+++ b/mlir/include/mlir/TableGen/Interfaces.h
@@ -10,9 +10,11 @@
 #define MLIR_TABLEGEN_INTERFACES_H_
 
 #include "mlir/Support/LLVM.h"
+#include "mlir/TableGen/Format.h"
 #include "llvm/ADT/SmallVector.h"
 #include "llvm/ADT/StringRef.h"
 #include "llvm/ADT/iterator.h"
+#include "llvm/TableGen/Record.h"
 
 namespace llvm {
 class Init;
@@ -150,6 +152,57 @@ struct TypeInterface : public Interface {
 
   static bool classof(const Interface *interface);
 };
+
+class InterfaceGenerator {
+public:
+  bool emitInterfaceDefs();
+  bool emitInterfaceDecls();
+  bool emitInterfaceDocs();
+
+protected:
+  InterfaceGenerator(std::vector<const llvm::Record *> &&defs, raw_ostream &os)
+      : defs(std::move(defs)), os(os) {}
+
+  void emitConceptDecl(const Interface &interface);
+  void emitModelDecl(const Interface &interface);
+  void emitModelMethodsDef(const Interface &interface);
+  void emitTraitDecl(const Interface &interface, StringRef interfaceName,
+                     StringRef interfaceTraitsName);
+  void emitInterfaceDecl(const Interface &interface);
+
+  /// The set of interface records to emit.
+  std::vector<const llvm::Record *> defs;
+  // The stream to emit to.
+  raw_ostream &os;
+  /// The C++ value type of the interface, e.g. Operation*.
+  StringRef valueType;
+  /// The C++ base interface type.
+  StringRef interfaceBaseType;
+  /// The name of the typename for the value template.
+  StringRef valueTemplate;
+  /// The name of the substituion variable for the value.
+  StringRef substVar;
+  /// The format context to use for methods.
+  tblgen::FmtContext nonStaticMethodFmt;
+  tblgen::FmtContext traitMethodFmt;
+  tblgen::FmtContext extraDeclsFmt;
+};
+
+/// A specialized generator for attribute interfaces.
+struct AttrInterfaceGenerator : public InterfaceGenerator {
+  AttrInterfaceGenerator(const llvm::RecordKeeper &records, raw_ostream &os);
+};
+
+/// A specialized generator for operation interfaces.
+struct OpInterfaceGenerator : public InterfaceGenerator {
+  OpInterfaceGenerator(const llvm::RecordKeeper &records, raw_ostream &os);
+};
+
+/// A specialized generator for type interfaces.
+struct TypeInterfaceGenerator : public InterfaceGenerator {
+  TypeInterfaceGenerator(const llvm::RecordKeeper &records, raw_ostream &os);
+};
+
 } // namespace tblgen
 } // namespace mlir
 
diff --git a/mlir/lib/TableGen/OpInterfacesGen.cpp b/mlir/lib/TableGen/OpInterfacesGen.cpp
index 370de62b90a01f..f3c5c3467a7660 100644
--- a/mlir/lib/TableGen/OpInterfacesGen.cpp
+++ b/mlir/lib/TableGen/OpInterfacesGen.cpp
@@ -82,87 +82,51 @@ getAllInterfaceDefinitions(const RecordKeeper &records, StringRef name) {
 
 namespace mlir::tblgen {
 /// This struct is the base generator used when processing tablegen interfaces.
-class InterfaceGenerator {
-public:
-  bool emitInterfaceDefs();
-  bool emitInterfaceDecls();
-  bool emitInterfaceDocs();
-
-protected:
-  InterfaceGenerator(std::vector<const Record *> &&defs, raw_ostream &os)
-      : defs(std::move(defs)), os(os) {}
-
-  void emitConceptDecl(const Interface &interface);
-  void emitModelDecl(const Interface &interface);
-  void emitModelMethodsDef(const Interface &interface);
-  void emitTraitDecl(const Interface &interface, StringRef interfaceName,
-                     StringRef interfaceTraitsName);
-  void emitInterfaceDecl(const Interface &interface);
-
-  /// The set of interface records to emit.
-  std::vector<const Record *> defs;
-  // The stream to emit to.
-  raw_ostream &os;
-  /// The C++ value type of the interface, e.g. Operation*.
-  StringRef valueType;
-  /// The C++ base interface type.
-  StringRef interfaceBaseType;
-  /// The name of the typename for the value template.
-  StringRef valueTemplate;
-  /// The name of the substituion variable for the value.
-  StringRef substVar;
-  /// The format context to use for methods.
-  tblgen::FmtContext nonStaticMethodFmt;
-  tblgen::FmtContext traitMethodFmt;
-  tblgen::FmtContext extraDeclsFmt;
-};
-
 /// A specialized generator for attribute interfaces.
-struct AttrInterfaceGenerator : public InterfaceGenerator {
-  AttrInterfaceGenerator(const RecordKeeper &records, raw_ostream &os)
-      : InterfaceGenerator(getAllInterfaceDefinitions(records, "Attr"), os) {
-    valueType = "::mlir::Attribute";
-    interfaceBaseType = "AttributeInterface";
-    valueTemplate = "ConcreteAttr";
-    substVar = "_attr";
-    StringRef castCode = "(::llvm::cast<ConcreteAttr>(tablegen_opaque_val))";
-    nonStaticMethodFmt.addSubst(substVar, castCode).withSelf(castCode);
-    traitMethodFmt.addSubst(substVar,
-                            "(*static_cast<const ConcreteAttr *>(this))");
-    extraDeclsFmt.addSubst(substVar, "(*this)");
-  }
-};
+AttrInterfaceGenerator::AttrInterfaceGenerator(const RecordKeeper &records,
+                                               raw_ostream &os)
+    : InterfaceGenerator(getAllInterfaceDefinitions(records, "Attr"), os) {
+  valueType = "::mlir::Attribute";
+  interfaceBaseType = "AttributeInterface";
+  valueTemplate = "ConcreteAttr";
+  substVar = "_attr";
+  StringRef castCode = "(::llvm::cast<ConcreteAttr>(tablegen_opaque_val))";
+  nonStaticMethodFmt.addSubst(substVar, castCode).withSelf(castCode);
+  traitMethodFmt.addSubst(substVar,
+                          "(*static_cast<const ConcreteAttr *>(this))");
+  extraDeclsFmt.addSubst(substVar, "(*this)");
+}
+
 /// A specialized generator for operation interfaces.
-struct OpInterfaceGenerator : public InterfaceGenerator {
-  OpInterfaceGenerator(const RecordKeeper &records, raw_ostream &os)
-      : InterfaceGenerator(getAllInterfaceDefinitions(records, "Op"), os) {
-    valueType = "::mlir::Operation *";
-    interfaceBaseType = "OpInterface";
-    valueTemplate = "ConcreteOp";
-    substVar = "_op";
-    StringRef castCode = "(llvm::cast<ConcreteOp>(tablegen_opaque_val))";
-    nonStaticMethodFmt.addSubst("_this", "impl")
-        .addSubst(substVar, castCode)
-        .withSelf(castCode);
-    traitMethodFmt.addSubst(substVar, "(*static_cast<ConcreteOp *>(this))");
-    extraDeclsFmt.addSubst(substVar, "(*this)");
-  }
-};
+OpInterfaceGenerator::OpInterfaceGenerator(const RecordKeeper &records,
+                                           raw_ostream &os)
+    : InterfaceGenerator(getAllInterfaceDefinitions(records, "Op"), os) {
+  valueType = "::mlir::Operation *";
+  interfaceBaseType = "OpInterface";
+  valueTemplate = "ConcreteOp";
+  substVar = "_op";
+  StringRef castCode = "(llvm::cast<ConcreteOp>(tablegen_opaque_val))";
+  nonStaticMethodFmt.addSubst("_this", "impl")
+      .addSubst(substVar, castCode)
+      .withSelf(castCode);
+  traitMethodFmt.addSubst(substVar, "(*static_cast<ConcreteOp *>(this))");
+  extraDeclsFmt.addSubst(substVar, "(*this)");
+}
+
 /// A specialized generator for type interfaces.
-struct TypeInterfaceGenerator : public InterfaceGenerator {
-  TypeInterfaceGenerator(const RecordKeeper &records, raw_ostream &os)
-      : InterfaceGenerator(getAllInterfaceDefinitions(records, "Type"), os) {
-    valueType = "::mlir::Type";
-    interfaceBaseType = "TypeInterface";
-    valueTemplate = "ConcreteType";
-    substVar = "_type";
-    StringRef castCode = "(::llvm::cast<ConcreteType>(tablegen_opaque_val))";
-    nonStaticMethodFmt.addSubst(substVar, castCode).withSelf(castCode);
-    traitMethodFmt.addSubst(substVar,
-                            "(*static_cast<const ConcreteType *>(this))");
-    extraDeclsFmt.addSubst(substVar, "(*this)");
-  }
-};
+TypeInterfaceGenerator::TypeInterfaceGenerator(const RecordKeeper &records,
+                                               raw_ostream &os)
+    : InterfaceGenerator(getAllInterfaceDefinitions(records, "Type"), os) {
+  valueType = "::mlir::Type";
+  interfaceBaseType = "TypeInterface";
+  valueTemplate = "ConcreteType";
+  substVar = "_type";
+  StringRef castCode = "(::llvm::cast<ConcreteType>(tablegen_opaque_val))";
+  nonStaticMethodFmt.addSubst(substVar, castCode).withSelf(castCode);
+  traitMethodFmt.addSubst(substVar,
+                          "(*static_cast<const ConcreteType *>(this))");
+  extraDeclsFmt.addSubst(substVar, "(*this)");
+}
 
 //===----------------------------------------------------------------------===//
 // GEN: Interface definitions
diff --git a/mlir/tools/mlir-tblgen/mlir-tblgen.cpp b/mlir/tools/mlir-tblgen/mlir-tblgen.cpp
index f976f70d3a4e34..2dee234d057a12 100644
--- a/mlir/tools/mlir-tblgen/mlir-tblgen.cpp
+++ b/mlir/tools/mlir-tblgen/mlir-tblgen.cpp
@@ -14,6 +14,7 @@
 #include "mlir/TableGen/Bytecode.h"
 #include "mlir/TableGen/Directive.h"
 #include "mlir/TableGen/GenInfo.h"
+#include "mlir/TableGen/Interfaces.h"
 #include "mlir/TableGen/Python.h"
 #include "mlir/Tools/mlir-tblgen/MlirTblgenMain.h"
 
@@ -297,11 +298,11 @@ struct InterfaceGenRegistration {
 };
 } // namespace
 
-static InterfaceGenRegistration<AttrInterfaceGenerator>
+static InterfaceGenRegistration<tblgen::AttrInterfaceGenerator>
     attrInterfaceGen("attr", "attribute");
-static InterfaceGenRegistration<OpInterfaceGenerator> opInterfaceGen("op",
-                                                                     "op");
-static InterfaceGenRegistration<TypeInterfaceGenerator>
+static InterfaceGenRegistration<tblgen::OpInterfaceGenerator>
+    opInterfaceGen("op", "op");
+static InterfaceGenRegistration<tblgen::TypeInterfaceGenerator>
     typeInterfaceGen("type", "type");
 
 //===----------------------------------------------------------------------===//

>From df3a246ff686da25f15899900ff742cd83a3d73a Mon Sep 17 00:00:00 2001
From: Maksim Levental <maksim.levental at gmail.com>
Date: Sat, 26 Oct 2024 18:20:55 -0400
Subject: [PATCH 12/27] expose enums

---
 mlir/include/mlir/TableGen/Attribute.h | 4 ++++
 mlir/lib/TableGen/EnumsGen.cpp         | 4 ++--
 mlir/tools/mlir-tblgen/mlir-tblgen.cpp | 5 +++--
 3 files changed, 9 insertions(+), 4 deletions(-)

diff --git a/mlir/include/mlir/TableGen/Attribute.h b/mlir/include/mlir/TableGen/Attribute.h
index 62720e74849fcd..c1d8938550a983 100644
--- a/mlir/include/mlir/TableGen/Attribute.h
+++ b/mlir/include/mlir/TableGen/Attribute.h
@@ -19,6 +19,7 @@
 #include "llvm/ADT/StringRef.h"
 
 namespace llvm {
+class RecordKeeper;
 class DefInit;
 class Record;
 } // namespace llvm
@@ -212,6 +213,9 @@ class EnumAttr : public Attribute {
 // Name of infer type op interface.
 extern const char *inferTypeOpInterface;
 
+bool emitEnumDecls(const llvm::RecordKeeper &records, raw_ostream &os);
+bool emitEnumDefs(const llvm::RecordKeeper &records, raw_ostream &os);
+
 } // namespace tblgen
 } // namespace mlir
 
diff --git a/mlir/lib/TableGen/EnumsGen.cpp b/mlir/lib/TableGen/EnumsGen.cpp
index 244a97e5a6d350..f00502c54452c9 100644
--- a/mlir/lib/TableGen/EnumsGen.cpp
+++ b/mlir/lib/TableGen/EnumsGen.cpp
@@ -641,7 +641,7 @@ class {1} : public ::mlir::{2} {
   emitDenseMapInfo(qualName, underlyingType, cppNamespace, os);
 }
 
-static bool emitEnumDecls(const RecordKeeper &records, raw_ostream &os) {
+bool mlir::tblgen::emitEnumDecls(const RecordKeeper &records, raw_ostream &os) {
   llvm::emitSourceFileHeader("Enum Utility Declarations", os, records);
 
   for (const Record *def :
@@ -679,7 +679,7 @@ static void emitEnumDef(const Record &enumDef, raw_ostream &os) {
   os << "\n";
 }
 
-static bool emitEnumDefs(const RecordKeeper &records, raw_ostream &os) {
+bool mlir::tblgen::emitEnumDefs(const RecordKeeper &records, raw_ostream &os) {
   llvm::emitSourceFileHeader("Enum Utility Definitions", os, records);
 
   for (const Record *def :
diff --git a/mlir/tools/mlir-tblgen/mlir-tblgen.cpp b/mlir/tools/mlir-tblgen/mlir-tblgen.cpp
index 2dee234d057a12..cc367f9387fddc 100644
--- a/mlir/tools/mlir-tblgen/mlir-tblgen.cpp
+++ b/mlir/tools/mlir-tblgen/mlir-tblgen.cpp
@@ -11,6 +11,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "mlir/TableGen/AttrOrTypeDef.h"
+#include "mlir/TableGen/Attribute.h"
 #include "mlir/TableGen/Bytecode.h"
 #include "mlir/TableGen/Directive.h"
 #include "mlir/TableGen/GenInfo.h"
@@ -148,14 +149,14 @@ static mlir::GenRegistration
 static mlir::GenRegistration
     genEnumDecls("gen-enum-decls", "Generate enum utility declarations",
                  [](const RecordKeeper &records, raw_ostream &os) {
-                   return emitEnumDecls(records, os);
+                   return tblgen::emitEnumDecls(records, os);
                  });
 
 // Registers the enum utility generator to mlir-tblgen.
 static mlir::GenRegistration
     genEnumDefs("gen-enum-defs", "Generate enum utility definitions",
                 [](const RecordKeeper &records, raw_ostream &os) {
-                  return emitEnumDefs(records, os);
+                  return tblgen::emitEnumDefs(records, os);
                 });
 
 //===----------------------------------------------------------------------===//

>From 77a4e88853adcc4d092a2cbde7f756f89a5163ee Mon Sep 17 00:00:00 2001
From: Maksim Levental <maksim.levental at gmail.com>
Date: Sat, 26 Oct 2024 18:33:11 -0400
Subject: [PATCH 13/27] expose llvmir

---
 mlir/include/mlir/TableGen/LLVMIR.h       | 66 +++++++++++++++++++++++
 mlir/lib/TableGen/LLVMIRConversionGen.cpp | 48 ++++++-----------
 mlir/lib/TableGen/LLVMIRIntrinsicGen.cpp  |  5 +-
 mlir/tools/mlir-tblgen/mlir-tblgen.cpp    | 31 +++++++++--
 4 files changed, 110 insertions(+), 40 deletions(-)
 create mode 100644 mlir/include/mlir/TableGen/LLVMIR.h

diff --git a/mlir/include/mlir/TableGen/LLVMIR.h b/mlir/include/mlir/TableGen/LLVMIR.h
new file mode 100644
index 00000000000000..eb99495121c5c0
--- /dev/null
+++ b/mlir/include/mlir/TableGen/LLVMIR.h
@@ -0,0 +1,66 @@
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+
+#ifndef MLIR_TABLEGEN_LLVMIR_H_
+#define MLIR_TABLEGEN_LLVMIR_H_
+
+#include "mlir/Support/LLVM.h"
+
+namespace llvm {
+class Record;
+} // namespace llvm
+
+namespace mlir {
+namespace tblgen {
+
+// Emit all builders.  Returns false on success because of the generator
+// registration requirements.
+bool emitLLVMIRConversionBuilders(const llvm::RecordKeeper &records,
+                                  raw_ostream &os);
+
+// Emit all op builders. Returns false on success because of the
+// generator registration requirements.
+bool emitLLVMIROpMLIRBuilders(const llvm::RecordKeeper &records,
+                              raw_ostream &os);
+
+// Emit all intrinsic MLIR builders. Returns false on success because of the
+// generator registration requirements.
+bool emitLLVMIRIntrMLIRBuilders(const llvm::RecordKeeper &records,
+                                raw_ostream &os);
+
+// Emits conversion function "LLVMClass convertEnumToLLVM(Enum)" and containing
+// switch-based logic to convert from the MLIR LLVM dialect enum attribute case
+// (Enum) to the corresponding LLVM API enumerant
+void emitOneEnumToConversion(const llvm::Record *record, raw_ostream &os);
+
+// Emits conversion function "Enum convertEnumFromLLVM(LLVMClass)" and
+// containing switch-based logic to convert from the LLVM API enumerant to MLIR
+// LLVM dialect enum attribute (Enum).
+void emitOneEnumFromConversion(const llvm::Record *record, raw_ostream &os);
+
+// Emits conversion function "LLVMClass convertEnumToLLVM(Enum)" and containing
+// switch-based logic to convert from the MLIR LLVM dialect enum attribute case
+// (Enum) to the corresponding LLVM API C-style enumerant
+void emitOneCEnumToConversion(const llvm::Record *record, raw_ostream &os);
+
+// Emits conversion function "Enum convertEnumFromLLVM(LLVMEnum)" and
+// containing switch-based logic to convert from the LLVM API C-style enumerant
+// to MLIR LLVM dialect enum attribute (Enum).
+void emitOneCEnumFromConversion(const llvm::Record *record, raw_ostream &os);
+
+// Emit the list of LLVM IR intrinsics identifiers that are convertible to a
+// matching MLIR LLVM dialect intrinsic operation.
+bool emitConvertibleLLVMIRIntrinsics(const llvm::RecordKeeper &records,
+                                     raw_ostream &os);
+
+/// Traverses the list of TableGen definitions derived from the "Intrinsic"
+/// class and generates MLIR ODS definitions for those intrinsics that have
+/// the name matching the filter.
+bool emitLLVMIRIntrinsics(const llvm::RecordKeeper &records,
+                          llvm::raw_ostream &os);
+
+} // namespace tblgen
+} // namespace mlir
+
+#endif // MLIR_TABLEGEN_LLVMIR_H_
diff --git a/mlir/lib/TableGen/LLVMIRConversionGen.cpp b/mlir/lib/TableGen/LLVMIRConversionGen.cpp
index 5c6457450a8d08..4f5da3cb213590 100644
--- a/mlir/lib/TableGen/LLVMIRConversionGen.cpp
+++ b/mlir/lib/TableGen/LLVMIRConversionGen.cpp
@@ -14,6 +14,7 @@
 #include "mlir/TableGen/Argument.h"
 #include "mlir/TableGen/Attribute.h"
 #include "mlir/TableGen/GenInfo.h"
+#include "mlir/TableGen/LLVMIR.h"
 #include "mlir/TableGen/Operator.h"
 
 #include "llvm/ADT/Sequence.h"
@@ -177,8 +178,8 @@ static LogicalResult emitOneBuilder(const Record &record, raw_ostream &os) {
 
 // Emit all builders.  Returns false on success because of the generator
 // registration requirements.
-static bool emitLLVMIRConversionBuilders(const RecordKeeper &records,
-                                         raw_ostream &os) {
+bool mlir::tblgen::emitLLVMIRConversionBuilders(const RecordKeeper &records,
+                                                raw_ostream &os) {
   for (const Record *def : records.getAllDerivedDefinitions("LLVM_OpBase")) {
     if (failed(emitOneBuilder(*def, os)))
       return true;
@@ -305,8 +306,8 @@ static LogicalResult emitOneMLIRBuilder(const Record &record, raw_ostream &os,
 
 // Emit all intrinsic MLIR builders. Returns false on success because of the
 // generator registration requirements.
-static bool emitLLVMIRIntrMLIRBuilders(const RecordKeeper &records,
-                                       raw_ostream &os) {
+bool mlir::tblgen::emitLLVMIRIntrMLIRBuilders(const RecordKeeper &records,
+                                              raw_ostream &os) {
   // Emit condition to check if "llvmEnumName" matches the intrinsic id.
   auto emitIntrCond = [](const Record &record) {
     return "intrinsicID == llvm::Intrinsic::" +
@@ -322,8 +323,8 @@ static bool emitLLVMIRIntrMLIRBuilders(const RecordKeeper &records,
 
 // Emit all op builders. Returns false on success because of the
 // generator registration requirements.
-static bool emitLLVMIROpMLIRBuilders(const RecordKeeper &records,
-                                     raw_ostream &os) {
+bool mlir::tblgen::emitLLVMIROpMLIRBuilders(const RecordKeeper &records,
+                                            raw_ostream &os) {
   // Emit condition to check if "llvmInstName" matches the instruction opcode.
   auto emitOpcodeCond = [](const Record &record) {
     return "inst->getOpcode() == llvm::Instruction::" +
@@ -405,12 +406,11 @@ class LLVMCEnumAttr : public tblgen::EnumAttr {
     return cases;
   }
 };
-} // namespace mlir::tblgen
 
 // Emits conversion function "LLVMClass convertEnumToLLVM(Enum)" and containing
 // switch-based logic to convert from the MLIR LLVM dialect enum attribute case
 // (Enum) to the corresponding LLVM API enumerant
-static void emitOneEnumToConversion(const Record *record, raw_ostream &os) {
+void emitOneEnumToConversion(const Record *record, raw_ostream &os) {
   tblgen::LLVMEnumAttr enumAttr(record);
   StringRef llvmClass = enumAttr.getLLVMClassName();
   StringRef cppClassName = enumAttr.getEnumClassName();
@@ -439,7 +439,7 @@ static void emitOneEnumToConversion(const Record *record, raw_ostream &os) {
 // Emits conversion function "LLVMClass convertEnumToLLVM(Enum)" and containing
 // switch-based logic to convert from the MLIR LLVM dialect enum attribute case
 // (Enum) to the corresponding LLVM API C-style enumerant
-static void emitOneCEnumToConversion(const Record *record, raw_ostream &os) {
+void emitOneCEnumToConversion(const Record *record, raw_ostream &os) {
   tblgen::LLVMCEnumAttr enumAttr(record);
   StringRef llvmClass = enumAttr.getLLVMClassName();
   StringRef cppClassName = enumAttr.getEnumClassName();
@@ -469,7 +469,7 @@ static void emitOneCEnumToConversion(const Record *record, raw_ostream &os) {
 // Emits conversion function "Enum convertEnumFromLLVM(LLVMClass)" and
 // containing switch-based logic to convert from the LLVM API enumerant to MLIR
 // LLVM dialect enum attribute (Enum).
-static void emitOneEnumFromConversion(const Record *record, raw_ostream &os) {
+void emitOneEnumFromConversion(const Record *record, raw_ostream &os) {
   tblgen::LLVMEnumAttr enumAttr(record);
   StringRef llvmClass = enumAttr.getLLVMClassName();
   StringRef cppClassName = enumAttr.getEnumClassName();
@@ -504,7 +504,7 @@ static void emitOneEnumFromConversion(const Record *record, raw_ostream &os) {
 // Emits conversion function "Enum convertEnumFromLLVM(LLVMEnum)" and
 // containing switch-based logic to convert from the LLVM API C-style enumerant
 // to MLIR LLVM dialect enum attribute (Enum).
-static void emitOneCEnumFromConversion(const Record *record, raw_ostream &os) {
+void emitOneCEnumFromConversion(const Record *record, raw_ostream &os) {
   tblgen::LLVMCEnumAttr enumAttr(record);
   StringRef llvmClass = enumAttr.getLLVMClassName();
   StringRef cppClassName = enumAttr.getEnumClassName();
@@ -532,26 +532,6 @@ static void emitOneCEnumFromConversion(const Record *record, raw_ostream &os) {
   os << "}\n\n";
 }
 
-// Emits conversion functions between MLIR enum attribute case and corresponding
-// LLVM API enumerants for all registered LLVM dialect enum attributes.
-template <bool ConvertTo>
-static bool emitLLVMIREnumConversionDefs(const RecordKeeper &records,
-                                         raw_ostream &os) {
-  for (const Record *def : records.getAllDerivedDefinitions("LLVM_EnumAttr"))
-    if (ConvertTo)
-      emitOneEnumToConversion(def, os);
-    else
-      emitOneEnumFromConversion(def, os);
-
-  for (const Record *def : records.getAllDerivedDefinitions("LLVM_CEnumAttr"))
-    if (ConvertTo)
-      emitOneCEnumToConversion(def, os);
-    else
-      emitOneCEnumFromConversion(def, os);
-
-  return false;
-}
-
 static void emitOneIntrinsic(const Record &record, raw_ostream &os) {
   auto op = tblgen::Operator(record);
   os << "llvm::Intrinsic::" << record.getValueAsString("llvmEnumName") << ",\n";
@@ -559,10 +539,12 @@ static void emitOneIntrinsic(const Record &record, raw_ostream &os) {
 
 // Emit the list of LLVM IR intrinsics identifiers that are convertible to a
 // matching MLIR LLVM dialect intrinsic operation.
-static bool emitConvertibleLLVMIRIntrinsics(const RecordKeeper &records,
-                                            raw_ostream &os) {
+bool emitConvertibleLLVMIRIntrinsics(const RecordKeeper &records,
+                                     raw_ostream &os) {
   for (const Record *def : records.getAllDerivedDefinitions("LLVM_IntrOpBase"))
     emitOneIntrinsic(*def, os);
 
   return false;
 }
+
+} // namespace mlir::tblgen
diff --git a/mlir/lib/TableGen/LLVMIRIntrinsicGen.cpp b/mlir/lib/TableGen/LLVMIRIntrinsicGen.cpp
index e1c95f05aab851..1c83ff9eba2ea8 100644
--- a/mlir/lib/TableGen/LLVMIRIntrinsicGen.cpp
+++ b/mlir/lib/TableGen/LLVMIRIntrinsicGen.cpp
@@ -12,6 +12,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "mlir/TableGen/GenInfo.h"
+#include "mlir/TableGen/LLVMIR.h"
 
 #include "llvm/ADT/SmallBitVector.h"
 #include "llvm/CodeGenTypes/MachineValueType.h"
@@ -250,8 +251,8 @@ static bool emitIntrinsic(const Record &record, llvm::raw_ostream &os) {
 /// Traverses the list of TableGen definitions derived from the "Intrinsic"
 /// class and generates MLIR ODS definitions for those intrinsics that have
 /// the name matching the filter.
-static bool emitLLVMIRIntrinsics(const RecordKeeper &records,
-                                 llvm::raw_ostream &os) {
+bool mlir::tblgen::emitLLVMIRIntrinsics(const RecordKeeper &records,
+                                        llvm::raw_ostream &os) {
   llvm::emitSourceFileHeader("Operations for LLVM intrinsics", os, records);
   os << "include \"mlir/Dialect/LLVMIR/LLVMOpBase.td\"\n";
   os << "include \"mlir/Interfaces/SideEffectInterfaces.td\"\n\n";
diff --git a/mlir/tools/mlir-tblgen/mlir-tblgen.cpp b/mlir/tools/mlir-tblgen/mlir-tblgen.cpp
index cc367f9387fddc..a9f02802ca5440 100644
--- a/mlir/tools/mlir-tblgen/mlir-tblgen.cpp
+++ b/mlir/tools/mlir-tblgen/mlir-tblgen.cpp
@@ -16,12 +16,15 @@
 #include "mlir/TableGen/Directive.h"
 #include "mlir/TableGen/GenInfo.h"
 #include "mlir/TableGen/Interfaces.h"
+#include "mlir/TableGen/Pass.h"
 #include "mlir/TableGen/Python.h"
 #include "mlir/Tools/mlir-tblgen/MlirTblgenMain.h"
 
 #include "llvm/Support/CommandLine.h"
 #include "llvm/TableGen/Record.h"
 
+#include "mlir/TableGen/LLVMIR.h"
+
 using namespace llvm;
 using namespace mlir;
 
@@ -163,20 +166,38 @@ static mlir::GenRegistration
 // LLVMIR registration hooks
 //===----------------------------------------------------------------------===//
 
+template <bool ConvertTo>
+bool emitLLVMIREnumConversionDefs(const RecordKeeper &records,
+                                  raw_ostream &os) {
+  for (const Record *def : records.getAllDerivedDefinitions("LLVM_EnumAttr"))
+    if (ConvertTo)
+      tblgen::emitOneEnumToConversion(def, os);
+    else
+      tblgen::emitOneEnumFromConversion(def, os);
+
+  for (const Record *def : records.getAllDerivedDefinitions("LLVM_CEnumAttr"))
+    if (ConvertTo)
+      tblgen::emitOneCEnumToConversion(def, os);
+    else
+      tblgen::emitOneCEnumFromConversion(def, os);
+
+  return false;
+}
+
 static mlir::GenRegistration
     genLLVMIRConversions("gen-llvmir-conversions",
                          "Generate LLVM IR conversions",
-                         emitLLVMIRConversionBuilders);
+                         tblgen::emitLLVMIRConversionBuilders);
 
 static mlir::GenRegistration genOpFromLLVMIRConversions(
     "gen-op-from-llvmir-conversions",
     "Generate conversions of operations from LLVM IR",
-    emitLLVMIROpMLIRBuilders);
+    tblgen::emitLLVMIROpMLIRBuilders);
 
 static mlir::GenRegistration genIntrFromLLVMIRConversions(
     "gen-intr-from-llvmir-conversions",
     "Generate conversions of intrinsics from LLVM IR",
-    emitLLVMIRIntrMLIRBuilders);
+    tblgen::emitLLVMIRIntrMLIRBuilders);
 
 static mlir::GenRegistration
     genEnumToLLVMConversion("gen-enum-to-llvmir-conversions",
@@ -191,11 +212,11 @@ static mlir::GenRegistration genEnumFromLLVMConversion(
 static mlir::GenRegistration genConvertibleLLVMIRIntrinsics(
     "gen-convertible-llvmir-intrinsics",
     "Generate list of convertible LLVM IR intrinsics",
-    emitConvertibleLLVMIRIntrinsics);
+    tblgen::emitConvertibleLLVMIRIntrinsics);
 
 static mlir::GenRegistration genLLVMIRIntrinsics("gen-llvmir-intrinsics",
                                                  "Generate LLVM IR intrinsics",
-                                                 emitLLVMIRIntrinsics);
+                                                 tblgen::emitLLVMIRIntrinsics);
 
 //===----------------------------------------------------------------------===//
 // OpenMP registration hooks

>From 5545aa1c3cb537bac73158e3b1f1bca5cadcca75 Mon Sep 17 00:00:00 2001
From: Maksim Levental <maksim.levental at gmail.com>
Date: Sat, 26 Oct 2024 18:35:19 -0400
Subject: [PATCH 14/27] expose openmp

---
 mlir/include/mlir/TableGen/OpenMP.h    | 26 ++++++++++++++++++++++++++
 mlir/lib/TableGen/OmpOpGen.cpp         |  9 +++++----
 mlir/tools/mlir-tblgen/mlir-tblgen.cpp |  5 +++--
 3 files changed, 34 insertions(+), 6 deletions(-)
 create mode 100644 mlir/include/mlir/TableGen/OpenMP.h

diff --git a/mlir/include/mlir/TableGen/OpenMP.h b/mlir/include/mlir/TableGen/OpenMP.h
new file mode 100644
index 00000000000000..3701db6a381763
--- /dev/null
+++ b/mlir/include/mlir/TableGen/OpenMP.h
@@ -0,0 +1,26 @@
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+
+#ifndef MLIR_TABLEGEN_OPENMP_H_
+#define MLIR_TABLEGEN_OPENMP_H_
+
+#include "mlir/Support/LLVM.h"
+
+namespace mlir {
+namespace tblgen {
+
+/// Verify that all properties of `OpenMP_Clause`s of records deriving from
+/// `OpenMP_Op`s have been inherited by the latter.
+bool verifyOpenmpDecls(const llvm::RecordKeeper &records, raw_ostream &);
+
+/// Generate structures to represent clause-related operands, based on existing
+/// `OpenMP_Clause` definitions and aggregate them into operation-specific
+/// structures according to the `clauses` argument of each definition deriving
+/// from `OpenMP_Op`.
+bool genOpenmpClauseOps(const llvm::RecordKeeper &records, raw_ostream &os);
+
+} // namespace tblgen
+} // namespace mlir
+
+#endif // MLIR_TABLEGEN_OPENMP_H_
diff --git a/mlir/lib/TableGen/OmpOpGen.cpp b/mlir/lib/TableGen/OmpOpGen.cpp
index 4d92b2b2cbc645..e20bdbbe9ababa 100644
--- a/mlir/lib/TableGen/OmpOpGen.cpp
+++ b/mlir/lib/TableGen/OmpOpGen.cpp
@@ -10,9 +10,8 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "mlir/TableGen/GenInfo.h"
-
 #include "mlir/TableGen/CodeGenHelpers.h"
+#include "mlir/TableGen/OpenMP.h"
 #include "llvm/ADT/StringExtras.h"
 #include "llvm/ADT/StringSet.h"
 #include "llvm/ADT/TypeSwitch.h"
@@ -327,9 +326,10 @@ static void genOperandsDef(const Record *op, raw_ostream &os) {
   os << formatv(operationArgStruct, opName, join(clauseNames, ", "));
 }
 
+namespace mlir::tblgen {
 /// Verify that all properties of `OpenMP_Clause`s of records deriving from
 /// `OpenMP_Op`s have been inherited by the latter.
-static bool verifyOpenmpDecls(const RecordKeeper &records, raw_ostream &) {
+bool verifyOpenmpDecls(const RecordKeeper &records, raw_ostream &) {
   for (const Record *op : records.getAllDerivedDefinitions("OpenMP_Op")) {
     for (const Record *clause : op->getValueAsListOfDefs("clauseList"))
       verifyClause(op, clause);
@@ -342,7 +342,7 @@ static bool verifyOpenmpDecls(const RecordKeeper &records, raw_ostream &) {
 /// `OpenMP_Clause` definitions and aggregate them into operation-specific
 /// structures according to the `clauses` argument of each definition deriving
 /// from `OpenMP_Op`.
-static bool genOpenmpClauseOps(const RecordKeeper &records, raw_ostream &os) {
+bool genOpenmpClauseOps(const RecordKeeper &records, raw_ostream &os) {
   mlir::tblgen::NamespaceEmitter ns(os, "mlir::omp");
   for (const Record *clause : records.getAllDerivedDefinitions("OpenMP_Clause"))
     genClauseOpsStruct(clause, os);
@@ -355,3 +355,4 @@ static bool genOpenmpClauseOps(const RecordKeeper &records, raw_ostream &os) {
 
   return false;
 }
+} // namespace mlir::tblgen
diff --git a/mlir/tools/mlir-tblgen/mlir-tblgen.cpp b/mlir/tools/mlir-tblgen/mlir-tblgen.cpp
index a9f02802ca5440..714dfd823ef35b 100644
--- a/mlir/tools/mlir-tblgen/mlir-tblgen.cpp
+++ b/mlir/tools/mlir-tblgen/mlir-tblgen.cpp
@@ -24,6 +24,7 @@
 #include "llvm/TableGen/Record.h"
 
 #include "mlir/TableGen/LLVMIR.h"
+#include "mlir/TableGen/OpenMP.h"
 
 using namespace llvm;
 using namespace mlir;
@@ -226,12 +227,12 @@ static mlir::GenRegistration genLLVMIRIntrinsics("gen-llvmir-intrinsics",
 static mlir::GenRegistration
     verifyOpenmpOps("verify-openmp-ops",
                     "Verify OpenMP operations (produce no output file)",
-                    verifyOpenmpDecls);
+                    tblgen::verifyOpenmpDecls);
 
 static mlir::GenRegistration
     regOpenmpClauseOps("gen-openmp-clause-ops",
                        "Generate OpenMP clause operand structures",
-                       genOpenmpClauseOps);
+                       tblgen::genOpenmpClauseOps);
 
 //===----------------------------------------------------------------------===//
 // OpDefinition registration hooks

>From 2c4e705e9597dfde65d576e3171076ea9236e25c Mon Sep 17 00:00:00 2001
From: Maksim Levental <maksim.levental at gmail.com>
Date: Sat, 26 Oct 2024 18:38:16 -0400
Subject: [PATCH 15/27] expose opdefs

---
 mlir/include/mlir/TableGen/OpenMP.h    |  6 ++++++
 mlir/include/mlir/TableGen/Operator.h  |  2 ++
 mlir/lib/TableGen/OpDefinitionsGen.cpp | 14 ++++++++------
 mlir/tools/mlir-tblgen/mlir-tblgen.cpp |  4 ++--
 4 files changed, 18 insertions(+), 8 deletions(-)

diff --git a/mlir/include/mlir/TableGen/OpenMP.h b/mlir/include/mlir/TableGen/OpenMP.h
index 3701db6a381763..cec29ccad09cf5 100644
--- a/mlir/include/mlir/TableGen/OpenMP.h
+++ b/mlir/include/mlir/TableGen/OpenMP.h
@@ -20,6 +20,12 @@ bool verifyOpenmpDecls(const llvm::RecordKeeper &records, raw_ostream &);
 /// from `OpenMP_Op`.
 bool genOpenmpClauseOps(const llvm::RecordKeeper &records, raw_ostream &os);
 
+/// Emit op declarations for all op records.
+bool emitOpDecls(const llvm::RecordKeeper &records, raw_ostream &os);
+
+/// Emit op definitions for all op records.
+bool emitOpDefs(const llvm::RecordKeeper &records, raw_ostream &os);
+
 } // namespace tblgen
 } // namespace mlir
 
diff --git a/mlir/include/mlir/TableGen/Operator.h b/mlir/include/mlir/TableGen/Operator.h
index 9e570373d9cd32..b353afcea1de9a 100644
--- a/mlir/include/mlir/TableGen/Operator.h
+++ b/mlir/include/mlir/TableGen/Operator.h
@@ -422,6 +422,8 @@ class Operator {
   bool allResultsHaveKnownTypes;
 };
 
+
+
 } // namespace tblgen
 } // namespace mlir
 
diff --git a/mlir/lib/TableGen/OpDefinitionsGen.cpp b/mlir/lib/TableGen/OpDefinitionsGen.cpp
index 83e26d1377206e..3a67e2acfe0992 100644
--- a/mlir/lib/TableGen/OpDefinitionsGen.cpp
+++ b/mlir/lib/TableGen/OpDefinitionsGen.cpp
@@ -4608,8 +4608,9 @@ static void emitOpClassDefs(const RecordKeeper &records,
                 /*emitDecl=*/false);
 }
 
+namespace mlir::tblgen {
 /// Emit op declarations for all op records.
-static bool emitOpDecls(const RecordKeeper &records, raw_ostream &os) {
+bool emitOpDecls(const RecordKeeper &records, raw_ostream &os) {
   emitSourceFileHeader("Op Declarations", os, records);
 
   std::vector<const Record *> defs = getRequestedOpDefinitions(records);
@@ -4639,10 +4640,9 @@ static bool emitOpDecls(const RecordKeeper &records, raw_ostream &os) {
 
 /// Generate the dialect op registration hook and the op class definitions for a
 /// shard of ops.
-static void emitOpDefShard(const RecordKeeper &records,
-                           ArrayRef<const Record *> defs,
-                           const Dialect &dialect, unsigned shardIndex,
-                           unsigned shardCount, raw_ostream &os) {
+void emitOpDefShard(const RecordKeeper &records, ArrayRef<const Record *> defs,
+                    const Dialect &dialect, unsigned shardIndex,
+                    unsigned shardCount, raw_ostream &os) {
   std::string shardGuard = "GET_OP_DEFS_";
   std::string indexStr = std::to_string(shardIndex);
   shardGuard += indexStr;
@@ -4677,7 +4677,7 @@ static void emitOpDefShard(const RecordKeeper &records,
 }
 
 /// Emit op definitions for all op records.
-static bool emitOpDefs(const RecordKeeper &records, raw_ostream &os) {
+bool emitOpDefs(const RecordKeeper &records, raw_ostream &os) {
   emitSourceFileHeader("Op Definitions", os, records);
 
   std::vector<const Record *> defs = getRequestedOpDefinitions(records);
@@ -4708,3 +4708,5 @@ static bool emitOpDefs(const RecordKeeper &records, raw_ostream &os) {
   }
   return false;
 }
+
+} // namespace mlir::tblgen
diff --git a/mlir/tools/mlir-tblgen/mlir-tblgen.cpp b/mlir/tools/mlir-tblgen/mlir-tblgen.cpp
index 714dfd823ef35b..b1a4d3814d7a80 100644
--- a/mlir/tools/mlir-tblgen/mlir-tblgen.cpp
+++ b/mlir/tools/mlir-tblgen/mlir-tblgen.cpp
@@ -241,13 +241,13 @@ static mlir::GenRegistration
 static mlir::GenRegistration
     genOpDecls("gen-op-decls", "Generate op declarations",
                [](const RecordKeeper &records, raw_ostream &os) {
-                 return emitOpDecls(records, os);
+                 return tblgen::emitOpDecls(records, os);
                });
 
 static mlir::GenRegistration genOpDefs("gen-op-defs", "Generate op definitions",
                                        [](const RecordKeeper &records,
                                           raw_ostream &os) {
-                                         return emitOpDefs(records, os);
+                                         return tblgen::emitOpDefs(records, os);
                                        });
 //===----------------------------------------------------------------------===//
 // Op Doc Registration

>From ba2fd9dd3a831e8584d75ed2471443d82a612abb Mon Sep 17 00:00:00 2001
From: Maksim Levental <maksim.levental at gmail.com>
Date: Sat, 26 Oct 2024 18:48:23 -0400
Subject: [PATCH 16/27] expose docs

---
 .../mlir/TableGen/AttrOrTypeFormatGen.h       |  6 ++---
 .../mlir/TableGen/DialectGenUtilities.h       |  6 ++---
 mlir/include/mlir/TableGen/DocGenUtilities.h  | 22 ++++++++++++++++---
 mlir/include/mlir/TableGen/FormatGen.h        |  6 ++---
 mlir/include/mlir/TableGen/OpClass.h          |  6 ++---
 mlir/include/mlir/TableGen/OpFormatGen.h      |  6 ++---
 mlir/include/mlir/TableGen/OpGenHelpers.h     |  6 ++---
 mlir/lib/TableGen/OpDocGen.cpp                | 18 ++++++++-------
 mlir/lib/TableGen/PassDocGen.cpp              |  2 +-
 mlir/tools/mlir-tblgen/mlir-tblgen.cpp        | 13 ++++++-----
 10 files changed, 55 insertions(+), 36 deletions(-)

diff --git a/mlir/include/mlir/TableGen/AttrOrTypeFormatGen.h b/mlir/include/mlir/TableGen/AttrOrTypeFormatGen.h
index d4711532a79bb3..18bcd4bb59e7b5 100644
--- a/mlir/include/mlir/TableGen/AttrOrTypeFormatGen.h
+++ b/mlir/include/mlir/TableGen/AttrOrTypeFormatGen.h
@@ -6,8 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
-#ifndef MLIR_TOOLS_MLIRTBLGEN_ATTRORTYPEFORMATGEN_H_
-#define MLIR_TOOLS_MLIRTBLGEN_ATTRORTYPEFORMATGEN_H_
+#ifndef MLIR_MLIRTBLGEN_ATTRORTYPEFORMATGEN_H_
+#define MLIR_MLIRTBLGEN_ATTRORTYPEFORMATGEN_H_
 
 #include "mlir/TableGen/Class.h"
 
@@ -23,4 +23,4 @@ void generateAttrOrTypeFormat(const AttrOrTypeDef &def, MethodBody &parser,
 } // namespace tblgen
 } // namespace mlir
 
-#endif // MLIR_TOOLS_MLIRTBLGEN_ATTRORTYPEFORMATGEN_H_
+#endif // MLIR_MLIRTBLGEN_ATTRORTYPEFORMATGEN_H_
diff --git a/mlir/include/mlir/TableGen/DialectGenUtilities.h b/mlir/include/mlir/TableGen/DialectGenUtilities.h
index 979a9d67b40470..13be81b6974715 100644
--- a/mlir/include/mlir/TableGen/DialectGenUtilities.h
+++ b/mlir/include/mlir/TableGen/DialectGenUtilities.h
@@ -6,8 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
-#ifndef MLIR_TOOLS_MLIRTBLGEN_DIALECTGENUTILITIES_H_
-#define MLIR_TOOLS_MLIRTBLGEN_DIALECTGENUTILITIES_H_
+#ifndef MLIR_MLIRTBLGEN_DIALECTGENUTILITIES_H_
+#define MLIR_MLIRTBLGEN_DIALECTGENUTILITIES_H_
 
 #include "mlir/Support/LLVM.h"
 
@@ -21,4 +21,4 @@ std::optional<Dialect> findDialectToGenerate(ArrayRef<Dialect> dialects);
 } // namespace tblgen
 } // namespace mlir
 
-#endif // MLIR_TOOLS_MLIRTBLGEN_DIALECTGENUTILITIES_H_
+#endif // MLIR_MLIRTBLGEN_DIALECTGENUTILITIES_H_
diff --git a/mlir/include/mlir/TableGen/DocGenUtilities.h b/mlir/include/mlir/TableGen/DocGenUtilities.h
index dd1dbbe243911f..14dda530adb17e 100644
--- a/mlir/include/mlir/TableGen/DocGenUtilities.h
+++ b/mlir/include/mlir/TableGen/DocGenUtilities.h
@@ -11,17 +11,19 @@
 //
 //===----------------------------------------------------------------------===//
 
-#ifndef MLIR_TOOLS_MLIRTBLGEN_DOCGENUTILITIES_H_
-#define MLIR_TOOLS_MLIRTBLGEN_DOCGENUTILITIES_H_
+#ifndef MLIR_MLIRTBLGEN_DOCGENUTILITIES_H_
+#define MLIR_MLIRTBLGEN_DOCGENUTILITIES_H_
 
 #include "llvm/ADT/StringRef.h"
 
 namespace llvm {
 class raw_ostream;
+class RecordKeeper;
 } // namespace llvm
 
 namespace mlir {
 namespace tblgen {
+class AttrOrTypeDef;
 
 // Emit the summary. To avoid confusion, the summary is styled differently from
 // the description.
@@ -39,7 +41,21 @@ void emitDescription(llvm::StringRef description, llvm::raw_ostream &os);
 void emitDescriptionComment(llvm::StringRef description, llvm::raw_ostream &os,
                             llvm::StringRef prefix = "");
 
+void emitAttrOrTypeDefDoc(const AttrOrTypeDef &def, llvm::raw_ostream &os);
+
+void emitAttrOrTypeDefDoc(const llvm::RecordKeeper &records,
+                          llvm::raw_ostream &os,
+                          llvm::StringRef recordTypeName);
+
+bool emitDialectDoc(const llvm::RecordKeeper &records, llvm::raw_ostream &os);
+
+void emitOpDoc(const llvm::RecordKeeper &records, llvm::raw_ostream &os);
+
+void emitEnumDoc(const llvm::RecordKeeper &records, llvm::raw_ostream &os);
+
+void emitPassDocs(const llvm::RecordKeeper &records, llvm::raw_ostream &os);
+
 } // namespace tblgen
 } // namespace mlir
 
-#endif // MLIR_TOOLS_MLIRTBLGEN_DOCGENUTILITIES_H_
+#endif // MLIR_MLIRTBLGEN_DOCGENUTILITIES_H_
diff --git a/mlir/include/mlir/TableGen/FormatGen.h b/mlir/include/mlir/TableGen/FormatGen.h
index 1dc2cb3eaa88a6..ecd6f9aea0ef22 100644
--- a/mlir/include/mlir/TableGen/FormatGen.h
+++ b/mlir/include/mlir/TableGen/FormatGen.h
@@ -11,8 +11,8 @@
 //
 //===----------------------------------------------------------------------===//
 
-#ifndef MLIR_TOOLS_MLIRTBLGEN_FORMATGEN_H_
-#define MLIR_TOOLS_MLIRTBLGEN_FORMATGEN_H_
+#ifndef MLIR_MLIRTBLGEN_FORMATGEN_H_
+#define MLIR_MLIRTBLGEN_FORMATGEN_H_
 
 #include "mlir/Support/LLVM.h"
 #include "llvm/ADT/StringRef.h"
@@ -601,4 +601,4 @@ extern llvm::cl::opt<bool> formatErrorIsFatal;
 } // namespace tblgen
 } // namespace mlir
 
-#endif // MLIR_TOOLS_MLIRTBLGEN_FORMATGEN_H_
+#endif // MLIR_MLIRTBLGEN_FORMATGEN_H_
diff --git a/mlir/include/mlir/TableGen/OpClass.h b/mlir/include/mlir/TableGen/OpClass.h
index 20b96baf868c77..b5f61c0841d7d9 100644
--- a/mlir/include/mlir/TableGen/OpClass.h
+++ b/mlir/include/mlir/TableGen/OpClass.h
@@ -6,8 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
-#ifndef MLIR_TOOLS_MLIRTBLGEN_OPCLASS_H_
-#define MLIR_TOOLS_MLIRTBLGEN_OPCLASS_H_
+#ifndef MLIR_MLIRTBLGEN_OPCLASS_H_
+#define MLIR_MLIRTBLGEN_OPCLASS_H_
 
 #include "mlir/TableGen/Class.h"
 
@@ -49,4 +49,4 @@ class OpClass : public Class {
 } // namespace tblgen
 } // namespace mlir
 
-#endif // MLIR_TOOLS_MLIRTBLGEN_OPCLASS_H_
+#endif // MLIR_MLIRTBLGEN_OPCLASS_H_
diff --git a/mlir/include/mlir/TableGen/OpFormatGen.h b/mlir/include/mlir/TableGen/OpFormatGen.h
index 5e43f38498664b..be5cea91dec3d8 100644
--- a/mlir/include/mlir/TableGen/OpFormatGen.h
+++ b/mlir/include/mlir/TableGen/OpFormatGen.h
@@ -11,8 +11,8 @@
 //
 //===----------------------------------------------------------------------===//
 
-#ifndef MLIR_TOOLS_MLIRTBLGEN_OPFORMATGEN_H_
-#define MLIR_TOOLS_MLIRTBLGEN_OPFORMATGEN_H_
+#ifndef MLIR_MLIRTBLGEN_OPFORMATGEN_H_
+#define MLIR_MLIRTBLGEN_OPFORMATGEN_H_
 
 namespace mlir {
 namespace tblgen {
@@ -26,4 +26,4 @@ void generateOpFormat(const Operator &constOp, OpClass &opClass,
 } // namespace tblgen
 } // namespace mlir
 
-#endif // MLIR_TOOLS_MLIRTBLGEN_OPFORMATGEN_H_
+#endif // MLIR_MLIRTBLGEN_OPFORMATGEN_H_
diff --git a/mlir/include/mlir/TableGen/OpGenHelpers.h b/mlir/include/mlir/TableGen/OpGenHelpers.h
index 62ae32cacc688c..2a13801ed4794f 100644
--- a/mlir/include/mlir/TableGen/OpGenHelpers.h
+++ b/mlir/include/mlir/TableGen/OpGenHelpers.h
@@ -10,8 +10,8 @@
 //
 //===----------------------------------------------------------------------===//
 
-#ifndef MLIR_TOOLS_MLIRTBLGEN_OPGENHELPERS_H_
-#define MLIR_TOOLS_MLIRTBLGEN_OPGENHELPERS_H_
+#ifndef MLIR_MLIRTBLGEN_OPGENHELPERS_H_
+#define MLIR_MLIRTBLGEN_OPGENHELPERS_H_
 
 #include "mlir/Support/LLVM.h"
 #include "llvm/TableGen/Record.h"
@@ -37,4 +37,4 @@ void shardOpDefinitions(
 } // namespace tblgen
 } // namespace mlir
 
-#endif //  MLIR_TOOLS_MLIRTBLGEN_OPGENHELPERS_H_
+#endif //  MLIR_MLIRTBLGEN_OPGENHELPERS_H_
diff --git a/mlir/lib/TableGen/OpDocGen.cpp b/mlir/lib/TableGen/OpDocGen.cpp
index 7831126c2e1a89..ac5a65d5e76aba 100644
--- a/mlir/lib/TableGen/OpDocGen.cpp
+++ b/mlir/lib/TableGen/OpDocGen.cpp
@@ -286,13 +286,13 @@ static void emitSourceLink(StringRef inputFilename, raw_ostream &os) {
      << inputFromMlirInclude << ")\n\n";
 }
 
-static void emitOpDoc(const RecordKeeper &records, raw_ostream &os) {
+void mlir::tblgen::emitOpDoc(const RecordKeeper &records, raw_ostream &os) {
   auto opDefs = getRequestedOpDefinitions(records);
 
   os << "<!-- Autogenerated by mlir-tblgen; don't manually edit -->\n";
   emitSourceLink(records.getInputFilename(), os);
   for (const Record *opDef : opDefs)
-    emitOpDoc(Operator(opDef), os);
+    ::emitOpDoc(Operator(opDef), os);
 }
 
 //===----------------------------------------------------------------------===//
@@ -342,7 +342,8 @@ static void emitAttrOrTypeDefAssemblyFormat(const AttrOrTypeDef &def,
   os << ">\n```\n";
 }
 
-static void emitAttrOrTypeDefDoc(const AttrOrTypeDef &def, raw_ostream &os) {
+void mlir::tblgen::emitAttrOrTypeDefDoc(const AttrOrTypeDef &def,
+                                        raw_ostream &os) {
   os << formatv("### {0}\n", def.getCppClassName());
 
   // Emit the summary if present.
@@ -375,8 +376,8 @@ static void emitAttrOrTypeDefDoc(const AttrOrTypeDef &def, raw_ostream &os) {
   os << "\n";
 }
 
-static void emitAttrOrTypeDefDoc(const RecordKeeper &records, raw_ostream &os,
-                                 StringRef recordTypeName) {
+void emitAttrOrTypeDefDoc(const RecordKeeper &records, raw_ostream &os,
+                          StringRef recordTypeName) {
   auto defs = records.getAllDerivedDefinitions(recordTypeName);
 
   os << "<!-- Autogenerated by mlir-tblgen; don't manually edit -->\n";
@@ -408,10 +409,10 @@ static void emitEnumDoc(const EnumAttr &def, raw_ostream &os) {
   os << "\n";
 }
 
-static void emitEnumDoc(const RecordKeeper &records, raw_ostream &os) {
+void mlir::tblgen::emitEnumDoc(const RecordKeeper &records, raw_ostream &os) {
   os << "<!-- Autogenerated by mlir-tblgen; don't manually edit -->\n";
   for (const Record *def : records.getAllDerivedDefinitions("EnumAttr"))
-    emitEnumDoc(EnumAttr(def), os);
+    ::emitEnumDoc(EnumAttr(def), os);
 }
 
 //===----------------------------------------------------------------------===//
@@ -518,7 +519,8 @@ static void emitDialectDoc(const Dialect &dialect, StringRef inputFilename,
             os);
 }
 
-static bool emitDialectDoc(const RecordKeeper &records, raw_ostream &os) {
+bool mlir::tblgen::emitDialectDoc(const RecordKeeper &records,
+                                  raw_ostream &os) {
   auto dialectDefs = records.getAllDerivedDefinitionsIfDefined("Dialect");
   SmallVector<Dialect> dialects(dialectDefs.begin(), dialectDefs.end());
   std::optional<Dialect> dialect = findDialectToGenerate(dialects);
diff --git a/mlir/lib/TableGen/PassDocGen.cpp b/mlir/lib/TableGen/PassDocGen.cpp
index 5e25f1dc763d1b..df1f5ad2ea982f 100644
--- a/mlir/lib/TableGen/PassDocGen.cpp
+++ b/mlir/lib/TableGen/PassDocGen.cpp
@@ -57,7 +57,7 @@ static void emitDoc(const Pass &pass, raw_ostream &os) {
   }
 }
 
-static void emitPassDocs(const RecordKeeper &records, raw_ostream &os) {
+void mlir::tblgen::emitPassDocs(const RecordKeeper &records, raw_ostream &os) {
   os << "<!-- Autogenerated by mlir-tblgen; don't manually edit -->\n";
   auto passDefs = records.getAllDerivedDefinitions("PassBase");
 
diff --git a/mlir/tools/mlir-tblgen/mlir-tblgen.cpp b/mlir/tools/mlir-tblgen/mlir-tblgen.cpp
index b1a4d3814d7a80..cc1954399a3f5e 100644
--- a/mlir/tools/mlir-tblgen/mlir-tblgen.cpp
+++ b/mlir/tools/mlir-tblgen/mlir-tblgen.cpp
@@ -14,6 +14,7 @@
 #include "mlir/TableGen/Attribute.h"
 #include "mlir/TableGen/Bytecode.h"
 #include "mlir/TableGen/Directive.h"
+#include "mlir/TableGen/DocGenUtilities.h"
 #include "mlir/TableGen/GenInfo.h"
 #include "mlir/TableGen/Interfaces.h"
 #include "mlir/TableGen/Pass.h"
@@ -257,35 +258,35 @@ static mlir::GenRegistration
     genAttrDocRegister("gen-attrdef-doc",
                        "Generate dialect attribute documentation",
                        [](const RecordKeeper &records, raw_ostream &os) {
-                         emitAttrOrTypeDefDoc(records, os, "AttrDef");
+                         tblgen::emitAttrOrTypeDefDoc(records, os, "AttrDef");
                          return false;
                        });
 
 static mlir::GenRegistration
     genOpDocRegister("gen-op-doc", "Generate dialect documentation",
                      [](const RecordKeeper &records, raw_ostream &os) {
-                       emitOpDoc(records, os);
+                       tblgen::emitOpDoc(records, os);
                        return false;
                      });
 
 static mlir::GenRegistration
     genTypeDocRegister("gen-typedef-doc", "Generate dialect type documentation",
                        [](const RecordKeeper &records, raw_ostream &os) {
-                         emitAttrOrTypeDefDoc(records, os, "TypeDef");
+                         tblgen::emitAttrOrTypeDefDoc(records, os, "TypeDef");
                          return false;
                        });
 
 static mlir::GenRegistration
     genEnumDocRegister("gen-enum-doc", "Generate dialect enum documentation",
                        [](const RecordKeeper &records, raw_ostream &os) {
-                         emitEnumDoc(records, os);
+                         tblgen::emitEnumDoc(records, os);
                          return false;
                        });
 
 static mlir::GenRegistration
     genDialectDocRegister("gen-dialect-doc", "Generate dialect documentation",
                           [](const RecordKeeper &records, raw_ostream &os) {
-                            return emitDialectDoc(records, os);
+                            return tblgen::emitDialectDoc(records, os);
                           });
 
 //===----------------------------------------------------------------------===//
@@ -356,7 +357,7 @@ static mlir::GenRegistration genCAPIImpl("gen-pass-capi-impl",
 static mlir::GenRegistration
     genPassDocRegister("gen-pass-doc", "Generate pass documentation",
                        [](const RecordKeeper &records, raw_ostream &os) {
-                         emitPassDocs(records, os);
+                         tblgen::emitPassDocs(records, os);
                          return false;
                        });
 

>From 6e2569a96763b78172bcc023465232a9f03fc985 Mon Sep 17 00:00:00 2001
From: Maksim Levental <maksim.levental at gmail.com>
Date: Sat, 26 Oct 2024 18:53:10 -0400
Subject: [PATCH 17/27] expose pass capi

---
 mlir/include/mlir/TableGen/CAPI.h      | 21 +++++++++++++++++++++
 mlir/include/mlir/TableGen/Directive.h |  3 +--
 mlir/lib/TableGen/PassCAPIGen.cpp      |  7 +++++--
 mlir/tools/mlir-tblgen/mlir-tblgen.cpp | 13 +++++++------
 4 files changed, 34 insertions(+), 10 deletions(-)
 create mode 100644 mlir/include/mlir/TableGen/CAPI.h

diff --git a/mlir/include/mlir/TableGen/CAPI.h b/mlir/include/mlir/TableGen/CAPI.h
new file mode 100644
index 00000000000000..440bd6042f81df
--- /dev/null
+++ b/mlir/include/mlir/TableGen/CAPI.h
@@ -0,0 +1,21 @@
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+
+#ifndef MLIR_TABLEGEN_CAPI_H_
+#define MLIR_TABLEGEN_CAPI_H_
+
+#include "mlir/Support/LLVM.h"
+#include "llvm/TableGen/Record.h"
+
+namespace mlir {
+namespace tblgen {
+
+bool emitPassCAPIImpl(const llvm::RecordKeeper &records, raw_ostream &os);
+
+bool emitPasssCAPIHeader(const llvm::RecordKeeper &records, raw_ostream &os);
+
+} // namespace tblgen
+} // namespace mlir
+
+#endif // MLIR_TABLEGEN_CAPI_H_
diff --git a/mlir/include/mlir/TableGen/Directive.h b/mlir/include/mlir/TableGen/Directive.h
index 27e537b0ce8529..d51a4c74c0905d 100644
--- a/mlir/include/mlir/TableGen/Directive.h
+++ b/mlir/include/mlir/TableGen/Directive.h
@@ -1,5 +1,4 @@
-//===- Directive.h - Directive class --------------------------------*- C++
-//-*-===//
+//===- Directive.h - Directive class -----------------------------*- C++-*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/mlir/lib/TableGen/PassCAPIGen.cpp b/mlir/lib/TableGen/PassCAPIGen.cpp
index e853e12908564b..ed958a857eeda5 100644
--- a/mlir/lib/TableGen/PassCAPIGen.cpp
+++ b/mlir/lib/TableGen/PassCAPIGen.cpp
@@ -10,6 +10,7 @@
 //
 //===----------------------------------------------------------------------===//
 
+#include "mlir/TableGen/CAPI.h"
 #include "mlir/TableGen/GenInfo.h"
 #include "mlir/TableGen/Pass.h"
 #include "llvm/ADT/StringExtras.h"
@@ -58,7 +59,8 @@ const char *const fileFooter = R"(
 )";
 
 /// Emit TODO
-static bool emitCAPIHeader(const RecordKeeper &records, raw_ostream &os) {
+bool mlir::tblgen::emitPasssCAPIHeader(const RecordKeeper &records,
+                                       raw_ostream &os) {
   os << fileHeader;
   os << "// Registration for the entire group\n";
   os << "MLIR_CAPI_EXPORTED void mlirRegister" << groupName
@@ -93,7 +95,8 @@ void mlirRegister{0}Passes(void) {{
 }
 )";
 
-static bool emitCAPIImpl(const RecordKeeper &records, raw_ostream &os) {
+bool mlir::tblgen::emitPassCAPIImpl(const RecordKeeper &records,
+                                    raw_ostream &os) {
   os << "/* Autogenerated by mlir-tblgen; don't manually edit. */";
   os << formatv(passGroupRegistrationCode, groupName);
 
diff --git a/mlir/tools/mlir-tblgen/mlir-tblgen.cpp b/mlir/tools/mlir-tblgen/mlir-tblgen.cpp
index cc1954399a3f5e..be7d01670e1175 100644
--- a/mlir/tools/mlir-tblgen/mlir-tblgen.cpp
+++ b/mlir/tools/mlir-tblgen/mlir-tblgen.cpp
@@ -24,6 +24,7 @@
 #include "llvm/Support/CommandLine.h"
 #include "llvm/TableGen/Record.h"
 
+#include "mlir/TableGen/CAPI.h"
 #include "mlir/TableGen/LLVMIR.h"
 #include "mlir/TableGen/OpenMP.h"
 
@@ -342,13 +343,13 @@ static GenRegistration
 // Pass CAPI registration hooks
 //===----------------------------------------------------------------------===//
 
-static mlir::GenRegistration genCAPIHeader("gen-pass-capi-header",
-                                           "Generate pass C API header",
-                                           &emitCAPIHeader);
+static mlir::GenRegistration genPassCAPIHeader("gen-pass-capi-header",
+                                               "Generate pass C API header",
+                                               &tblgen::emitPasssCAPIHeader);
 
-static mlir::GenRegistration genCAPIImpl("gen-pass-capi-impl",
-                                         "Generate pass C API implementation",
-                                         &emitCAPIImpl);
+static mlir::GenRegistration
+    genPassCAPIImpl("gen-pass-capi-impl", "Generate pass C API implementation",
+                    &tblgen::emitPassCAPIImpl);
 
 //===----------------------------------------------------------------------===//
 // Pass Doc registration hooks

>From 9ca1fa62425867db406c0182d973b1a1fb085791 Mon Sep 17 00:00:00 2001
From: Maksim Levental <maksim.levental at gmail.com>
Date: Sat, 26 Oct 2024 18:54:24 -0400
Subject: [PATCH 18/27] expose pass decls

---
 mlir/include/mlir/TableGen/Pass.h      | 3 +++
 mlir/lib/TableGen/PassGen.cpp          | 2 +-
 mlir/tools/mlir-tblgen/mlir-tblgen.cpp | 3 ++-
 3 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/mlir/include/mlir/TableGen/Pass.h b/mlir/include/mlir/TableGen/Pass.h
index d2bb6e5304ee3f..5e6d70b2f7037a 100644
--- a/mlir/include/mlir/TableGen/Pass.h
+++ b/mlir/include/mlir/TableGen/Pass.h
@@ -13,6 +13,7 @@
 #include <vector>
 
 namespace llvm {
+class RecordKeeper;
 class Record;
 } // namespace llvm
 
@@ -112,6 +113,8 @@ class Pass {
   std::vector<PassStatistic> statistics;
 };
 
+void emitPassDecls(const llvm::RecordKeeper &records, raw_ostream &os);
+
 } // namespace tblgen
 } // namespace mlir
 
diff --git a/mlir/lib/TableGen/PassGen.cpp b/mlir/lib/TableGen/PassGen.cpp
index 5ab3933150259f..a7a4a106e18391 100644
--- a/mlir/lib/TableGen/PassGen.cpp
+++ b/mlir/lib/TableGen/PassGen.cpp
@@ -446,7 +446,7 @@ static void emitOldPassDecl(const Pass &pass, raw_ostream &os) {
   os << "};\n";
 }
 
-static void emitPassDecls(const RecordKeeper &records, raw_ostream &os) {
+void mlir::tblgen::emitPassDecls(const RecordKeeper &records, raw_ostream &os) {
   std::vector<Pass> passes = getPasses(records);
   os << "/* Autogenerated by mlir-tblgen; don't manually edit */\n";
 
diff --git a/mlir/tools/mlir-tblgen/mlir-tblgen.cpp b/mlir/tools/mlir-tblgen/mlir-tblgen.cpp
index be7d01670e1175..0b9f492c03efc6 100644
--- a/mlir/tools/mlir-tblgen/mlir-tblgen.cpp
+++ b/mlir/tools/mlir-tblgen/mlir-tblgen.cpp
@@ -16,6 +16,7 @@
 #include "mlir/TableGen/Directive.h"
 #include "mlir/TableGen/DocGenUtilities.h"
 #include "mlir/TableGen/GenInfo.h"
+#include "mlir/TableGen/Pass.h"
 #include "mlir/TableGen/Interfaces.h"
 #include "mlir/TableGen/Pass.h"
 #include "mlir/TableGen/Python.h"
@@ -369,7 +370,7 @@ static mlir::GenRegistration
 static mlir::GenRegistration
     genPassDecls("gen-pass-decls", "Generate pass declarations",
                  [](const RecordKeeper &records, raw_ostream &os) {
-                   emitPassDecls(records, os);
+                   tblgen::emitPassDecls(records, os);
                    return false;
                  });
 

>From cc5819f05f301d9eb1fb10f6ee1fc98f30f10c6d Mon Sep 17 00:00:00 2001
From: Maksim Levental <maksim.levental at gmail.com>
Date: Sat, 26 Oct 2024 18:56:07 -0400
Subject: [PATCH 19/27] expose rewriters

---
 mlir/include/mlir/TableGen/Rewriter.h  | 17 +++++++++++++++++
 mlir/lib/TableGen/RewriterGen.cpp      |  3 ++-
 mlir/tools/mlir-tblgen/mlir-tblgen.cpp |  3 ++-
 3 files changed, 21 insertions(+), 2 deletions(-)
 create mode 100644 mlir/include/mlir/TableGen/Rewriter.h

diff --git a/mlir/include/mlir/TableGen/Rewriter.h b/mlir/include/mlir/TableGen/Rewriter.h
new file mode 100644
index 00000000000000..ade93c8e5a8ae2
--- /dev/null
+++ b/mlir/include/mlir/TableGen/Rewriter.h
@@ -0,0 +1,17 @@
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+
+#ifndef MLIR_TABLEGEN_REWRITER_H_
+#define MLIR_TABLEGEN_REWRITER_H_
+
+#include "mlir/Support/LLVM.h"
+#include "llvm/TableGen/Record.h"
+
+namespace mlir {
+namespace tblgen {
+void emitRewriters(const llvm::RecordKeeper &records, raw_ostream &os);
+} // namespace tblgen
+} // namespace mlir
+
+#endif // MLIR_TABLEGEN_REWRITER_H_
diff --git a/mlir/lib/TableGen/RewriterGen.cpp b/mlir/lib/TableGen/RewriterGen.cpp
index a4e47fe59123ab..7f15eb940890cf 100644
--- a/mlir/lib/TableGen/RewriterGen.cpp
+++ b/mlir/lib/TableGen/RewriterGen.cpp
@@ -20,6 +20,7 @@
 #include "mlir/TableGen/Pattern.h"
 #include "mlir/TableGen/Predicate.h"
 #include "mlir/TableGen/Property.h"
+#include "mlir/TableGen/Rewriter.h"
 #include "mlir/TableGen/Type.h"
 #include "llvm/ADT/FunctionExtras.h"
 #include "llvm/ADT/SetVector.h"
@@ -1953,7 +1954,7 @@ StringRef StaticMatcherHelper::getVerifierName(DagLeaf leaf) {
   return staticVerifierEmitter.getTypeConstraintFn(leaf.getAsConstraint());
 }
 
-static void emitRewriters(const RecordKeeper &records, raw_ostream &os) {
+void mlir::tblgen::emitRewriters(const RecordKeeper &records, raw_ostream &os) {
   emitSourceFileHeader("Rewriters", os, records);
 
   auto patterns = records.getAllDerivedDefinitions("Pattern");
diff --git a/mlir/tools/mlir-tblgen/mlir-tblgen.cpp b/mlir/tools/mlir-tblgen/mlir-tblgen.cpp
index 0b9f492c03efc6..57cac52bcaf5d7 100644
--- a/mlir/tools/mlir-tblgen/mlir-tblgen.cpp
+++ b/mlir/tools/mlir-tblgen/mlir-tblgen.cpp
@@ -28,6 +28,7 @@
 #include "mlir/TableGen/CAPI.h"
 #include "mlir/TableGen/LLVMIR.h"
 #include "mlir/TableGen/OpenMP.h"
+#include "mlir/TableGen/Rewriter.h"
 
 using namespace llvm;
 using namespace mlir;
@@ -381,7 +382,7 @@ static mlir::GenRegistration
 static mlir::GenRegistration
     genRewriters("gen-rewriters", "Generate pattern rewriters",
                  [](const RecordKeeper &records, raw_ostream &os) {
-                   emitRewriters(records, os);
+                   tblgen::emitRewriters(records, os);
                    return false;
                  });
 

>From e91c610d14611be4ee2e3972fd3b66fed5bd3e96 Mon Sep 17 00:00:00 2001
From: Maksim Levental <maksim.levental at gmail.com>
Date: Sat, 26 Oct 2024 19:02:55 -0400
Subject: [PATCH 20/27] expose spirv

---
 mlir/include/mlir/TableGen/SPIRV.h     | 38 +++++++++++++++++++++
 mlir/lib/TableGen/SPIRVUtilsGen.cpp    | 23 ++++++-------
 mlir/tools/mlir-tblgen/mlir-tblgen.cpp | 46 +++++++++++++-------------
 3 files changed, 71 insertions(+), 36 deletions(-)
 create mode 100644 mlir/include/mlir/TableGen/SPIRV.h

diff --git a/mlir/include/mlir/TableGen/SPIRV.h b/mlir/include/mlir/TableGen/SPIRV.h
new file mode 100644
index 00000000000000..7650ff751106eb
--- /dev/null
+++ b/mlir/include/mlir/TableGen/SPIRV.h
@@ -0,0 +1,38 @@
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+
+#ifndef MLIR_TABLEGEN_SPIRV_H_
+#define MLIR_TABLEGEN_SPIRV_H_
+
+#include "mlir/Support/LLVM.h"
+#include "llvm/TableGen/Record.h"
+
+namespace mlir {
+namespace tblgen {
+bool emitSPRIVInterfaceDecls(const llvm::RecordKeeper &records,
+                             raw_ostream &os);
+
+bool emitSPRIVInterfaceDefs(const llvm::RecordKeeper &records, raw_ostream &os);
+
+bool emitSPRIVEnumDecls(const llvm::RecordKeeper &records, raw_ostream &os);
+
+bool emitSPIRVEnumDefs(const llvm::RecordKeeper &records, raw_ostream &os);
+
+/// Emits all the autogenerated serialization/deserializations functions for the
+/// SPIRV_Ops.
+bool emitSPIRVSerializationFns(const llvm::RecordKeeper &records,
+                               raw_ostream &os);
+
+bool emitSPIRVAttrUtils(const llvm::RecordKeeper &records, raw_ostream &os);
+
+bool emitSPIRVAvailabilityImpl(const llvm::RecordKeeper &records,
+                               raw_ostream &os);
+
+bool emitSPIRVCapabilityImplication(const llvm::RecordKeeper &records,
+                                    raw_ostream &os);
+
+} // namespace tblgen
+} // namespace mlir
+
+#endif // MLIR_TABLEGEN_SPIRV_H_
diff --git a/mlir/lib/TableGen/SPIRVUtilsGen.cpp b/mlir/lib/TableGen/SPIRVUtilsGen.cpp
index 799220dedceeb7..5bb7d68126bd84 100644
--- a/mlir/lib/TableGen/SPIRVUtilsGen.cpp
+++ b/mlir/lib/TableGen/SPIRVUtilsGen.cpp
@@ -16,6 +16,7 @@
 #include "mlir/TableGen/Format.h"
 #include "mlir/TableGen/GenInfo.h"
 #include "mlir/TableGen/Operator.h"
+#include "mlir/TableGen/SPIRV.h"
 #include "llvm/ADT/STLExtras.h"
 #include "llvm/ADT/Sequence.h"
 #include "llvm/ADT/SmallVector.h"
@@ -195,8 +196,7 @@ static void emitInterfaceDef(const Availability &availability,
      << "}\n";
 }
 
-static bool emitSPRIVInterfaceDefs(const RecordKeeper &records,
-                                   raw_ostream &os) {
+bool emitSPRIVInterfaceDefs(const RecordKeeper &records, raw_ostream &os) {
   llvm::emitSourceFileHeader("Availability Interface Definitions", os, records);
 
   auto defs = records.getAllDerivedDefinitions("Availability");
@@ -284,8 +284,7 @@ static void emitInterfaceDecl(const Availability &availability,
   os << "};\n\n";
 }
 
-static bool emitSPRIVInterfaceDecls(const RecordKeeper &records,
-                                    raw_ostream &os) {
+bool emitSPRIVInterfaceDecls(const RecordKeeper &records, raw_ostream &os) {
   llvm::emitSourceFileHeader("Availability Interface Declarations", os,
                              records);
 
@@ -428,7 +427,7 @@ static void emitEnumDecl(const Record &enumDef, raw_ostream &os) {
     os << "} // namespace " << ns << "\n";
 }
 
-static bool emitSPRIVEnumDecls(const RecordKeeper &records, raw_ostream &os) {
+bool emitSPRIVEnumDecls(const RecordKeeper &records, raw_ostream &os) {
   llvm::emitSourceFileHeader("SPIR-V Enum Availability Declarations", os,
                              records);
 
@@ -460,7 +459,7 @@ static void emitEnumDef(const Record &enumDef, raw_ostream &os) {
   os << "\n";
 }
 
-static bool emitSPIRVEnumDefs(const RecordKeeper &records, raw_ostream &os) {
+bool emitSPIRVEnumDefs(const RecordKeeper &records, raw_ostream &os) {
   llvm::emitSourceFileHeader("SPIR-V Enum Availability Definitions", os,
                              records);
 
@@ -1137,8 +1136,7 @@ static void emitExtendedSetDeserializationDispatch(const RecordKeeper &records,
 
 /// Emits all the autogenerated serialization/deserializations functions for the
 /// SPIRV_Ops.
-static bool emitSPIRVSerializationFns(const RecordKeeper &records,
-                                      raw_ostream &os) {
+bool emitSPIRVSerializationFns(const RecordKeeper &records, raw_ostream &os) {
   llvm::emitSourceFileHeader("SPIR-V Serialization Utilities/Functions", os,
                              records);
 
@@ -1207,7 +1205,7 @@ static void emitEnumGetAttrNameFnDefn(const EnumAttr &enumAttr,
   os << "}\n";
 }
 
-static bool emitSPIRVAttrUtils(const RecordKeeper &records, raw_ostream &os) {
+bool emitSPIRVAttrUtils(const RecordKeeper &records, raw_ostream &os) {
   llvm::emitSourceFileHeader("SPIR-V Attribute Utilities", os, records);
 
   auto defs = records.getAllDerivedDefinitions("EnumAttrInfo");
@@ -1340,8 +1338,7 @@ static void emitSPIRVAvailabilityImpl(const Operator &srcOp, raw_ostream &os) {
   }
 }
 
-static bool emitSPIRVAvailabilityImpl(const RecordKeeper &records,
-                                      raw_ostream &os) {
+bool emitSPIRVAvailabilityImpl(const RecordKeeper &records, raw_ostream &os) {
   llvm::emitSourceFileHeader("SPIR-V Op Availability Implementations", os,
                              records);
 
@@ -1358,8 +1355,8 @@ static bool emitSPIRVAvailabilityImpl(const RecordKeeper &records,
 // SPIR-V Capability Implication AutoGen
 //===----------------------------------------------------------------------===//
 
-static bool emitSPIRVCapabilityImplication(const RecordKeeper &records,
-                                           raw_ostream &os) {
+bool emitSPIRVCapabilityImplication(const RecordKeeper &records,
+                                    raw_ostream &os) {
   llvm::emitSourceFileHeader("SPIR-V Capability Implication", os, records);
 
   EnumAttr enumAttr(
diff --git a/mlir/tools/mlir-tblgen/mlir-tblgen.cpp b/mlir/tools/mlir-tblgen/mlir-tblgen.cpp
index 57cac52bcaf5d7..82742412d94c83 100644
--- a/mlir/tools/mlir-tblgen/mlir-tblgen.cpp
+++ b/mlir/tools/mlir-tblgen/mlir-tblgen.cpp
@@ -29,6 +29,7 @@
 #include "mlir/TableGen/LLVMIR.h"
 #include "mlir/TableGen/OpenMP.h"
 #include "mlir/TableGen/Rewriter.h"
+#include "mlir/TableGen/SPIRV.h"
 
 using namespace llvm;
 using namespace mlir;
@@ -391,19 +392,18 @@ static mlir::GenRegistration
 //===----------------------------------------------------------------------===//
 
 // Registers the operation interface generator to mlir-tblgen.
-static mlir::GenRegistration
-    genSPIRVInterfaceDecls("gen-avail-interface-decls",
-                           "Generate availability interface declarations",
-                           [](const RecordKeeper &records, raw_ostream &os) {
-                             return emitSPRIVInterfaceDecls(records, os);
-                           });
+static mlir::GenRegistration genSPIRVInterfaceDecls(
+    "gen-avail-interface-decls", "Generate availability interface declarations",
+    [](const RecordKeeper &records, raw_ostream &os) {
+      return tblgen::emitSPRIVInterfaceDecls(records, os);
+    });
 
 // Registers the operation interface generator to mlir-tblgen.
 static mlir::GenRegistration
     genSPIRVInterfaceDefs("gen-avail-interface-defs",
                           "Generate op interface definitions",
                           [](const RecordKeeper &records, raw_ostream &os) {
-                            return emitSPRIVInterfaceDefs(records, os);
+                            return tblgen::emitSPRIVInterfaceDefs(records, os);
                           });
 
 // Registers the enum utility generator to mlir-tblgen.
@@ -411,7 +411,7 @@ static mlir::GenRegistration
     genSPIRVEnumDecls("gen-spirv-enum-avail-decls",
                       "Generate SPIR-V enum availability declarations",
                       [](const RecordKeeper &records, raw_ostream &os) {
-                        return emitSPRIVEnumDecls(records, os);
+                        return tblgen::emitSPRIVEnumDecls(records, os);
                       });
 
 // Registers the enum utility generator to mlir-tblgen.
@@ -419,36 +419,35 @@ static mlir::GenRegistration
     genSPIRVEnumDefs("gen-spirv-enum-avail-defs",
                      "Generate SPIR-V enum availability definitions",
                      [](const RecordKeeper &records, raw_ostream &os) {
-                       return emitSPIRVEnumDefs(records, os);
+                       return tblgen::emitSPIRVEnumDefs(records, os);
                      });
 
 static mlir::GenRegistration genSPIRVSerialization(
     "gen-spirv-serialization",
     "Generate SPIR-V (de)serialization utilities and functions",
     [](const RecordKeeper &records, raw_ostream &os) {
-      return emitSPIRVSerializationFns(records, os);
+      return tblgen::emitSPIRVSerializationFns(records, os);
     });
 
 static mlir::GenRegistration
     genSPIRVAttrUtils("gen-spirv-attr-utils",
                       "Generate SPIR-V attribute utility definitions",
                       [](const RecordKeeper &records, raw_ostream &os) {
-                        return emitSPIRVAttrUtils(records, os);
+                        return tblgen::emitSPIRVAttrUtils(records, os);
                       });
 
-static mlir::GenRegistration
-    genSPIRVAvailabilityImpl("gen-spirv-avail-impls",
-                             "Generate SPIR-V operation utility definitions",
-                             [](const RecordKeeper &records, raw_ostream &os) {
-                               return emitSPIRVAvailabilityImpl(records, os);
-                             });
+static mlir::GenRegistration genSPIRVAvailabilityImpl(
+    "gen-spirv-avail-impls", "Generate SPIR-V operation utility definitions",
+    [](const RecordKeeper &records, raw_ostream &os) {
+      return tblgen::emitSPIRVAvailabilityImpl(records, os);
+    });
 
 static mlir::GenRegistration genSPIRVCapabilityImplication(
     "gen-spirv-capability-implication",
     "Generate utility function to return implied "
     "capabilities for a given capability",
     [](const RecordKeeper &records, raw_ostream &os) {
-      return emitSPIRVCapabilityImplication(records, os);
+      return tblgen::emitSPIRVCapabilityImplication(records, os);
     });
 
 //===----------------------------------------------------------------------===//
@@ -456,10 +455,11 @@ static mlir::GenRegistration genSPIRVCapabilityImplication(
 //===----------------------------------------------------------------------===//
 
 // Generator that prints records.
-GenRegistration printRecords("print-records", "Print all records to stdout",
-                             [](const RecordKeeper &records, raw_ostream &os) {
-                               os << records;
-                               return false;
-                             });
+static GenRegistration
+    printRecords("print-records", "Print all records to stdout",
+                 [](const RecordKeeper &records, raw_ostream &os) {
+                   os << records;
+                   return false;
+                 });
 
 int main(int argc, char **argv) { return MlirTblgenMain(argc, argv); }

>From bd811da8cea62111873db60f7b4d008ab8985141 Mon Sep 17 00:00:00 2001
From: Maksim Levental <maksim.levental at gmail.com>
Date: Sat, 26 Oct 2024 19:24:50 -0400
Subject: [PATCH 21/27] missing symbols

---
 mlir/lib/TableGen/DialectGen.cpp | 6 ++++--
 mlir/lib/TableGen/OpDocGen.cpp   | 5 +++--
 2 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/mlir/lib/TableGen/DialectGen.cpp b/mlir/lib/TableGen/DialectGen.cpp
index 5298f86e22e1f1..9855cc5f52bdfe 100644
--- a/mlir/lib/TableGen/DialectGen.cpp
+++ b/mlir/lib/TableGen/DialectGen.cpp
@@ -298,7 +298,8 @@ static void emitDialectDecl(Dialect &dialect, raw_ostream &os) {
        << "::" << dialect.getCppClassName() << ")\n";
 }
 
-bool emitDialectDecls(const RecordKeeper &records, raw_ostream &os) {
+bool mlir::tblgen::emitDialectDecls(const RecordKeeper &records,
+                                    raw_ostream &os) {
   emitSourceFileHeader("Dialect Declarations", os, records);
 
   auto dialectDefs = records.getAllDerivedDefinitions("Dialect");
@@ -390,7 +391,8 @@ static void emitDialectDef(Dialect &dialect, const RecordKeeper &records,
     os << llvm::formatv(dialectDestructorStr, cppClassName);
 }
 
-bool emitDialectDefs(const RecordKeeper &records, raw_ostream &os) {
+bool mlir::tblgen::emitDialectDefs(const RecordKeeper &records,
+                                   raw_ostream &os) {
   emitSourceFileHeader("Dialect Definitions", os, records);
 
   auto dialectDefs = records.getAllDerivedDefinitions("Dialect");
diff --git a/mlir/lib/TableGen/OpDocGen.cpp b/mlir/lib/TableGen/OpDocGen.cpp
index ac5a65d5e76aba..395960cc600b78 100644
--- a/mlir/lib/TableGen/OpDocGen.cpp
+++ b/mlir/lib/TableGen/OpDocGen.cpp
@@ -376,8 +376,9 @@ void mlir::tblgen::emitAttrOrTypeDefDoc(const AttrOrTypeDef &def,
   os << "\n";
 }
 
-void emitAttrOrTypeDefDoc(const RecordKeeper &records, raw_ostream &os,
-                          StringRef recordTypeName) {
+void mlir::tblgen::emitAttrOrTypeDefDoc(const RecordKeeper &records,
+                                        raw_ostream &os,
+                                        StringRef recordTypeName) {
   auto defs = records.getAllDerivedDefinitions(recordTypeName);
 
   os << "<!-- Autogenerated by mlir-tblgen; don't manually edit -->\n";

>From 97e0bc96f567f2f081d1bb30dd1c7165d329b8a1 Mon Sep 17 00:00:00 2001
From: Maksim Levental <maksim.levental at gmail.com>
Date: Sat, 26 Oct 2024 20:45:03 -0400
Subject: [PATCH 22/27] move clopts to tool

---
 mlir/include/mlir/TableGen/AttrOrTypeDef.h    |  21 +-
 .../mlir/TableGen/AttrOrTypeFormatGen.h       |   2 +-
 mlir/include/mlir/TableGen/Bytecode.h         |   3 +-
 mlir/include/mlir/TableGen/CAPI.h             |   6 +-
 mlir/include/mlir/TableGen/Dialect.h          |   8 +-
 .../mlir/TableGen/DialectGenUtilities.h       |   6 +-
 mlir/include/mlir/TableGen/DocGenUtilities.h  |  12 +-
 mlir/include/mlir/TableGen/FormatGen.h        |   3 -
 mlir/include/mlir/TableGen/LLVMIR.h           |   8 +-
 mlir/include/mlir/TableGen/OpFormatGen.h      |   2 +-
 mlir/include/mlir/TableGen/OpGenHelpers.h     |   7 +-
 mlir/include/mlir/TableGen/OpenMP.h           |   8 +-
 mlir/include/mlir/TableGen/Pass.h             |   3 +-
 mlir/include/mlir/TableGen/Python.h           |   4 +-
 mlir/lib/TableGen/AttrOrTypeDefGen.cpp        |  17 +-
 mlir/lib/TableGen/AttrOrTypeFormatGen.cpp     |   3 +-
 mlir/lib/TableGen/BytecodeDialectGen.cpp      |   8 +-
 mlir/lib/TableGen/DialectGen.cpp              |  33 ++--
 mlir/lib/TableGen/FormatGen.cpp               |   9 -
 mlir/lib/TableGen/LLVMIRIntrinsicGen.cpp      |  41 ++--
 mlir/lib/TableGen/OpDefinitionsGen.cpp        |  67 ++++---
 mlir/lib/TableGen/OpDocGen.cpp                |  55 +++---
 mlir/lib/TableGen/OpFormatGen.cpp             |   3 +-
 mlir/lib/TableGen/OpGenHelpers.cpp            |  22 +--
 mlir/lib/TableGen/OpPythonBindingGen.cpp      |  18 +-
 mlir/lib/TableGen/PassCAPIGen.cpp             |  15 +-
 mlir/lib/TableGen/PassGen.cpp                 |  13 +-
 mlir/tools/mlir-tblgen/mlir-tblgen.cpp        | 182 +++++++++++++++---
 28 files changed, 347 insertions(+), 232 deletions(-)

diff --git a/mlir/include/mlir/TableGen/AttrOrTypeDef.h b/mlir/include/mlir/TableGen/AttrOrTypeDef.h
index 38748bd35dc0b2..c50ae816353d6b 100644
--- a/mlir/include/mlir/TableGen/AttrOrTypeDef.h
+++ b/mlir/include/mlir/TableGen/AttrOrTypeDef.h
@@ -292,7 +292,7 @@ class TypeDef : public AttrOrTypeDef {
 class DefGen {
 public:
   /// Create the attribute or type class.
-  DefGen(const AttrOrTypeDef &def);
+  DefGen(const AttrOrTypeDef &def, bool formatErrorIsFatal);
 
   void emitDecl(raw_ostream &os) const;
   void emitDef(raw_ostream &os) const;
@@ -318,7 +318,7 @@ class DefGen {
   /// custom verifier.
   void emitInvariantsVerifier(bool hasImpl, bool hasCustomVerifier);
   /// Emit parsers and printers.
-  void emitParserPrinter();
+  void emitParserPrinter(bool formatErrorIsFatal);
   /// Emit parameter accessors, if required.
   void emitAccessors();
   /// Emit interface methods.
@@ -392,7 +392,8 @@ class DefGenerator {
 
 protected:
   DefGenerator(ArrayRef<const llvm::Record *> defs, raw_ostream &os,
-               StringRef defType, StringRef valueType, bool isAttrGenerator);
+               StringRef defType, StringRef valueType, bool isAttrGenerator,
+               bool formatErrorIsFatal);
 
   /// Emit the list of def type names.
   void emitTypeDefList(ArrayRef<AttrOrTypeDef> defs);
@@ -411,19 +412,25 @@ class DefGenerator {
   /// Flag indicating if this generator is for Attributes. False if the
   /// generator is for types.
   bool isAttrGenerator;
+  /// Whether a failure in parsing the assembly format should be a fatal error.
+  bool formatErrorIsFatal;
 };
 
 /// A specialized generator for AttrDefs.
 struct AttrDefGenerator : public DefGenerator {
-  AttrDefGenerator(const llvm::RecordKeeper &records, raw_ostream &os)
+  AttrDefGenerator(const llvm::RecordKeeper &records, raw_ostream &os,
+                   bool formatErrorIsFatal)
       : DefGenerator(records.getAllDerivedDefinitionsIfDefined("AttrDef"), os,
-                     "Attr", "Attribute", /*isAttrGenerator=*/true) {}
+                     "Attr", "Attribute", /*isAttrGenerator=*/true,
+                     formatErrorIsFatal) {}
 };
 /// A specialized generator for TypeDefs.
 struct TypeDefGenerator : public DefGenerator {
-  TypeDefGenerator(const llvm::RecordKeeper &records, raw_ostream &os)
+  TypeDefGenerator(const llvm::RecordKeeper &records, raw_ostream &os,
+                   bool formatErrorIsFatal)
       : DefGenerator(records.getAllDerivedDefinitionsIfDefined("TypeDef"), os,
-                     "Type", "Type", /*isAttrGenerator=*/false) {}
+                     "Type", "Type", /*isAttrGenerator=*/false,
+                     formatErrorIsFatal) {}
 };
 
 void emitTypeConstraintDecls(const llvm::RecordKeeper &records,
diff --git a/mlir/include/mlir/TableGen/AttrOrTypeFormatGen.h b/mlir/include/mlir/TableGen/AttrOrTypeFormatGen.h
index 18bcd4bb59e7b5..90460f27052d7f 100644
--- a/mlir/include/mlir/TableGen/AttrOrTypeFormatGen.h
+++ b/mlir/include/mlir/TableGen/AttrOrTypeFormatGen.h
@@ -18,7 +18,7 @@ class AttrOrTypeDef;
 /// Generate a parser and printer based on a custom assembly format for an
 /// attribute or type.
 void generateAttrOrTypeFormat(const AttrOrTypeDef &def, MethodBody &parser,
-                              MethodBody &printer);
+                              MethodBody &printer, bool formatErrorIsFatal);
 
 } // namespace tblgen
 } // namespace mlir
diff --git a/mlir/include/mlir/TableGen/Bytecode.h b/mlir/include/mlir/TableGen/Bytecode.h
index 33a0b1466d4366..957573fab0b201 100644
--- a/mlir/include/mlir/TableGen/Bytecode.h
+++ b/mlir/include/mlir/TableGen/Bytecode.h
@@ -12,7 +12,8 @@ class RecordKeeper;
 } // namespace llvm
 
 namespace mlir::tblgen {
-bool emitBCRW(const llvm::RecordKeeper &records, raw_ostream &os);
+bool emitBCRW(const llvm::RecordKeeper &records, raw_ostream &os,
+              const std::string &selectedBcDialect);
 } // namespace mlir::tblgen
 
 #endif // MLIR_TABLEGEN_BYTECODE_H
diff --git a/mlir/include/mlir/TableGen/CAPI.h b/mlir/include/mlir/TableGen/CAPI.h
index 440bd6042f81df..d9cea169f7cddd 100644
--- a/mlir/include/mlir/TableGen/CAPI.h
+++ b/mlir/include/mlir/TableGen/CAPI.h
@@ -11,9 +11,11 @@
 namespace mlir {
 namespace tblgen {
 
-bool emitPassCAPIImpl(const llvm::RecordKeeper &records, raw_ostream &os);
+bool emitPassCAPIImpl(const llvm::RecordKeeper &records, raw_ostream &os,
+                      const std::string &groupName);
 
-bool emitPasssCAPIHeader(const llvm::RecordKeeper &records, raw_ostream &os);
+bool emitPasssCAPIHeader(const llvm::RecordKeeper &records, raw_ostream &os,
+                         const std::string &groupName);
 
 } // namespace tblgen
 } // namespace mlir
diff --git a/mlir/include/mlir/TableGen/Dialect.h b/mlir/include/mlir/TableGen/Dialect.h
index 4f5380d8bab1c7..65199a875d6644 100644
--- a/mlir/include/mlir/TableGen/Dialect.h
+++ b/mlir/include/mlir/TableGen/Dialect.h
@@ -14,6 +14,8 @@
 #define MLIR_TABLEGEN_DIALECT_H_
 
 #include "mlir/Support/LLVM.h"
+
+#include "llvm/Support/CommandLine.h"
 #include "llvm/TableGen/Record.h"
 
 #include <string>
@@ -113,8 +115,10 @@ class Dialect {
   std::vector<StringRef> dependentDialects;
 };
 
-bool emitDialectDecls(const llvm::RecordKeeper &records, raw_ostream &os);
-bool emitDialectDefs(const llvm::RecordKeeper &records, raw_ostream &os);
+bool emitDialectDecls(const llvm::RecordKeeper &records, raw_ostream &os,
+                      const llvm::cl::opt<std::string> &selectedDialect);
+bool emitDialectDefs(const llvm::RecordKeeper &records, raw_ostream &os,
+                     const llvm::cl::opt<std::string> &selectedDialect);
 
 } // namespace tblgen
 } // namespace mlir
diff --git a/mlir/include/mlir/TableGen/DialectGenUtilities.h b/mlir/include/mlir/TableGen/DialectGenUtilities.h
index 13be81b6974715..73cbc829650dee 100644
--- a/mlir/include/mlir/TableGen/DialectGenUtilities.h
+++ b/mlir/include/mlir/TableGen/DialectGenUtilities.h
@@ -11,13 +11,17 @@
 
 #include "mlir/Support/LLVM.h"
 
+#include "llvm/Support/CommandLine.h"
+
 namespace mlir {
 namespace tblgen {
 class Dialect;
 
 /// Find the dialect selected by the user to generate for. Returns std::nullopt
 /// if no dialect was found, or if more than one potential dialect was found.
-std::optional<Dialect> findDialectToGenerate(ArrayRef<Dialect> dialects);
+std::optional<Dialect>
+findDialectToGenerate(ArrayRef<Dialect> dialects,
+                      const llvm::cl::opt<std::string> &selectedDialect);
 } // namespace tblgen
 } // namespace mlir
 
diff --git a/mlir/include/mlir/TableGen/DocGenUtilities.h b/mlir/include/mlir/TableGen/DocGenUtilities.h
index 14dda530adb17e..039e2dfde8abd3 100644
--- a/mlir/include/mlir/TableGen/DocGenUtilities.h
+++ b/mlir/include/mlir/TableGen/DocGenUtilities.h
@@ -15,6 +15,7 @@
 #define MLIR_MLIRTBLGEN_DOCGENUTILITIES_H_
 
 #include "llvm/ADT/StringRef.h"
+#include "llvm/Support/CommandLine.h"
 
 namespace llvm {
 class raw_ostream;
@@ -47,9 +48,16 @@ void emitAttrOrTypeDefDoc(const llvm::RecordKeeper &records,
                           llvm::raw_ostream &os,
                           llvm::StringRef recordTypeName);
 
-bool emitDialectDoc(const llvm::RecordKeeper &records, llvm::raw_ostream &os);
+bool emitDialectDoc(const llvm::RecordKeeper &records, llvm::raw_ostream &os,
+                    const llvm::cl::opt<std::string> &selectedDialect,
+                    const std::string &stripPrefix,
+                    bool allowHugoSpecificFeatures,
+                    const std::string &opIncFilter,
+                    const std::string &opExcFilter);
 
-void emitOpDoc(const llvm::RecordKeeper &records, llvm::raw_ostream &os);
+void emitOpDoc(const llvm::RecordKeeper &records, llvm::raw_ostream &os,
+               const std::string &stripPrefix, bool allowHugoSpecificFeatures,
+               const std::string &opIncFilter, const std::string &opExcFilter);
 
 void emitEnumDoc(const llvm::RecordKeeper &records, llvm::raw_ostream &os);
 
diff --git a/mlir/include/mlir/TableGen/FormatGen.h b/mlir/include/mlir/TableGen/FormatGen.h
index ecd6f9aea0ef22..8e8be30c628ade 100644
--- a/mlir/include/mlir/TableGen/FormatGen.h
+++ b/mlir/include/mlir/TableGen/FormatGen.h
@@ -595,9 +595,6 @@ bool canFormatStringAsKeyword(StringRef value,
 bool isValidLiteral(StringRef value,
                     function_ref<void(Twine)> emitError = nullptr);
 
-/// Whether a failure in parsing the assembly format should be a fatal error.
-extern llvm::cl::opt<bool> formatErrorIsFatal;
-
 } // namespace tblgen
 } // namespace mlir
 
diff --git a/mlir/include/mlir/TableGen/LLVMIR.h b/mlir/include/mlir/TableGen/LLVMIR.h
index eb99495121c5c0..c643ebe87790b8 100644
--- a/mlir/include/mlir/TableGen/LLVMIR.h
+++ b/mlir/include/mlir/TableGen/LLVMIR.h
@@ -7,6 +7,8 @@
 
 #include "mlir/Support/LLVM.h"
 
+#include "llvm/Support/CommandLine.h"
+
 namespace llvm {
 class Record;
 } // namespace llvm
@@ -58,7 +60,11 @@ bool emitConvertibleLLVMIRIntrinsics(const llvm::RecordKeeper &records,
 /// class and generates MLIR ODS definitions for those intrinsics that have
 /// the name matching the filter.
 bool emitLLVMIRIntrinsics(const llvm::RecordKeeper &records,
-                          llvm::raw_ostream &os);
+                          llvm::raw_ostream &os,
+                          const llvm::cl::opt<std::string> &nameFilter,
+                          const std::string &accessGroupRegexp,
+                          const std::string &aliasAnalysisRegexp,
+                          const std::string &opBaseClass);
 
 } // namespace tblgen
 } // namespace mlir
diff --git a/mlir/include/mlir/TableGen/OpFormatGen.h b/mlir/include/mlir/TableGen/OpFormatGen.h
index be5cea91dec3d8..5ecbf9730a24e3 100644
--- a/mlir/include/mlir/TableGen/OpFormatGen.h
+++ b/mlir/include/mlir/TableGen/OpFormatGen.h
@@ -21,7 +21,7 @@ class Operator;
 
 // Generate the assembly format for the given operator.
 void generateOpFormat(const Operator &constOp, OpClass &opClass,
-                      bool hasProperties);
+                      bool hasProperties, bool formatErrorIsFatal);
 
 } // namespace tblgen
 } // namespace mlir
diff --git a/mlir/include/mlir/TableGen/OpGenHelpers.h b/mlir/include/mlir/TableGen/OpGenHelpers.h
index 2a13801ed4794f..ac623fd2ab81cf 100644
--- a/mlir/include/mlir/TableGen/OpGenHelpers.h
+++ b/mlir/include/mlir/TableGen/OpGenHelpers.h
@@ -23,7 +23,9 @@ namespace tblgen {
 /// Returns all the op definitions filtered by the user. The filtering is via
 /// command-line option "op-include-regex" and "op-exclude-regex".
 std::vector<const llvm::Record *>
-getRequestedOpDefinitions(const llvm::RecordKeeper &records);
+getRequestedOpDefinitions(const llvm::RecordKeeper &records,
+                          const std::string &opIncFilter,
+                          const std::string &opExcFilter);
 
 /// Checks whether `str` is a Python keyword or would shadow builtin function.
 /// Regenerate using python -c"print(set(sorted(__import__('keyword').kwlist)))"
@@ -32,7 +34,8 @@ bool isPythonReserved(llvm::StringRef str);
 /// Shard the op defintions into the number of shards set by "op-shard-count".
 void shardOpDefinitions(
     ArrayRef<const llvm::Record *> defs,
-    SmallVectorImpl<ArrayRef<const llvm::Record *>> &shardedDefs);
+    SmallVectorImpl<ArrayRef<const llvm::Record *>> &shardedDefs,
+    unsigned opShardCount);
 
 } // namespace tblgen
 } // namespace mlir
diff --git a/mlir/include/mlir/TableGen/OpenMP.h b/mlir/include/mlir/TableGen/OpenMP.h
index cec29ccad09cf5..95f9434afaa634 100644
--- a/mlir/include/mlir/TableGen/OpenMP.h
+++ b/mlir/include/mlir/TableGen/OpenMP.h
@@ -21,10 +21,14 @@ bool verifyOpenmpDecls(const llvm::RecordKeeper &records, raw_ostream &);
 bool genOpenmpClauseOps(const llvm::RecordKeeper &records, raw_ostream &os);
 
 /// Emit op declarations for all op records.
-bool emitOpDecls(const llvm::RecordKeeper &records, raw_ostream &os);
+bool emitOpDecls(const llvm::RecordKeeper &records, raw_ostream &os,
+                 bool formatErrorIsFatal, const std::string &opIncFilter,
+                 const std::string &opExcFilter, unsigned opShardCount);
 
 /// Emit op definitions for all op records.
-bool emitOpDefs(const llvm::RecordKeeper &records, raw_ostream &os);
+bool emitOpDefs(const llvm::RecordKeeper &records, raw_ostream &os,
+                bool formatErrorIsFatal, const std::string &opIncFilter,
+                const std::string &opExcFilter, unsigned opShardCount);
 
 } // namespace tblgen
 } // namespace mlir
diff --git a/mlir/include/mlir/TableGen/Pass.h b/mlir/include/mlir/TableGen/Pass.h
index 5e6d70b2f7037a..1bf864f1b33df5 100644
--- a/mlir/include/mlir/TableGen/Pass.h
+++ b/mlir/include/mlir/TableGen/Pass.h
@@ -113,7 +113,8 @@ class Pass {
   std::vector<PassStatistic> statistics;
 };
 
-void emitPassDecls(const llvm::RecordKeeper &records, raw_ostream &os);
+void emitPassDecls(const llvm::RecordKeeper &records, raw_ostream &os,
+                   const std::string &groupName);
 
 } // namespace tblgen
 } // namespace mlir
diff --git a/mlir/include/mlir/TableGen/Python.h b/mlir/include/mlir/TableGen/Python.h
index d350fca7e574fc..cf17bc8c3b893b 100644
--- a/mlir/include/mlir/TableGen/Python.h
+++ b/mlir/include/mlir/TableGen/Python.h
@@ -11,7 +11,9 @@
 namespace mlir {
 namespace tblgen {
 bool emitPythonEnums(const llvm::RecordKeeper &records, raw_ostream &os);
-bool emitAllPythonOps(const llvm::RecordKeeper &records, raw_ostream &os);
+bool emitAllPythonOps(const llvm::RecordKeeper &records, raw_ostream &os,
+                      const llvm::cl::opt<std::string> &clDialectName,
+                      const llvm::cl::opt<std::string> &clDialectExtensionName);
 
 } // namespace tblgen
 } // namespace mlir
diff --git a/mlir/lib/TableGen/AttrOrTypeDefGen.cpp b/mlir/lib/TableGen/AttrOrTypeDefGen.cpp
index 238631f77f34c4..85d18b361748ba 100644
--- a/mlir/lib/TableGen/AttrOrTypeDefGen.cpp
+++ b/mlir/lib/TableGen/AttrOrTypeDefGen.cpp
@@ -78,7 +78,7 @@ void DefGen::emitDef(raw_ostream &os) const {
   defCls.writeDefTo(os);
 }
 
-DefGen::DefGen(const AttrOrTypeDef &def)
+DefGen::DefGen(const AttrOrTypeDef &def, bool formatErrorIsFatal)
     : def(def), params(def.getParameters()), defCls(def.getCppClassName()),
       valueType(isa<AttrDef>(def) ? "Attribute" : "Type"),
       defType(isa<AttrDef>(def) ? "Attr" : "Type") {
@@ -115,7 +115,7 @@ DefGen::DefGen(const AttrOrTypeDef &def)
     emitInvariantsVerifier(genVerifyInvariantsImpl, genVerifyDecl);
   // Emit the mnemonic, if there is one, and any associated parser and printer.
   if (def.getMnemonic())
-    emitParserPrinter();
+    emitParserPrinter(formatErrorIsFatal);
   // Emit accessors
   if (def.genAccessors())
     emitAccessors();
@@ -299,7 +299,7 @@ void DefGen::emitInvariantsVerifier(bool hasImpl, bool hasCustomVerifier) {
   verifier->body() << "return ::mlir::success();";
 }
 
-void DefGen::emitParserPrinter() {
+void DefGen::emitParserPrinter(bool formatErrorIsFatal) {
   auto *mnemonic = defCls.addStaticMethod<Method::Constexpr>(
       "::llvm::StringLiteral", "getMnemonic");
   mnemonic->body().indent() << strfmt("return {\"{0}\"};", *def.getMnemonic());
@@ -325,7 +325,8 @@ void DefGen::emitParserPrinter() {
                        MethodParameter("::mlir::AsmPrinter &", "odsPrinter"));
   // Emit the bodies if we are using the declarative format.
   if (hasAssemblyFormat)
-    return generateAttrOrTypeFormat(def, parser->body(), printer->body());
+    return generateAttrOrTypeFormat(def, parser->body(), printer->body(),
+                                    formatErrorIsFatal);
 }
 
 void DefGen::emitAccessors() {
@@ -593,9 +594,9 @@ void DefGen::emitStorageClass() {
 /// This struct is the base generator used when processing tablegen interfaces.
 DefGenerator::DefGenerator(ArrayRef<const Record *> defs, raw_ostream &os,
                            StringRef defType, StringRef valueType,
-                           bool isAttrGenerator)
+                           bool isAttrGenerator, bool formatErrorIsFatal)
     : defRecords(defs), os(os), defType(defType), valueType(valueType),
-      isAttrGenerator(isAttrGenerator) {
+      isAttrGenerator(isAttrGenerator), formatErrorIsFatal(formatErrorIsFatal) {
   // Sort by occurrence in file.
   llvm::sort(defRecords, [](const Record *lhs, const Record *rhs) {
     return lhs->getID() < rhs->getID();
@@ -635,7 +636,7 @@ bool DefGenerator::emitDecls(StringRef selectedDialect) {
 
     // Emit the declarations.
     for (const AttrOrTypeDef &def : defs)
-      DefGen(def).emitDecl(os);
+      DefGen(def, formatErrorIsFatal).emitDecl(os);
   }
   // Emit the TypeID explicit specializations to have a single definition for
   // each of these.
@@ -849,7 +850,7 @@ bool DefGenerator::emitDefs(StringRef selectedDialect) {
   for (const AttrOrTypeDef &def : defs) {
     {
       NamespaceEmitter ns(os, def.getDialect());
-      DefGen gen(def);
+      DefGen gen(def, formatErrorIsFatal);
       gen.emitDef(os);
     }
     // Emit the TypeID explicit specializations to have a single symbol def.
diff --git a/mlir/lib/TableGen/AttrOrTypeFormatGen.cpp b/mlir/lib/TableGen/AttrOrTypeFormatGen.cpp
index 2cdacf05639cca..d9eca0fa276fc1 100644
--- a/mlir/lib/TableGen/AttrOrTypeFormatGen.cpp
+++ b/mlir/lib/TableGen/AttrOrTypeFormatGen.cpp
@@ -1212,7 +1212,8 @@ FailureOr<FormatElement *> DefFormatParser::parseStructDirective(SMLoc loc,
 
 void mlir::tblgen::generateAttrOrTypeFormat(const AttrOrTypeDef &def,
                                             MethodBody &parser,
-                                            MethodBody &printer) {
+                                            MethodBody &printer,
+                                            bool formatErrorIsFatal) {
   llvm::SourceMgr mgr;
   mgr.AddNewSourceBuffer(
       llvm::MemoryBuffer::getMemBuffer(*def.getAssemblyFormat()), SMLoc());
diff --git a/mlir/lib/TableGen/BytecodeDialectGen.cpp b/mlir/lib/TableGen/BytecodeDialectGen.cpp
index 726d9c8975493a..0895710c1a751e 100644
--- a/mlir/lib/TableGen/BytecodeDialectGen.cpp
+++ b/mlir/lib/TableGen/BytecodeDialectGen.cpp
@@ -19,11 +19,6 @@
 
 using namespace llvm;
 
-static cl::OptionCategory dialectGenCat("Options for -gen-bytecode");
-static cl::opt<std::string>
-    selectedBcDialect("bytecode-dialect", cl::desc("The dialect to gen for"),
-                      cl::cat(dialectGenCat), cl::CommaSeparated);
-
 namespace mlir::tblgen {
 
 /// Helper class to generate C++ bytecode parser helpers.
@@ -433,7 +428,8 @@ struct AttrOrType {
   std::vector<const Record *> attr, type;
 };
 
-bool emitBCRW(const RecordKeeper &records, raw_ostream &os) {
+bool emitBCRW(const RecordKeeper &records, raw_ostream &os,
+              const std::string &selectedBcDialect) {
   MapVector<StringRef, AttrOrType> dialectAttrOrType;
   for (const Record *it :
        records.getAllDerivedDefinitions("DialectAttributes")) {
diff --git a/mlir/lib/TableGen/DialectGen.cpp b/mlir/lib/TableGen/DialectGen.cpp
index 9855cc5f52bdfe..4964e80e7d4903 100644
--- a/mlir/lib/TableGen/DialectGen.cpp
+++ b/mlir/lib/TableGen/DialectGen.cpp
@@ -33,11 +33,6 @@ using namespace mlir::tblgen;
 using llvm::Record;
 using llvm::RecordKeeper;
 
-static llvm::cl::OptionCategory dialectGenCat("Options for -gen-dialect-*");
-llvm::cl::opt<std::string>
-    selectedDialect("dialect", llvm::cl::desc("The dialect to gen for"),
-                    llvm::cl::cat(dialectGenCat), llvm::cl::CommaSeparated);
-
 /// Utility iterator used for filtering records for a specific dialect.
 namespace mlir::tblgen {
 using DialectFilterIterator =
@@ -72,8 +67,9 @@ filterForDialect(ArrayRef<Record *> records, Dialect &dialect) {
           DialectFilterIterator(records.end(), records.end(), filterFn)};
 }
 
-std::optional<Dialect>
-tblgen::findDialectToGenerate(ArrayRef<Dialect> dialects) {
+std::optional<Dialect> tblgen::findDialectToGenerate(
+    ArrayRef<Dialect> dialects,
+    const llvm::cl::opt<std::string> &selectedDialect) {
   if (dialects.empty()) {
     llvm::errs() << "no dialect was found\n";
     return std::nullopt;
@@ -89,9 +85,10 @@ tblgen::findDialectToGenerate(ArrayRef<Dialect> dialects) {
     return std::nullopt;
   }
 
-  const auto *dialectIt = llvm::find_if(dialects, [](const Dialect &dialect) {
-    return dialect.getName() == selectedDialect;
-  });
+  const auto *dialectIt =
+      llvm::find_if(dialects, [&selectedDialect](const Dialect &dialect) {
+        return dialect.getName() == selectedDialect;
+      });
   if (dialectIt == dialects.end()) {
     llvm::errs() << "selected dialect with '-dialect' does not exist\n";
     return std::nullopt;
@@ -298,8 +295,9 @@ static void emitDialectDecl(Dialect &dialect, raw_ostream &os) {
        << "::" << dialect.getCppClassName() << ")\n";
 }
 
-bool mlir::tblgen::emitDialectDecls(const RecordKeeper &records,
-                                    raw_ostream &os) {
+bool mlir::tblgen::emitDialectDecls(
+    const RecordKeeper &records, raw_ostream &os,
+    const llvm::cl::opt<std::string> &selectedDialect) {
   emitSourceFileHeader("Dialect Declarations", os, records);
 
   auto dialectDefs = records.getAllDerivedDefinitions("Dialect");
@@ -307,7 +305,8 @@ bool mlir::tblgen::emitDialectDecls(const RecordKeeper &records,
     return false;
 
   SmallVector<Dialect> dialects(dialectDefs.begin(), dialectDefs.end());
-  std::optional<Dialect> dialect = findDialectToGenerate(dialects);
+  std::optional<Dialect> dialect =
+      findDialectToGenerate(dialects, selectedDialect);
   if (!dialect)
     return true;
   emitDialectDecl(*dialect, os);
@@ -391,8 +390,9 @@ static void emitDialectDef(Dialect &dialect, const RecordKeeper &records,
     os << llvm::formatv(dialectDestructorStr, cppClassName);
 }
 
-bool mlir::tblgen::emitDialectDefs(const RecordKeeper &records,
-                                   raw_ostream &os) {
+bool mlir::tblgen::emitDialectDefs(
+    const RecordKeeper &records, raw_ostream &os,
+    const llvm::cl::opt<std::string> &selectedDialect) {
   emitSourceFileHeader("Dialect Definitions", os, records);
 
   auto dialectDefs = records.getAllDerivedDefinitions("Dialect");
@@ -400,7 +400,8 @@ bool mlir::tblgen::emitDialectDefs(const RecordKeeper &records,
     return false;
 
   SmallVector<Dialect> dialects(dialectDefs.begin(), dialectDefs.end());
-  std::optional<Dialect> dialect = findDialectToGenerate(dialects);
+  std::optional<Dialect> dialect =
+      findDialectToGenerate(dialects, selectedDialect);
   if (!dialect)
     return true;
   emitDialectDef(*dialect, records, os);
diff --git a/mlir/lib/TableGen/FormatGen.cpp b/mlir/lib/TableGen/FormatGen.cpp
index 63568922a31b36..7834ea453a1172 100644
--- a/mlir/lib/TableGen/FormatGen.cpp
+++ b/mlir/lib/TableGen/FormatGen.cpp
@@ -532,12 +532,3 @@ bool mlir::tblgen::isValidLiteral(StringRef value,
   // Otherwise, this must be an identifier.
   return canFormatStringAsKeyword(value, emitError);
 }
-
-//===----------------------------------------------------------------------===//
-// Commandline Options
-//===----------------------------------------------------------------------===//
-
-llvm::cl::opt<bool> mlir::tblgen::formatErrorIsFatal(
-    "asmformat-error-is-fatal",
-    llvm::cl::desc("Emit a fatal error if format parsing fails"),
-    llvm::cl::init(true));
diff --git a/mlir/lib/TableGen/LLVMIRIntrinsicGen.cpp b/mlir/lib/TableGen/LLVMIRIntrinsicGen.cpp
index 1c83ff9eba2ea8..11dc46d9458204 100644
--- a/mlir/lib/TableGen/LLVMIRIntrinsicGen.cpp
+++ b/mlir/lib/TableGen/LLVMIRIntrinsicGen.cpp
@@ -30,32 +30,6 @@ using llvm::RecordKeeper;
 using llvm::Regex;
 using namespace mlir;
 
-static llvm::cl::OptionCategory intrinsicGenCat("Intrinsics Generator Options");
-
-static llvm::cl::opt<std::string>
-    nameFilter("llvmir-intrinsics-filter",
-               llvm::cl::desc("Only keep the intrinsics with the specified "
-                              "substring in their record name"),
-               llvm::cl::cat(intrinsicGenCat));
-
-static llvm::cl::opt<std::string>
-    opBaseClass("dialect-opclass-base",
-                llvm::cl::desc("The base class for the ops in the dialect we "
-                               "are planning to emit"),
-                llvm::cl::init("LLVM_IntrOp"), llvm::cl::cat(intrinsicGenCat));
-
-static llvm::cl::opt<std::string> accessGroupRegexp(
-    "llvmir-intrinsics-access-group-regexp",
-    llvm::cl::desc("Mark intrinsics that match the specified "
-                   "regexp as taking an access group metadata"),
-    llvm::cl::cat(intrinsicGenCat));
-
-static llvm::cl::opt<std::string> aliasAnalysisRegexp(
-    "llvmir-intrinsics-alias-analysis-regexp",
-    llvm::cl::desc("Mark intrinsics that match the specified "
-                   "regexp as taking alias.scopes, noalias, and tbaa metadata"),
-    llvm::cl::cat(intrinsicGenCat));
-
 // Used to represent the indices of overloadable operands/results.
 using IndicesTy = llvm::SmallBitVector;
 
@@ -200,7 +174,10 @@ void printBracketedRange(const Range &range, llvm::raw_ostream &os) {
 
 /// Emits ODS (TableGen-based) code for `record` representing an LLVM intrinsic.
 /// Returns true on error, false on success.
-static bool emitIntrinsic(const Record &record, llvm::raw_ostream &os) {
+static bool emitIntrinsic(const Record &record, llvm::raw_ostream &os,
+                          const std::string &accessGroupRegexp,
+                          const std::string &aliasAnalysisRegexp,
+                          const std::string &opBaseClass) {
   tblgen::LLVMIntrinsic intr(record);
 
   Regex accessGroupMatcher(accessGroupRegexp);
@@ -251,8 +228,11 @@ static bool emitIntrinsic(const Record &record, llvm::raw_ostream &os) {
 /// Traverses the list of TableGen definitions derived from the "Intrinsic"
 /// class and generates MLIR ODS definitions for those intrinsics that have
 /// the name matching the filter.
-bool mlir::tblgen::emitLLVMIRIntrinsics(const RecordKeeper &records,
-                                        llvm::raw_ostream &os) {
+bool mlir::tblgen::emitLLVMIRIntrinsics(
+    const RecordKeeper &records, llvm::raw_ostream &os,
+    const llvm::cl::opt<std::string> &nameFilter,
+    const std::string &accessGroupRegexp,
+    const std::string &aliasAnalysisRegexp, const std::string &opBaseClass) {
   llvm::emitSourceFileHeader("Operations for LLVM intrinsics", os, records);
   os << "include \"mlir/Dialect/LLVMIR/LLVMOpBase.td\"\n";
   os << "include \"mlir/Interfaces/SideEffectInterfaces.td\"\n\n";
@@ -261,7 +241,8 @@ bool mlir::tblgen::emitLLVMIRIntrinsics(const RecordKeeper &records,
   for (const Record *r : defs) {
     if (!nameFilter.empty() && !r->getName().contains(nameFilter))
       continue;
-    if (emitIntrinsic(*r, os))
+    if (emitIntrinsic(*r, os, accessGroupRegexp, aliasAnalysisRegexp,
+                      opBaseClass))
       return true;
   }
 
diff --git a/mlir/lib/TableGen/OpDefinitionsGen.cpp b/mlir/lib/TableGen/OpDefinitionsGen.cpp
index 3a67e2acfe0992..d0bfd280d5b843 100644
--- a/mlir/lib/TableGen/OpDefinitionsGen.cpp
+++ b/mlir/lib/TableGen/OpDefinitionsGen.cpp
@@ -588,14 +588,17 @@ class OpEmitter {
 public:
   static void
   emitDecl(const Operator &op, raw_ostream &os,
-           const StaticVerifierFunctionEmitter &staticVerifierEmitter);
+           const StaticVerifierFunctionEmitter &staticVerifierEmitter,
+           bool formatErrorIsFatal);
   static void
   emitDef(const Operator &op, raw_ostream &os,
-          const StaticVerifierFunctionEmitter &staticVerifierEmitter);
+          const StaticVerifierFunctionEmitter &staticVerifierEmitter,
+          bool formatErrorIsFatal);
 
 private:
   OpEmitter(const Operator &op,
-            const StaticVerifierFunctionEmitter &staticVerifierEmitter);
+            const StaticVerifierFunctionEmitter &staticVerifierEmitter,
+            bool formatErrorIsFatal);
 
   void emitDecl(raw_ostream &os);
   void emitDef(raw_ostream &os);
@@ -1069,7 +1072,8 @@ static std::string formatExtraDefinitions(const Operator &op) {
 }
 
 OpEmitter::OpEmitter(const Operator &op,
-                     const StaticVerifierFunctionEmitter &staticVerifierEmitter)
+                     const StaticVerifierFunctionEmitter &staticVerifierEmitter,
+                     bool formatErrorIsFatal)
     : def(op.getDef()), op(op),
       opClass(op.getCppClassName(), formatExtraDeclarations(op),
               formatExtraDefinitions(op)),
@@ -1106,19 +1110,21 @@ OpEmitter::OpEmitter(const Operator &op,
   genFolderDecls();
   genTypeInterfaceMethods();
   genOpInterfaceMethods();
-  generateOpFormat(op, opClass, emitHelper.hasProperties());
+  generateOpFormat(op, opClass, emitHelper.hasProperties(), formatErrorIsFatal);
   genSideEffectInterfaceMethods();
 }
 void OpEmitter::emitDecl(
     const Operator &op, raw_ostream &os,
-    const StaticVerifierFunctionEmitter &staticVerifierEmitter) {
-  OpEmitter(op, staticVerifierEmitter).emitDecl(os);
+    const StaticVerifierFunctionEmitter &staticVerifierEmitter,
+    bool formatErrorIsFatal) {
+  OpEmitter(op, staticVerifierEmitter, formatErrorIsFatal).emitDecl(os);
 }
 
 void OpEmitter::emitDef(
     const Operator &op, raw_ostream &os,
-    const StaticVerifierFunctionEmitter &staticVerifierEmitter) {
-  OpEmitter(op, staticVerifierEmitter).emitDef(os);
+    const StaticVerifierFunctionEmitter &staticVerifierEmitter,
+    bool formatErrorIsFatal) {
+  OpEmitter(op, staticVerifierEmitter, formatErrorIsFatal).emitDef(os);
 }
 
 void OpEmitter::emitDecl(raw_ostream &os) {
@@ -4534,7 +4540,7 @@ static void
 emitOpClasses(const RecordKeeper &records,
               const std::vector<const Record *> &defs, raw_ostream &os,
               const StaticVerifierFunctionEmitter &staticVerifierEmitter,
-              bool emitDecl) {
+              bool emitDecl, bool formatErrorIsFatal) {
   if (defs.empty())
     return;
 
@@ -4546,7 +4552,7 @@ emitOpClasses(const RecordKeeper &records,
         os << formatv(opCommentHeader, op.getQualCppClassName(),
                       "declarations");
         OpOperandAdaptorEmitter::emitDecl(op, staticVerifierEmitter, os);
-        OpEmitter::emitDecl(op, os, staticVerifierEmitter);
+        OpEmitter::emitDecl(op, os, staticVerifierEmitter, formatErrorIsFatal);
       }
       // Emit the TypeID explicit specialization to have a single definition.
       if (!op.getCppNamespace().empty())
@@ -4557,7 +4563,7 @@ emitOpClasses(const RecordKeeper &records,
         NamespaceEmitter emitter(os, op.getCppNamespace());
         os << formatv(opCommentHeader, op.getQualCppClassName(), "definitions");
         OpOperandAdaptorEmitter::emitDef(op, staticVerifierEmitter, os);
-        OpEmitter::emitDef(op, os, staticVerifierEmitter);
+        OpEmitter::emitDef(op, os, staticVerifierEmitter, formatErrorIsFatal);
       }
       // Emit the TypeID explicit specialization to have a single definition.
       if (!op.getCppNamespace().empty())
@@ -4570,7 +4576,7 @@ emitOpClasses(const RecordKeeper &records,
 /// Emit the declarations for the provided op classes.
 static void emitOpClassDecls(const RecordKeeper &records,
                              const std::vector<const Record *> &defs,
-                             raw_ostream &os) {
+                             raw_ostream &os, bool formatErrorIsFatal) {
   // First emit forward declaration for each class, this allows them to refer
   // to each others in traits for example.
   for (auto *def : defs) {
@@ -4586,12 +4592,13 @@ static void emitOpClassDecls(const RecordKeeper &records,
   StaticVerifierFunctionEmitter staticVerifierEmitter(os, records);
   staticVerifierEmitter.collectOpConstraints(defs);
   emitOpClasses(records, defs, os, staticVerifierEmitter,
-                /*emitDecl=*/true);
+                /*emitDecl=*/true, formatErrorIsFatal);
 }
 
 /// Emit the definitions for the provided op classes.
 static void emitOpClassDefs(const RecordKeeper &records,
                             ArrayRef<const Record *> defs, raw_ostream &os,
+                            bool formatErrorIsFatal,
                             StringRef constraintPrefix = "") {
   if (defs.empty())
     return;
@@ -4605,21 +4612,24 @@ static void emitOpClassDefs(const RecordKeeper &records,
 
   // Emit the classes.
   emitOpClasses(records, defs, os, staticVerifierEmitter,
-                /*emitDecl=*/false);
+                /*emitDecl=*/false, formatErrorIsFatal);
 }
 
 namespace mlir::tblgen {
 /// Emit op declarations for all op records.
-bool emitOpDecls(const RecordKeeper &records, raw_ostream &os) {
+bool emitOpDecls(const RecordKeeper &records, raw_ostream &os,
+                 bool formatErrorIsFatal, const std::string &opIncFilter,
+                 const std::string &opExcFilter, unsigned opShardCount) {
   emitSourceFileHeader("Op Declarations", os, records);
 
-  std::vector<const Record *> defs = getRequestedOpDefinitions(records);
-  emitOpClassDecls(records, defs, os);
+  std::vector<const Record *> defs =
+      getRequestedOpDefinitions(records, opIncFilter, opExcFilter);
+  emitOpClassDecls(records, defs, os, formatErrorIsFatal);
 
   // If we are generating sharded op definitions, emit the sharded op
   // registration hooks.
   SmallVector<ArrayRef<const Record *>, 4> shardedDefs;
-  shardOpDefinitions(defs, shardedDefs);
+  shardOpDefinitions(defs, shardedDefs, opShardCount);
   if (defs.empty() || shardedDefs.size() <= 1)
     return false;
 
@@ -4642,7 +4652,8 @@ bool emitOpDecls(const RecordKeeper &records, raw_ostream &os) {
 /// shard of ops.
 void emitOpDefShard(const RecordKeeper &records, ArrayRef<const Record *> defs,
                     const Dialect &dialect, unsigned shardIndex,
-                    unsigned shardCount, raw_ostream &os) {
+                    unsigned shardCount, raw_ostream &os,
+                    bool formatErrorIsFatal) {
   std::string shardGuard = "GET_OP_DEFS_";
   std::string indexStr = std::to_string(shardIndex);
   shardGuard += indexStr;
@@ -4673,16 +4684,19 @@ void emitOpDefShard(const RecordKeeper &records, ArrayRef<const Record *> defs,
   os << "}\n";
 
   // Generate the per-shard op definitions.
-  emitOpClassDefs(records, defs, os, indexStr);
+  emitOpClassDefs(records, defs, os, formatErrorIsFatal, indexStr);
 }
 
 /// Emit op definitions for all op records.
-bool emitOpDefs(const RecordKeeper &records, raw_ostream &os) {
+bool emitOpDefs(const RecordKeeper &records, raw_ostream &os,
+                bool formatErrorIsFatal, const std::string &opIncFilter,
+                const std::string &opExcFilter, unsigned opShardCount) {
   emitSourceFileHeader("Op Definitions", os, records);
 
-  std::vector<const Record *> defs = getRequestedOpDefinitions(records);
+  std::vector<const Record *> defs =
+      getRequestedOpDefinitions(records, opIncFilter, opExcFilter);
   SmallVector<ArrayRef<const Record *>, 4> shardedDefs;
-  shardOpDefinitions(defs, shardedDefs);
+  shardOpDefinitions(defs, shardedDefs, opShardCount);
 
   // If no shard was requested, emit the regular op list and class definitions.
   if (shardedDefs.size() == 1) {
@@ -4695,7 +4709,7 @@ bool emitOpDefs(const RecordKeeper &records, raw_ostream &os) {
     }
     {
       IfDefScope scope("GET_OP_CLASSES", os);
-      emitOpClassDefs(records, defs, os);
+      emitOpClassDefs(records, defs, os, formatErrorIsFatal);
     }
     return false;
   }
@@ -4704,7 +4718,8 @@ bool emitOpDefs(const RecordKeeper &records, raw_ostream &os) {
     return false;
   Dialect dialect = Operator(defs.front()).getDialect();
   for (auto [idx, value] : llvm::enumerate(shardedDefs)) {
-    emitOpDefShard(records, value, dialect, idx, shardedDefs.size(), os);
+    emitOpDefShard(records, value, dialect, idx, shardedDefs.size(), os,
+                   formatErrorIsFatal);
   }
   return false;
 }
diff --git a/mlir/lib/TableGen/OpDocGen.cpp b/mlir/lib/TableGen/OpDocGen.cpp
index 395960cc600b78..d33fc067dce1b6 100644
--- a/mlir/lib/TableGen/OpDocGen.cpp
+++ b/mlir/lib/TableGen/OpDocGen.cpp
@@ -39,20 +39,6 @@ using namespace mlir;
 using namespace mlir::tblgen;
 using mlir::tblgen::Operator;
 
-//===----------------------------------------------------------------------===//
-// Commandline Options
-//===----------------------------------------------------------------------===//
-static cl::OptionCategory
-    docCat("Options for -gen-(attrdef|typedef|enum|op|dialect)-doc");
-cl::opt<std::string>
-    stripPrefix("strip-prefix",
-                cl::desc("Strip prefix of the fully qualified names"),
-                cl::init("::mlir::"), cl::cat(docCat));
-cl::opt<bool> allowHugoSpecificFeatures(
-    "allow-hugo-specific-features",
-    cl::desc("Allows using features specific to Hugo"), cl::init(false),
-    cl::cat(docCat));
-
 void mlir::tblgen::emitSummary(StringRef summary, raw_ostream &os) {
   if (!summary.empty()) {
     StringRef trimmed = summary.trim();
@@ -195,7 +181,9 @@ static StringRef resolveAttrDescription(const Attribute &attr) {
   return description;
 }
 
-static void emitOpDoc(const Operator &op, raw_ostream &os) {
+static void emitOpDoc(const Operator &op, raw_ostream &os,
+                      const std::string &stripPrefix,
+                      bool allowHugoSpecificFeatures) {
   std::string classNameStr = op.getQualCppClassName();
   StringRef className = classNameStr;
   (void)className.consume_front(stripPrefix);
@@ -286,13 +274,17 @@ static void emitSourceLink(StringRef inputFilename, raw_ostream &os) {
      << inputFromMlirInclude << ")\n\n";
 }
 
-void mlir::tblgen::emitOpDoc(const RecordKeeper &records, raw_ostream &os) {
-  auto opDefs = getRequestedOpDefinitions(records);
+void mlir::tblgen::emitOpDoc(const RecordKeeper &records, raw_ostream &os,
+                             const std::string &stripPrefix,
+                             bool allowHugoSpecificFeatures,
+                             const std::string &opIncFilter,
+                             const std::string &opExcFilter) {
+  auto opDefs = getRequestedOpDefinitions(records, opIncFilter, opExcFilter);
 
   os << "<!-- Autogenerated by mlir-tblgen; don't manually edit -->\n";
   emitSourceLink(records.getInputFilename(), os);
   for (const Record *opDef : opDefs)
-    ::emitOpDoc(Operator(opDef), os);
+    ::emitOpDoc(Operator(opDef), os, stripPrefix, allowHugoSpecificFeatures);
 }
 
 //===----------------------------------------------------------------------===//
@@ -448,7 +440,9 @@ static void maybeNest(bool nest, llvm::function_ref<void(raw_ostream &os)> fn,
 static void emitBlock(ArrayRef<Attribute> attributes, StringRef inputFilename,
                       ArrayRef<AttrDef> attrDefs, ArrayRef<OpDocGroup> ops,
                       ArrayRef<Type> types, ArrayRef<TypeDef> typeDefs,
-                      ArrayRef<EnumAttr> enums, raw_ostream &os) {
+                      ArrayRef<EnumAttr> enums, raw_ostream &os,
+                      const std::string &stripPrefix,
+                      bool allowHugoSpecificFeatures) {
   if (!ops.empty()) {
     os << "## Operations\n\n";
     emitSourceLink(inputFilename, os);
@@ -463,7 +457,7 @@ static void emitBlock(ArrayRef<Attribute> attributes, StringRef inputFilename,
               os << "\n\n";
             }
             for (const Operator &op : grouping.ops) {
-              emitOpDoc(op, os);
+              emitOpDoc(op, os, stripPrefix, allowHugoSpecificFeatures);
             }
           },
           os);
@@ -506,7 +500,9 @@ static void emitDialectDoc(const Dialect &dialect, StringRef inputFilename,
                            ArrayRef<Attribute> attributes,
                            ArrayRef<AttrDef> attrDefs, ArrayRef<OpDocGroup> ops,
                            ArrayRef<Type> types, ArrayRef<TypeDef> typeDefs,
-                           ArrayRef<EnumAttr> enums, raw_ostream &os) {
+                           ArrayRef<EnumAttr> enums, raw_ostream &os,
+                           const std::string &stripPrefix,
+                           bool allowHugoSpecificFeatures) {
   os << "# '" << dialect.getName() << "' Dialect\n\n";
   emitIfNotEmpty(dialect.getSummary(), os);
   emitIfNotEmpty(dialect.getDescription(), os);
@@ -517,18 +513,23 @@ static void emitDialectDoc(const Dialect &dialect, StringRef inputFilename,
     os << "[TOC]\n\n";
 
   emitBlock(attributes, inputFilename, attrDefs, ops, types, typeDefs, enums,
-            os);
+            os, stripPrefix, allowHugoSpecificFeatures);
 }
 
-bool mlir::tblgen::emitDialectDoc(const RecordKeeper &records,
-                                  raw_ostream &os) {
+bool mlir::tblgen::emitDialectDoc(
+    const RecordKeeper &records, raw_ostream &os,
+    const llvm::cl::opt<std::string> &selectedDialect,
+    const std::string &stripPrefix, bool allowHugoSpecificFeatures,
+    const std::string &opIncFilter, const std::string &opExcFilter) {
   auto dialectDefs = records.getAllDerivedDefinitionsIfDefined("Dialect");
   SmallVector<Dialect> dialects(dialectDefs.begin(), dialectDefs.end());
-  std::optional<Dialect> dialect = findDialectToGenerate(dialects);
+  std::optional<Dialect> dialect =
+      findDialectToGenerate(dialects, selectedDialect);
   if (!dialect)
     return true;
 
-  std::vector<const Record *> opDefs = getRequestedOpDefinitions(records);
+  std::vector<const Record *> opDefs =
+      getRequestedOpDefinitions(records, opIncFilter, opExcFilter);
   auto attrDefs = records.getAllDerivedDefinitionsIfDefined("DialectAttr");
   auto typeDefs = records.getAllDerivedDefinitionsIfDefined("DialectType");
   auto typeDefDefs = records.getAllDerivedDefinitionsIfDefined("TypeDef");
@@ -603,6 +604,6 @@ bool mlir::tblgen::emitDialectDoc(const RecordKeeper &records,
   os << "<!-- Autogenerated by mlir-tblgen; don't manually edit -->\n";
   emitDialectDoc(*dialect, records.getInputFilename(), dialectAttrs,
                  dialectAttrDefs, dialectOps, dialectTypes, dialectTypeDefs,
-                 dialectEnums, os);
+                 dialectEnums, os, stripPrefix, allowHugoSpecificFeatures);
   return false;
 }
diff --git a/mlir/lib/TableGen/OpFormatGen.cpp b/mlir/lib/TableGen/OpFormatGen.cpp
index 56c0e73034069f..d8445cdc81f901 100644
--- a/mlir/lib/TableGen/OpFormatGen.cpp
+++ b/mlir/lib/TableGen/OpFormatGen.cpp
@@ -3774,7 +3774,8 @@ LogicalResult OpFormatParser::verifyOptionalGroupElement(SMLoc loc,
 //===----------------------------------------------------------------------===//
 
 void mlir::tblgen::generateOpFormat(const Operator &constOp, OpClass &opClass,
-                                    bool hasProperties) {
+                                    bool hasProperties,
+                                    bool formatErrorIsFatal) {
   // TODO: Operator doesn't expose all necessary functionality via
   // the const interface.
   Operator &op = const_cast<Operator &>(constOp);
diff --git a/mlir/lib/TableGen/OpGenHelpers.cpp b/mlir/lib/TableGen/OpGenHelpers.cpp
index 4156427f9fc78c..71f52298c93804 100644
--- a/mlir/lib/TableGen/OpGenHelpers.cpp
+++ b/mlir/lib/TableGen/OpGenHelpers.cpp
@@ -21,21 +21,6 @@ using namespace llvm;
 using namespace mlir;
 using namespace mlir::tblgen;
 
-cl::OptionCategory opDefGenCat("Options for op definition generators");
-
-static cl::opt<std::string> opIncFilter(
-    "op-include-regex",
-    cl::desc("Regex of name of op's to include (no filter if empty)"),
-    cl::cat(opDefGenCat));
-static cl::opt<std::string> opExcFilter(
-    "op-exclude-regex",
-    cl::desc("Regex of name of op's to exclude (no filter if empty)"),
-    cl::cat(opDefGenCat));
-static cl::opt<unsigned> opShardCount(
-    "op-shard-count",
-    cl::desc("The number of shards into which the op classes will be divided"),
-    cl::cat(opDefGenCat), cl::init(1));
-
 static std::string getOperationName(const Record &def) {
   auto prefix = def.getValueAsDef("opDialect")->getValueAsString("name");
   auto opName = def.getValueAsString("opName");
@@ -45,7 +30,9 @@ static std::string getOperationName(const Record &def) {
 }
 
 std::vector<const Record *>
-mlir::tblgen::getRequestedOpDefinitions(const RecordKeeper &records) {
+mlir::tblgen::getRequestedOpDefinitions(const RecordKeeper &records,
+                                        const std::string &opIncFilter,
+                                        const std::string &opExcFilter) {
   const Record *classDef = records.getClass("Op");
   if (!classDef)
     PrintFatalError("ERROR: Couldn't find the 'Op' class!\n");
@@ -87,7 +74,8 @@ bool mlir::tblgen::isPythonReserved(StringRef str) {
 
 void mlir::tblgen::shardOpDefinitions(
     ArrayRef<const Record *> defs,
-    SmallVectorImpl<ArrayRef<const Record *>> &shardedDefs) {
+    SmallVectorImpl<ArrayRef<const Record *>> &shardedDefs,
+    unsigned opShardCount) {
   assert(opShardCount > 0 && "expected a positive shard count");
   if (opShardCount == 1) {
     shardedDefs.push_back(defs);
diff --git a/mlir/lib/TableGen/OpPythonBindingGen.cpp b/mlir/lib/TableGen/OpPythonBindingGen.cpp
index d47e21702e0c34..b57d4f4ddaab45 100644
--- a/mlir/lib/TableGen/OpPythonBindingGen.cpp
+++ b/mlir/lib/TableGen/OpPythonBindingGen.cpp
@@ -275,18 +275,6 @@ def {0}({2}) -> {4}:
   return _get_op_result_or_op_results({1}({3}))
 )Py";
 
-static llvm::cl::OptionCategory
-    clOpPythonBindingCat("Options for -gen-python-op-bindings");
-
-static llvm::cl::opt<std::string>
-    clDialectName("bind-dialect",
-                  llvm::cl::desc("The dialect to run the generator for"),
-                  llvm::cl::init(""), llvm::cl::cat(clOpPythonBindingCat));
-
-static llvm::cl::opt<std::string> clDialectExtensionName(
-    "dialect-extension", llvm::cl::desc("The prefix of the dialect extension"),
-    llvm::cl::init(""), llvm::cl::cat(clOpPythonBindingCat));
-
 using AttributeClasses = DenseMap<StringRef, StringRef>;
 
 /// Checks whether `str` would shadow a generated variable or attribute
@@ -1027,8 +1015,10 @@ static void emitOpBindings(const Operator &op, raw_ostream &os) {
 /// Emits bindings for the dialect specified in the command line, including file
 /// headers and utilities. Returns `false` on success to comply with Tablegen
 /// registration requirements.
-bool mlir::tblgen::emitAllPythonOps(const RecordKeeper &records,
-                                    raw_ostream &os) {
+bool mlir::tblgen::emitAllPythonOps(
+    const RecordKeeper &records, raw_ostream &os,
+    const llvm::cl::opt<std::string> &clDialectName,
+    const llvm::cl::opt<std::string> &clDialectExtensionName) {
   if (clDialectName.empty())
     llvm::PrintFatalError("dialect name not provided");
 
diff --git a/mlir/lib/TableGen/PassCAPIGen.cpp b/mlir/lib/TableGen/PassCAPIGen.cpp
index ed958a857eeda5..078f753576ba30 100644
--- a/mlir/lib/TableGen/PassCAPIGen.cpp
+++ b/mlir/lib/TableGen/PassCAPIGen.cpp
@@ -24,15 +24,6 @@ using namespace mlir::tblgen;
 using llvm::formatv;
 using llvm::RecordKeeper;
 
-static llvm::cl::OptionCategory
-    passGenCat("Options for -gen-pass-capi-header and -gen-pass-capi-impl");
-static llvm::cl::opt<std::string>
-    groupName("prefix",
-              llvm::cl::desc("The prefix to use for this group of passes. The "
-                             "form will be mlirCreate<prefix><passname>, the "
-                             "prefix can avoid conflicts across libraries."),
-              llvm::cl::cat(passGenCat));
-
 const char *const passDecl = R"(
 /* Create {0} Pass. */
 MLIR_CAPI_EXPORTED MlirPass mlirCreate{0}{1}(void);
@@ -60,7 +51,8 @@ const char *const fileFooter = R"(
 
 /// Emit TODO
 bool mlir::tblgen::emitPasssCAPIHeader(const RecordKeeper &records,
-                                       raw_ostream &os) {
+                                       raw_ostream &os,
+                                       const std::string &groupName) {
   os << fileHeader;
   os << "// Registration for the entire group\n";
   os << "MLIR_CAPI_EXPORTED void mlirRegister" << groupName
@@ -96,7 +88,8 @@ void mlirRegister{0}Passes(void) {{
 )";
 
 bool mlir::tblgen::emitPassCAPIImpl(const RecordKeeper &records,
-                                    raw_ostream &os) {
+                                    raw_ostream &os,
+                                    const std::string &groupName) {
   os << "/* Autogenerated by mlir-tblgen; don't manually edit. */";
   os << formatv(passGroupRegistrationCode, groupName);
 
diff --git a/mlir/lib/TableGen/PassGen.cpp b/mlir/lib/TableGen/PassGen.cpp
index a7a4a106e18391..e452eaf5bd2722 100644
--- a/mlir/lib/TableGen/PassGen.cpp
+++ b/mlir/lib/TableGen/PassGen.cpp
@@ -24,11 +24,6 @@ using namespace mlir::tblgen;
 using llvm::formatv;
 using llvm::RecordKeeper;
 
-static llvm::cl::OptionCategory passGenCat("Options for -gen-pass-decls");
-static llvm::cl::opt<std::string>
-    groupName("name", llvm::cl::desc("The name of this group of passes"),
-              llvm::cl::cat(passGenCat));
-
 /// Extract the list of passes from the TableGen records.
 static std::vector<Pass> getPasses(const RecordKeeper &records) {
   std::vector<Pass> passes;
@@ -141,7 +136,8 @@ static void emitPassDecls(const Pass &pass, raw_ostream &os) {
 
 /// Emit the code for registering each of the given passes with the global
 /// PassRegistry.
-static void emitRegistrations(llvm::ArrayRef<Pass> passes, raw_ostream &os) {
+static void emitRegistrations(llvm::ArrayRef<Pass> passes, raw_ostream &os,
+                              const std::string &groupName) {
   os << "#ifdef GEN_PASS_REGISTRATION\n";
 
   for (const Pass &pass : passes) {
@@ -446,7 +442,8 @@ static void emitOldPassDecl(const Pass &pass, raw_ostream &os) {
   os << "};\n";
 }
 
-void mlir::tblgen::emitPassDecls(const RecordKeeper &records, raw_ostream &os) {
+void mlir::tblgen::emitPassDecls(const RecordKeeper &records, raw_ostream &os,
+                                 const std::string &groupName) {
   std::vector<Pass> passes = getPasses(records);
   os << "/* Autogenerated by mlir-tblgen; don't manually edit */\n";
 
@@ -461,7 +458,7 @@ void mlir::tblgen::emitPassDecls(const RecordKeeper &records, raw_ostream &os) {
   for (const Pass &pass : passes)
     emitPass(pass, os);
 
-  emitRegistrations(passes, os);
+  emitRegistrations(passes, os, groupName);
 
   // TODO: Drop old pass declarations.
   // Emit the old code until all the passes have switched to the new design.
diff --git a/mlir/tools/mlir-tblgen/mlir-tblgen.cpp b/mlir/tools/mlir-tblgen/mlir-tblgen.cpp
index 82742412d94c83..373a8d540d516c 100644
--- a/mlir/tools/mlir-tblgen/mlir-tblgen.cpp
+++ b/mlir/tools/mlir-tblgen/mlir-tblgen.cpp
@@ -16,7 +16,6 @@
 #include "mlir/TableGen/Directive.h"
 #include "mlir/TableGen/DocGenUtilities.h"
 #include "mlir/TableGen/GenInfo.h"
-#include "mlir/TableGen/Pass.h"
 #include "mlir/TableGen/Interfaces.h"
 #include "mlir/TableGen/Pass.h"
 #include "mlir/TableGen/Python.h"
@@ -44,16 +43,24 @@ static llvm::cl::opt<std::string>
                 llvm::cl::desc("Generate attributes for this dialect"),
                 llvm::cl::cat(attrdefGenCat), llvm::cl::CommaSeparated);
 
+/// Whether a failure in parsing the assembly format should be a fatal error.
+static llvm::cl::opt<bool> formatErrorIsFatal(
+    "asmformat-error-is-fatal",
+    llvm::cl::desc("Emit a fatal error if format parsing fails"),
+    llvm::cl::init(true));
+
 static mlir::GenRegistration
     genAttrDefs("gen-attrdef-defs", "Generate AttrDef definitions",
                 [](const RecordKeeper &records, raw_ostream &os) {
-                  tblgen::AttrDefGenerator generator(records, os);
+                  tblgen::AttrDefGenerator generator(records, os,
+                                                     formatErrorIsFatal);
                   return generator.emitDefs(attrDialect);
                 });
 static mlir::GenRegistration
     genAttrDecls("gen-attrdef-decls", "Generate AttrDef declarations",
                  [](const RecordKeeper &records, raw_ostream &os) {
-                   tblgen::AttrDefGenerator generator(records, os);
+                   tblgen::AttrDefGenerator generator(records, os,
+                                                      formatErrorIsFatal);
                    return generator.emitDecls(attrDialect);
                  });
 
@@ -70,13 +77,15 @@ static llvm::cl::opt<std::string>
 static mlir::GenRegistration
     genTypeDefs("gen-typedef-defs", "Generate TypeDef definitions",
                 [](const RecordKeeper &records, raw_ostream &os) {
-                  tblgen::TypeDefGenerator generator(records, os);
+                  tblgen::TypeDefGenerator generator(records, os,
+                                                     formatErrorIsFatal);
                   return generator.emitDefs(typeDialect);
                 });
 static mlir::GenRegistration
     genTypeDecls("gen-typedef-decls", "Generate TypeDef declarations",
                  [](const RecordKeeper &records, raw_ostream &os) {
-                   tblgen::TypeDefGenerator generator(records, os);
+                   tblgen::TypeDefGenerator generator(records, os,
+                                                      formatErrorIsFatal);
                    return generator.emitDecls(typeDialect);
                  });
 
@@ -99,26 +108,37 @@ static mlir::GenRegistration
 // Bytecode registration hooks
 //===----------------------------------------------------------------------===//
 
+static llvm::cl::OptionCategory dialectGenCat("Options for -gen-dialect-*");
+static cl::opt<std::string>
+    selectedBcDialect("bytecode-dialect", cl::desc("The dialect to gen for"),
+                      cl::cat(dialectGenCat), cl::CommaSeparated);
+
 static mlir::GenRegistration
     genBCRW("gen-bytecode", "Generate dialect bytecode readers/writers",
             [](const RecordKeeper &records, raw_ostream &os) {
-              return tblgen::emitBCRW(records, os);
+              return tblgen::emitBCRW(records, os, selectedBcDialect);
             });
 
 //===----------------------------------------------------------------------===//
 // GEN: Dialect registration hooks
 //===----------------------------------------------------------------------===//
 
+static llvm::cl::opt<std::string>
+    selectedDialect("dialect", llvm::cl::desc("The dialect to gen for"),
+                    llvm::cl::cat(dialectGenCat), llvm::cl::CommaSeparated);
+
 static mlir::GenRegistration
     genDialectDecls("gen-dialect-decls", "Generate dialect declarations",
                     [](const RecordKeeper &records, raw_ostream &os) {
-                      return tblgen::emitDialectDecls(records, os);
+                      return tblgen::emitDialectDecls(records, os,
+                                                      selectedDialect);
                     });
 
 static mlir::GenRegistration
     genDialectDefs("gen-dialect-defs", "Generate dialect definitions",
                    [](const RecordKeeper &records, raw_ostream &os) {
-                     return tblgen::emitDialectDefs(records, os);
+                     return tblgen::emitDialectDefs(records, os,
+                                                    selectedDialect);
                    });
 
 //===----------------------------------------------------------------------===//
@@ -144,6 +164,21 @@ static mlir::GenRegistration genDirectiveDecls(
 // Python Enum registration hooks
 //===----------------------------------------------------------------------===//
 
+static cl::OptionCategory opDefGenCat("Options for op definition generators");
+
+static cl::opt<std::string> opIncFilter(
+    "op-include-regex",
+    cl::desc("Regex of name of op's to include (no filter if empty)"),
+    cl::cat(opDefGenCat));
+static cl::opt<std::string> opExcFilter(
+    "op-exclude-regex",
+    cl::desc("Regex of name of op's to exclude (no filter if empty)"),
+    cl::cat(opDefGenCat));
+static cl::opt<unsigned> opShardCount(
+    "op-shard-count",
+    cl::desc("The number of shards into which the op classes will be divided"),
+    cl::cat(opDefGenCat), cl::init(1));
+
 // Registers the enum utility generator to mlir-tblgen.
 static mlir::GenRegistration
     genPythonEnumBindings("gen-python-enum-bindings",
@@ -172,9 +207,35 @@ static mlir::GenRegistration
 // LLVMIR registration hooks
 //===----------------------------------------------------------------------===//
 
+static llvm::cl::OptionCategory intrinsicGenCat("Intrinsics Generator Options");
+
+static llvm::cl::opt<std::string>
+    nameFilter("llvmir-intrinsics-filter",
+               llvm::cl::desc("Only keep the intrinsics with the specified "
+                              "substring in their record name"),
+               llvm::cl::cat(intrinsicGenCat));
+
+static llvm::cl::opt<std::string>
+    opBaseClass("dialect-opclass-base",
+                llvm::cl::desc("The base class for the ops in the dialect we "
+                               "are planning to emit"),
+                llvm::cl::init("LLVM_IntrOp"), llvm::cl::cat(intrinsicGenCat));
+
+static llvm::cl::opt<std::string> accessGroupRegexp(
+    "llvmir-intrinsics-access-group-regexp",
+    llvm::cl::desc("Mark intrinsics that match the specified "
+                   "regexp as taking an access group metadata"),
+    llvm::cl::cat(intrinsicGenCat));
+
+static llvm::cl::opt<std::string> aliasAnalysisRegexp(
+    "llvmir-intrinsics-alias-analysis-regexp",
+    llvm::cl::desc("Mark intrinsics that match the specified "
+                   "regexp as taking alias.scopes, noalias, and tbaa metadata"),
+    llvm::cl::cat(intrinsicGenCat));
+
 template <bool ConvertTo>
-bool emitLLVMIREnumConversionDefs(const RecordKeeper &records,
-                                  raw_ostream &os) {
+static bool emitLLVMIREnumConversionDefs(const RecordKeeper &records,
+                                         raw_ostream &os) {
   for (const Record *def : records.getAllDerivedDefinitions("LLVM_EnumAttr"))
     if (ConvertTo)
       tblgen::emitOneEnumToConversion(def, os);
@@ -220,9 +281,13 @@ static mlir::GenRegistration genConvertibleLLVMIRIntrinsics(
     "Generate list of convertible LLVM IR intrinsics",
     tblgen::emitConvertibleLLVMIRIntrinsics);
 
-static mlir::GenRegistration genLLVMIRIntrinsics("gen-llvmir-intrinsics",
-                                                 "Generate LLVM IR intrinsics",
-                                                 tblgen::emitLLVMIRIntrinsics);
+static mlir::GenRegistration
+    genLLVMIRIntrinsics("gen-llvmir-intrinsics", "Generate LLVM IR intrinsics",
+                        [](const RecordKeeper &records, raw_ostream &os) {
+                          return tblgen::emitLLVMIRIntrinsics(
+                              records, os, nameFilter, accessGroupRegexp,
+                              aliasAnalysisRegexp, opBaseClass);
+                        });
 
 //===----------------------------------------------------------------------===//
 // OpenMP registration hooks
@@ -246,18 +311,33 @@ static mlir::GenRegistration
 static mlir::GenRegistration
     genOpDecls("gen-op-decls", "Generate op declarations",
                [](const RecordKeeper &records, raw_ostream &os) {
-                 return tblgen::emitOpDecls(records, os);
+                 return tblgen::emitOpDecls(records, os, formatErrorIsFatal,
+                                            opIncFilter, opExcFilter,
+                                            opShardCount);
                });
 
-static mlir::GenRegistration genOpDefs("gen-op-defs", "Generate op definitions",
-                                       [](const RecordKeeper &records,
-                                          raw_ostream &os) {
-                                         return tblgen::emitOpDefs(records, os);
-                                       });
+static mlir::GenRegistration
+    genOpDefs("gen-op-defs", "Generate op definitions",
+              [](const RecordKeeper &records, raw_ostream &os) {
+                return tblgen::emitOpDefs(records, os, formatErrorIsFatal,
+                                          opIncFilter, opExcFilter,
+                                          opShardCount);
+              });
 //===----------------------------------------------------------------------===//
 // Op Doc Registration
 //===----------------------------------------------------------------------===//
 
+static cl::OptionCategory
+    docCat("Options for -gen-(attrdef|typedef|enum|op|dialect)-doc");
+static cl::opt<std::string>
+    stripPrefix("strip-prefix",
+                cl::desc("Strip prefix of the fully qualified names"),
+                cl::init("::mlir::"), cl::cat(docCat));
+static cl::opt<bool> allowHugoSpecificFeatures(
+    "allow-hugo-specific-features",
+    cl::desc("Allows using features specific to Hugo"), cl::init(false),
+    cl::cat(docCat));
+
 static mlir::GenRegistration
     genAttrDocRegister("gen-attrdef-doc",
                        "Generate dialect attribute documentation",
@@ -269,7 +349,9 @@ static mlir::GenRegistration
 static mlir::GenRegistration
     genOpDocRegister("gen-op-doc", "Generate dialect documentation",
                      [](const RecordKeeper &records, raw_ostream &os) {
-                       tblgen::emitOpDoc(records, os);
+                       tblgen::emitOpDoc(records, os, stripPrefix,
+                                         allowHugoSpecificFeatures, opIncFilter,
+                                         opExcFilter);
                        return false;
                      });
 
@@ -287,11 +369,13 @@ static mlir::GenRegistration
                          return false;
                        });
 
-static mlir::GenRegistration
-    genDialectDocRegister("gen-dialect-doc", "Generate dialect documentation",
-                          [](const RecordKeeper &records, raw_ostream &os) {
-                            return tblgen::emitDialectDoc(records, os);
-                          });
+static mlir::GenRegistration genDialectDocRegister(
+    "gen-dialect-doc", "Generate dialect documentation",
+    [](const RecordKeeper &records, raw_ostream &os) {
+      return tblgen::emitDialectDoc(records, os, selectedDialect, stripPrefix,
+                                    allowHugoSpecificFeatures, opIncFilter,
+                                    opExcFilter);
+    });
 
 //===----------------------------------------------------------------------===//
 // Interface registration hooks
@@ -337,22 +421,52 @@ static InterfaceGenRegistration<tblgen::TypeInterfaceGenerator>
 // Python bindings registration hooks
 //===----------------------------------------------------------------------===//
 
+static llvm::cl::OptionCategory
+    clOpPythonBindingCat("Options for -gen-python-op-bindings");
+
+static llvm::cl::opt<std::string>
+    clDialectName("bind-dialect",
+                  llvm::cl::desc("The dialect to run the generator for"),
+                  llvm::cl::init(""), llvm::cl::cat(clOpPythonBindingCat));
+
+static llvm::cl::opt<std::string> clDialectExtensionName(
+    "dialect-extension", llvm::cl::desc("The prefix of the dialect extension"),
+    llvm::cl::init(""), llvm::cl::cat(clOpPythonBindingCat));
+
 static GenRegistration
     genPythonBindings("gen-python-op-bindings",
                       "Generate Python bindings for MLIR Ops",
-                      &tblgen::emitAllPythonOps);
+                      [](const RecordKeeper &records, raw_ostream &os) {
+                        return tblgen::emitAllPythonOps(
+                            records, os, clDialectName, clDialectExtensionName);
+                      });
 
 //===----------------------------------------------------------------------===//
 // Pass CAPI registration hooks
 //===----------------------------------------------------------------------===//
 
-static mlir::GenRegistration genPassCAPIHeader("gen-pass-capi-header",
-                                               "Generate pass C API header",
-                                               &tblgen::emitPasssCAPIHeader);
+static llvm::cl::OptionCategory
+    passGenCat("Options for -gen-pass-capi-header and -gen-pass-capi-impl");
+static llvm::cl::opt<std::string>
+    groupName("prefix",
+              llvm::cl::desc("The prefix to use for this group of passes. The "
+                             "form will be mlirCreate<prefix><passname>, the "
+                             "prefix can avoid conflicts across libraries."),
+              llvm::cl::cat(passGenCat));
+
+static mlir::GenRegistration
+    genPassCAPIHeader("gen-pass-capi-header", "Generate pass C API header",
+
+                      [](const RecordKeeper &records, raw_ostream &os) {
+                        return tblgen::emitPasssCAPIHeader(records, os,
+                                                           groupName);
+                      });
 
 static mlir::GenRegistration
     genPassCAPIImpl("gen-pass-capi-impl", "Generate pass C API implementation",
-                    &tblgen::emitPassCAPIImpl);
+                    [](const RecordKeeper &records, raw_ostream &os) {
+                      return tblgen::emitPassCAPIImpl(records, os, groupName);
+                    });
 
 //===----------------------------------------------------------------------===//
 // Pass Doc registration hooks
@@ -369,10 +483,16 @@ static mlir::GenRegistration
 // Pass registration hooks
 //===----------------------------------------------------------------------===//
 
+static llvm::cl::OptionCategory passDeclsGenCat("Options for -gen-pass-decls");
+static llvm::cl::opt<std::string>
+    groupNamePassDecls("name",
+                       llvm::cl::desc("The name of this group of passes"),
+                       llvm::cl::cat(passDeclsGenCat));
+
 static mlir::GenRegistration
     genPassDecls("gen-pass-decls", "Generate pass declarations",
                  [](const RecordKeeper &records, raw_ostream &os) {
-                   tblgen::emitPassDecls(records, os);
+                   tblgen::emitPassDecls(records, os, groupNamePassDecls);
                    return false;
                  });
 

>From adfc46595b56f4d8e6cca16f9217cc62c5af9cfe Mon Sep 17 00:00:00 2001
From: Maksim Levental <maksim.levental at gmail.com>
Date: Sat, 26 Oct 2024 22:58:53 -0400
Subject: [PATCH 23/27] format

---
 mlir/include/mlir/TableGen/Operator.h | 2 --
 1 file changed, 2 deletions(-)

diff --git a/mlir/include/mlir/TableGen/Operator.h b/mlir/include/mlir/TableGen/Operator.h
index b353afcea1de9a..9e570373d9cd32 100644
--- a/mlir/include/mlir/TableGen/Operator.h
+++ b/mlir/include/mlir/TableGen/Operator.h
@@ -422,8 +422,6 @@ class Operator {
   bool allResultsHaveKnownTypes;
 };
 
-
-
 } // namespace tblgen
 } // namespace mlir
 

>From 29d0db18ac82b583d8414ff46c69ec782010a3cb Mon Sep 17 00:00:00 2001
From: Maksim Levental <maksim.levental at gmail.com>
Date: Sat, 26 Oct 2024 23:12:26 -0400
Subject: [PATCH 24/27] add vt_gen dep

---
 mlir/lib/TableGen/CMakeLists.txt | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/mlir/lib/TableGen/CMakeLists.txt b/mlir/lib/TableGen/CMakeLists.txt
index 449da8dca46973..182cae5b85b32c 100644
--- a/mlir/lib/TableGen/CMakeLists.txt
+++ b/mlir/lib/TableGen/CMakeLists.txt
@@ -62,6 +62,9 @@ llvm_add_library(MLIRTableGen STATIC
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/TableGen
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Support
+
+  DEPENDS
+  vt_gen
 )
 set_target_properties(MLIRTableGen PROPERTIES FOLDER "MLIR/Tablegenning")
 

>From 5b3923802325f648a4e7e15657e7455c81b56e4b Mon Sep 17 00:00:00 2001
From: Maksim Levental <maksim.levental at gmail.com>
Date: Sat, 26 Oct 2024 23:20:34 -0400
Subject: [PATCH 25/27] add string for windows

---
 mlir/include/mlir/TableGen/Pass.h | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/mlir/include/mlir/TableGen/Pass.h b/mlir/include/mlir/TableGen/Pass.h
index 1bf864f1b33df5..0c19f86d8c6ca5 100644
--- a/mlir/include/mlir/TableGen/Pass.h
+++ b/mlir/include/mlir/TableGen/Pass.h
@@ -10,6 +10,8 @@
 #define MLIR_TABLEGEN_PASS_H_
 
 #include "mlir/Support/LLVM.h"
+
+#include <string>
 #include <vector>
 
 namespace llvm {

>From 4a1ed1396497f54780bc9c1ae150ab67c3034cb5 Mon Sep 17 00:00:00 2001
From: Maksim Levental <maksim.levental at gmail.com>
Date: Sun, 27 Oct 2024 00:44:52 -0400
Subject: [PATCH 26/27] fix weird properties issue

---
 mlir/tools/tblgen-to-irdl/OpDefinitionsGen.cpp | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/mlir/tools/tblgen-to-irdl/OpDefinitionsGen.cpp b/mlir/tools/tblgen-to-irdl/OpDefinitionsGen.cpp
index a763105fa0fd6a..b73c7de51d947b 100644
--- a/mlir/tools/tblgen-to-irdl/OpDefinitionsGen.cpp
+++ b/mlir/tools/tblgen-to-irdl/OpDefinitionsGen.cpp
@@ -11,6 +11,9 @@
 //
 //===----------------------------------------------------------------------===//
 
+// clang-format off
+#include "mlir/TableGen/AttrOrTypeDef.h"
+// clang-format on
 #include "mlir/Dialect/IRDL/IR/IRDL.h"
 #include "mlir/IR/Attributes.h"
 #include "mlir/IR/Builders.h"
@@ -18,7 +21,6 @@
 #include "mlir/IR/Diagnostics.h"
 #include "mlir/IR/Dialect.h"
 #include "mlir/IR/MLIRContext.h"
-#include "mlir/TableGen/AttrOrTypeDef.h"
 #include "mlir/TableGen/GenInfo.h"
 #include "mlir/TableGen/GenNameParser.h"
 #include "mlir/TableGen/Interfaces.h"

>From 92821def2a2ddaf0d56d99313e00755478e35b90 Mon Sep 17 00:00:00 2001
From: Maksim Levental <maksim.levental at gmail.com>
Date: Sun, 27 Oct 2024 00:59:46 -0400
Subject: [PATCH 27/27] duplicate class

---
 mlir/include/mlir/TableGen/AttrOrTypeDef.h | 1 -
 1 file changed, 1 deletion(-)

diff --git a/mlir/include/mlir/TableGen/AttrOrTypeDef.h b/mlir/include/mlir/TableGen/AttrOrTypeDef.h
index c50ae816353d6b..c887a3886a297e 100644
--- a/mlir/include/mlir/TableGen/AttrOrTypeDef.h
+++ b/mlir/include/mlir/TableGen/AttrOrTypeDef.h
@@ -29,7 +29,6 @@ class SMLoc;
 namespace mlir {
 namespace tblgen {
 class MethodParameter;
-class MethodParameter;
 class InterfaceMethod;
 class Dialect;
 



More information about the Mlir-commits mailing list