================
@@ -47,83 +56,93 @@ 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;
   Name += "Lowering";
   return Name;
 }
+std::optional<CustomLoweringCtor> parseCustomLoweringCtor(const Record *R) {
+  if (!R)
+    return std::nullopt;
 
-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";
+  CustomLoweringCtor Ctor;
+  const DagInit *Args = R->getValueAsDag("dagParams");
+  Ctor.Body = R->getValueAsString("body");
 
-  Code << "  mlir::LogicalResult matchAndRewrite(cir::" << OpName
-       << " op, OpAdaptor adaptor, mlir::ConversionPatternRewriter &rewriter) "
-          "const override;\n";
+  for (const auto &[Arg, Name] : Args->getArgAndNames()) {
+    Ctor.Params.push_back(
+        {Arg->getAsUnquotedString(), Name->getAsUnquotedString()});
+  }
 
-  Code << "};\n";
+  return Ctor;
+}
+void emitCustomParamList(raw_ostream &Code,
+                         ArrayRef<CustomLoweringCtor::Param> Params) {
+  for (const auto &Param : Params) {
+    Code << ", ";
+    Code << Param.Type << " " << Param.Name;
+  }
+}
 
-  CXXABILoweringPatterns.push_back(std::move(CodeBuffer));
+void emitCustomInitList(raw_ostream &Code,
+                        ArrayRef<CustomLoweringCtor::Param> Params) {
+  for (auto &P : Params)
+    Code << ", " << P.Name << "(" << P.Name << ")";
 }
 
 void GenerateLLVMLoweringPattern(llvm::StringRef OpName,
                                  llvm::StringRef PatternName, bool IsRecursive,
-                                 llvm::StringRef ExtraDecl) {
+                                 llvm::StringRef ExtraDecl,
+                                 const Record *CustomCtorRec) {
+  auto CustomCtor = parseCustomLoweringCtor(CustomCtorRec);
   std::string CodeBuffer;
   llvm::raw_string_ostream Code(CodeBuffer);
 
   Code << "class " << PatternName
        << " : public mlir::OpConversionPattern<cir::" << OpName << "> {\n";
   Code << "  [[maybe_unused]] cir::LowerModule *lowerMod;\n";
   Code << "  [[maybe_unused]] mlir::DataLayout const &dataLayout;\n";
+
+  if (CustomCtor) {
+    for (auto &P : CustomCtor->Params)
----------------
Lancern wrote:

```suggestion
    for (const CustomLoweringCtor::Param &P : CustomCtor->Params)
```


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

Reply via email to