[Mlir-commits] [mlir] [MLIR] Always emit setPropertiesFromParsedAttr() when hasCustomAssemblyFormat is set (PR #145973)
Mehdi Amini
llvmlistbot at llvm.org
Mon Jun 30 04:30:07 PDT 2025
https://github.com/joker-eph updated https://github.com/llvm/llvm-project/pull/145973
>From 29d11608ea53d11e6ed2cebb6c002860b914e1a8 Mon Sep 17 00:00:00 2001
From: Mehdi Amini <joker.eph at gmail.com>
Date: Thu, 26 Jun 2025 14:01:56 -0700
Subject: [PATCH] [MLIR] Always emit setPropertiesFromParsedAttr() when
hasCustomAssemblyFormat is set
This allows people writing custom C++ assembly functions to reuse the
"prop-dict" parser.
Fix #145028
---
mlir/test/mlir-tblgen/op-decl-and-defs.td | 1 +
mlir/tools/mlir-tblgen/OpFormatGen.cpp | 16 +++++++++++-----
2 files changed, 12 insertions(+), 5 deletions(-)
diff --git a/mlir/test/mlir-tblgen/op-decl-and-defs.td b/mlir/test/mlir-tblgen/op-decl-and-defs.td
index a3dce9b31f8d2..3ccefd4d82366 100644
--- a/mlir/test/mlir-tblgen/op-decl-and-defs.td
+++ b/mlir/test/mlir-tblgen/op-decl-and-defs.td
@@ -125,6 +125,7 @@ def NS_AOp : NS_Op<"a_op", [IsolatedFromAbove, IsolatedFromAbove]> {
// CHECK: ::llvm::LogicalResult verifyInvariants();
// CHECK: static void getCanonicalizationPatterns(::mlir::RewritePatternSet &results, ::mlir::MLIRContext *context);
// CHECK: ::llvm::LogicalResult fold(FoldAdaptor adaptor, ::llvm::SmallVectorImpl<::mlir::OpFoldResult> &results);
+// CHECK: static ::llvm::LogicalResult setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError);
// CHECK: // Display a graph for debugging purposes.
// CHECK: void displayGraph();
// CHECK: };
diff --git a/mlir/tools/mlir-tblgen/OpFormatGen.cpp b/mlir/tools/mlir-tblgen/OpFormatGen.cpp
index 11edf2523f1aa..c373ec6157dab 100644
--- a/mlir/tools/mlir-tblgen/OpFormatGen.cpp
+++ b/mlir/tools/mlir-tblgen/OpFormatGen.cpp
@@ -1302,8 +1302,8 @@ if (!dict) {
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
-DenseSet<StringAttr> usedKeys;
-MLIRContext *ctx = dict.getContext();
+::mlir::DenseSet<::mlir::StringAttr> usedKeys;
+::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
)decl";
@@ -1315,7 +1315,7 @@ auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {{
{0};
};
-auto {1}AttrName = StringAttr::get(ctx, "{1}");
+auto {1}AttrName = ::mlir::StringAttr::get(ctx, "{1}");
usedKeys.insert({1}AttrName);
auto attr = dict.get({1}AttrName);
if (!attr && {2}) {{
@@ -1384,7 +1384,7 @@ if (attr || /*isRequired=*/{1}) {{
namedAttr.name, isRequired);
}
body << R"decl(
-for (NamedAttribute attr : dict) {
+for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
@@ -3848,8 +3848,14 @@ void mlir::tblgen::generateOpFormat(const Operator &constOp, OpClass &opClass,
// TODO: Operator doesn't expose all necessary functionality via
// the const interface.
Operator &op = const_cast<Operator &>(constOp);
- if (!op.hasAssemblyFormat())
+ if (!op.hasAssemblyFormat()) {
+ // We still need to generate the parsed attribute properties setter for
+ // allowing it to be reused in custom assembly implementations.
+ OperationFormat format(op, hasProperties);
+ format.hasPropDict = true;
+ genParsedAttrPropertiesSetter(format, op, opClass);
return;
+ }
// Parse the format description.
llvm::SourceMgr mgr;
More information about the Mlir-commits
mailing list