Author: Sirui Mu
Date: 2026-01-10T00:18:09+08:00
New Revision: 8aebfcd953727aa63aed3838584d6ce5c44c423e

URL: 
https://github.com/llvm/llvm-project/commit/8aebfcd953727aa63aed3838584d6ce5c44c423e
DIFF: 
https://github.com/llvm/llvm-project/commit/8aebfcd953727aa63aed3838584d6ce5c44c423e.diff

LOG: [CIR][NFC] Generate ABI lowering patterns with TableGen (#175021)

This patch teaches clang-tblgen to start emitting ABI lowering pattern
declarations.

Added: 
    

Modified: 
    clang/include/clang/CIR/Dialect/IR/CIROps.td
    clang/lib/CIR/Dialect/Transforms/CXXABILowering.cpp
    clang/utils/TableGen/CIRLoweringEmitter.cpp

Removed: 
    


################################################################################
diff  --git a/clang/include/clang/CIR/Dialect/IR/CIROps.td 
b/clang/include/clang/CIR/Dialect/IR/CIROps.td
index 50798be64551a..e2b582c5c55df 100644
--- a/clang/include/clang/CIR/Dialect/IR/CIROps.td
+++ b/clang/include/clang/CIR/Dialect/IR/CIROps.td
@@ -79,6 +79,8 @@ class LLVMLoweringInfo {
 
 class CIR_Op<string mnemonic, list<Trait> traits = []> :
     Op<CIR_Dialect, mnemonic, traits>, LLVMLoweringInfo {
+  // Should we generate an ABI lowering pattern for this op?
+  bit hasCXXABILowering = false;
   // Should we generate an LLVM lowering pattern for this op?
   bit hasLLVMLowering = true;
   // Is the LLVM lowering pattern for this operation recursive?
@@ -451,6 +453,7 @@ def CIR_ConstantOp : CIR_Op<"const", [
 
   let hasFolder = 1;
 
+  let hasCXXABILowering = true;
   let isLLVMLoweringRecursive = true;
 }
 
@@ -571,6 +574,8 @@ def CIR_AllocaOp : CIR_Op<"alloca", [
     `]`
     ($annotations^)? attr-dict
   }];
+
+  let hasCXXABILowering = true;
 }
 
 
//===----------------------------------------------------------------------===//
@@ -2251,6 +2256,8 @@ def CIR_GlobalOp : CIR_Op<"global", [
 
   let hasVerifier = 1;
 
+  let hasCXXABILowering = true;
+
   let isLLVMLoweringRecursive = true;
   let extraLLVMLoweringPatternDecl = [{
     mlir::LogicalResult matchAndRewriteRegionInitializedGlobal(
@@ -3009,6 +3016,8 @@ def CIR_FuncOp : CIR_Op<"func", [
   let hasCustomAssemblyFormat = 1;
   let hasVerifier = 1;
 
+  let hasCXXABILowering = true;
+
   let extraLLVMLoweringPatternDecl = [{
     static mlir::StringRef getLinkageAttrNameString() { return "linkage"; }
 
@@ -3785,6 +3794,7 @@ def CIR_GetRuntimeMemberOp : CIR_Op<"get_runtime_member"> 
{
 
   let hasVerifier = 1;
 
+  let hasCXXABILowering = true;
   let hasLLVMLowering = false;
 }
 

diff  --git a/clang/lib/CIR/Dialect/Transforms/CXXABILowering.cpp 
b/clang/lib/CIR/Dialect/Transforms/CXXABILowering.cpp
index 49087ca38d948..d586a3bf8974d 100644
--- a/clang/lib/CIR/Dialect/Transforms/CXXABILowering.cpp
+++ b/clang/lib/CIR/Dialect/Transforms/CXXABILowering.cpp
@@ -31,38 +31,9 @@ namespace mlir {
 
 namespace {
 
-template <typename Op>
-class CIROpCXXABILoweringPattern : public mlir::OpConversionPattern<Op> {
-protected:
-  mlir::DataLayout *dataLayout;
-  cir::LowerModule *lowerModule;
-
-public:
-  CIROpCXXABILoweringPattern(mlir::MLIRContext *context,
-                             const mlir::TypeConverter &typeConverter,
-                             mlir::DataLayout &dataLayout,
-                             cir::LowerModule &lowerModule)
-      : mlir::OpConversionPattern<Op>(typeConverter, context),
-        dataLayout(&dataLayout), lowerModule(&lowerModule) {}
-};
-
-// TODO(cir): Use TableGen to generate these patterns.
-#define CIR_CXXABI_LOWERING_PATTERN(name, operation)                           
\
-  struct name : CIROpCXXABILoweringPattern<operation> {                        
\
-    using CIROpCXXABILoweringPattern<operation>::CIROpCXXABILoweringPattern;   
\
-                                                                               
\
-    mlir::LogicalResult                                                        
\
-    matchAndRewrite(operation op, OpAdaptor adaptor,                           
\
-                    mlir::ConversionPatternRewriter &rewriter) const override; 
\
-  }
-
-CIR_CXXABI_LOWERING_PATTERN(CIRAllocaOpABILowering, cir::AllocaOp);
-CIR_CXXABI_LOWERING_PATTERN(CIRConstantOpABILowering, cir::ConstantOp);
-CIR_CXXABI_LOWERING_PATTERN(CIRFuncOpABILowering, cir::FuncOp);
-CIR_CXXABI_LOWERING_PATTERN(CIRGetRuntimeMemberOpABILowering,
-                            cir::GetRuntimeMemberOp);
-CIR_CXXABI_LOWERING_PATTERN(CIRGlobalOpABILowering, cir::GlobalOp);
-#undef CIR_CXXABI_LOWERING_PATTERN
+#define GET_ABI_LOWERING_PATTERNS
+#include "clang/CIR/Dialect/IR/CIRLowering.inc"
+#undef GET_ABI_LOWERING_PATTERNS
 
 struct CXXABILoweringPass
     : public impl::CXXABILoweringBase<CXXABILoweringPass> {
@@ -346,13 +317,9 @@ void CXXABILoweringPass::runOnOperation() {
   patterns.add<CIRGenericCXXABILoweringPattern>(patterns.getContext(),
                                                 typeConverter);
   patterns.add<
-      // clang-format off
-      CIRAllocaOpABILowering,
-      CIRConstantOpABILowering,
-      CIRFuncOpABILowering,
-      CIRGetRuntimeMemberOpABILowering,
-      CIRGlobalOpABILowering
-      // clang-format on
+#define GET_ABI_LOWERING_PATTERNS_LIST
+#include "clang/CIR/Dialect/IR/CIRLowering.inc"
+#undef GET_ABI_LOWERING_PATTERNS_LIST
       >(patterns.getContext(), typeConverter, dataLayout, *lowerModule);
 
   mlir::ConversionTarget target(*ctx);

diff  --git a/clang/utils/TableGen/CIRLoweringEmitter.cpp 
b/clang/utils/TableGen/CIRLoweringEmitter.cpp
index c81b8941f9a39..a669f21aa1108 100644
--- a/clang/utils/TableGen/CIRLoweringEmitter.cpp
+++ b/clang/utils/TableGen/CIRLoweringEmitter.cpp
@@ -20,6 +20,8 @@ using namespace llvm;
 using namespace clang;
 
 namespace {
+std::vector<std::string> CXXABILoweringPatterns;
+std::vector<std::string> CXXABILoweringPatternsList;
 std::vector<std::string> LLVMLoweringPatterns;
 std::vector<std::string> LLVMLoweringPatternsList;
 
@@ -45,6 +47,13 @@ std::string GetOpCppClassName(const Record *OpRecord) {
   return CppClassName.str();
 }
 
+std::string GetOpABILoweringPatternName(llvm::StringRef OpName) {
+  std::string Name = "CIR";
+  Name += OpName;
+  Name += "ABILowering";
+  return Name;
+}
+
 std::string GetOpLLVMLoweringPatternName(llvm::StringRef OpName) {
   std::string Name = "CIRToLLVM";
   Name += OpName;
@@ -52,6 +61,36 @@ std::string GetOpLLVMLoweringPatternName(llvm::StringRef 
OpName) {
   return Name;
 }
 
+void GenerateABILoweringPattern(llvm::StringRef OpName,
+                                llvm::StringRef PatternName) {
+  std::string CodeBuffer;
+  llvm::raw_string_ostream Code(CodeBuffer);
+
+  Code << "class " << PatternName
+       << " : public mlir::OpConversionPattern<cir::" << OpName << "> {\n";
+  Code << "  [[maybe_unused]] mlir::DataLayout *dataLayout;\n";
+  Code << "  [[maybe_unused]] cir::LowerModule *lowerModule;\n";
+  Code << "\n";
+
+  Code << "public:\n";
+  Code << "  " << PatternName
+       << "(mlir::MLIRContext *context, const mlir::TypeConverter "
+          "&typeConverter, mlir::DataLayout &dataLayout, cir::LowerModule "
+          "&lowerModule)\n";
+  Code << "    : OpConversionPattern<cir::" << OpName
+       << ">(typeConverter, context), dataLayout(&dataLayout), "
+          "lowerModule(&lowerModule) {}\n";
+  Code << "\n";
+
+  Code << "  mlir::LogicalResult matchAndRewrite(cir::" << OpName
+       << " op, OpAdaptor adaptor, mlir::ConversionPatternRewriter &rewriter) "
+          "const override;\n";
+
+  Code << "};\n";
+
+  CXXABILoweringPatterns.push_back(std::move(CodeBuffer));
+}
+
 void GenerateLLVMLoweringPattern(llvm::StringRef OpName,
                                  llvm::StringRef PatternName, bool IsRecursive,
                                  llvm::StringRef ExtraDecl) {
@@ -103,6 +142,12 @@ void GenerateLLVMLoweringPattern(llvm::StringRef OpName,
 void Generate(const Record *OpRecord) {
   std::string OpName = GetOpCppClassName(OpRecord);
 
+  if (OpRecord->getValueAsBit("hasCXXABILowering")) {
+    std::string PatternName = GetOpABILoweringPatternName(OpName);
+    GenerateABILoweringPattern(OpName, PatternName);
+    CXXABILoweringPatternsList.push_back(std::move(PatternName));
+  }
+
   if (OpRecord->getValueAsBit("hasLLVMLowering")) {
     std::string PatternName = GetOpLLVMLoweringPatternName(OpName);
     bool IsRecursive = OpRecord->getValueAsBit("isLLVMLoweringRecursive");
@@ -121,6 +166,11 @@ void clang::EmitCIRLowering(const llvm::RecordKeeper &RK,
   for (const auto *OpRecord : RK.getAllDerivedDefinitions("CIR_Op"))
     Generate(OpRecord);
 
+  OS << "#ifdef GET_ABI_LOWERING_PATTERNS\n"
+     << llvm::join(CXXABILoweringPatterns, "\n") << "#endif\n\n";
+  OS << "#ifdef GET_ABI_LOWERING_PATTERNS_LIST\n"
+     << llvm::join(CXXABILoweringPatternsList, ",\n") << "\n#endif\n\n";
+
   OS << "#ifdef GET_LLVM_LOWERING_PATTERNS\n"
      << llvm::join(LLVMLoweringPatterns, "\n") << "#endif\n\n";
   OS << "#ifdef GET_LLVM_LOWERING_PATTERNS_LIST\n"


        
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to