[Mlir-commits] [mlir] f68454e - Fix printing for ArrayRef attributes/types in declarative assembly format
Mehdi Amini
llvmlistbot at llvm.org
Tue Jun 28 10:40:04 PDT 2022
Author: Mehdi Amini
Date: 2022-06-28T17:39:38Z
New Revision: f68454ee8fd5188986c2ef2741352bab9d57d6c1
URL: https://github.com/llvm/llvm-project/commit/f68454ee8fd5188986c2ef2741352bab9d57d6c1
DIFF: https://github.com/llvm/llvm-project/commit/f68454ee8fd5188986c2ef2741352bab9d57d6c1.diff
LOG: Fix printing for ArrayRef attributes/types in declarative assembly format
These were abbreviated when parsing, but not when printing.
Reviewed By: Mogball, rriddle
Differential Revision: https://reviews.llvm.org/D128720
Added:
Modified:
mlir/include/mlir/IR/OpImplementation.h
mlir/test/lib/Dialect/Test/TestAttrDefs.td
mlir/test/lib/Dialect/Test/TestAttributes.cpp
mlir/test/mlir-tblgen/attr-or-type-format-roundtrip.mlir
mlir/test/mlir-tblgen/attr-or-type-format.mlir
Removed:
################################################################################
diff --git a/mlir/include/mlir/IR/OpImplementation.h b/mlir/include/mlir/IR/OpImplementation.h
index 2acb2c799d83b..a8f334f092bfc 100644
--- a/mlir/include/mlir/IR/OpImplementation.h
+++ b/mlir/include/mlir/IR/OpImplementation.h
@@ -70,6 +70,20 @@ class AsmPrinter {
attrOrType.print(*this);
}
+ /// Print the provided array of attributes or types in the context of an
+ /// operation custom printer/parser: this will invoke directly the print
+ /// method on the attribute class and skip the `#dialect.mnemonic` prefix in
+ /// most cases.
+ template <typename AttrOrType,
+ std::enable_if_t<detect_has_print_method<AttrOrType>::value>
+ *sfinae = nullptr>
+ void printStrippedAttrOrType(ArrayRef<AttrOrType> attrOrTypes) {
+ llvm::interleaveComma(attrOrTypes, getStream(),
+ [this](AttrOrType attrOrType) {
+ printStrippedAttrOrType(attrOrType);
+ });
+ }
+
/// SFINAE for printing the provided attribute in the context of an operation
/// custom printer in the case where the attribute does not define a print
/// method.
diff --git a/mlir/test/lib/Dialect/Test/TestAttrDefs.td b/mlir/test/lib/Dialect/Test/TestAttrDefs.td
index d62605d6eb3b8..d246cab97ccc1 100644
--- a/mlir/test/lib/Dialect/Test/TestAttrDefs.td
+++ b/mlir/test/lib/Dialect/Test/TestAttrDefs.td
@@ -175,11 +175,19 @@ def TestAttrWithFormat : Test_Attr<"TestAttrWithFormat"> {
TestParamOne:$one,
TestParamTwo:$two,
"::mlir::IntegerAttr":$three,
- TestParamFour:$four
+ TestParamFour:$four,
+ // Array of another attribute.
+ ArrayRefParameter<
+ "AttrWithTypeBuilderAttr", // The parameter C++ type.
+ "An example of an array of another Attribute" // Parameter description.
+ >: $arrayOfAttrWithTypeBuilderAttr
);
let mnemonic = "attr_with_format";
- let assemblyFormat = "`<` $one `:` struct($two, $four) `:` $three `>`";
+ let assemblyFormat = [{
+ `<` $one `:` struct($two, $four) `:` $three `,`
+ `[` `` $arrayOfAttrWithTypeBuilderAttr `]` `>`
+ }];
let genVerifyDecl = 1;
}
diff --git a/mlir/test/lib/Dialect/Test/TestAttributes.cpp b/mlir/test/lib/Dialect/Test/TestAttributes.cpp
index bc9a50bfeec40..13fd3a947e115 100644
--- a/mlir/test/lib/Dialect/Test/TestAttributes.cpp
+++ b/mlir/test/lib/Dialect/Test/TestAttributes.cpp
@@ -114,10 +114,10 @@ TestI64ElementsAttr::verify(function_ref<InFlightDiagnostic()> emitError,
return success();
}
-LogicalResult
-TestAttrWithFormatAttr::verify(function_ref<InFlightDiagnostic()> emitError,
- int64_t one, std::string two, IntegerAttr three,
- ArrayRef<int> four) {
+LogicalResult TestAttrWithFormatAttr::verify(
+ function_ref<InFlightDiagnostic()> emitError, int64_t one, std::string two,
+ IntegerAttr three, ArrayRef<int> four,
+ ArrayRef<AttrWithTypeBuilderAttr> arrayOfAttrWithTypeBuilderAttr) {
if (four.size() != static_cast<unsigned>(one))
return emitError() << "expected 'one' to equal 'four.size()'";
return success();
diff --git a/mlir/test/mlir-tblgen/attr-or-type-format-roundtrip.mlir b/mlir/test/mlir-tblgen/attr-or-type-format-roundtrip.mlir
index 6ed246601468b..569fb093a080b 100644
--- a/mlir/test/mlir-tblgen/attr-or-type-format-roundtrip.mlir
+++ b/mlir/test/mlir-tblgen/attr-or-type-format-roundtrip.mlir
@@ -5,10 +5,10 @@
// CHECK: !test.type_with_format<2147, three = "hi", two = "hi">
func.func private @test_roundtrip_parameter_parsers(!test.type_with_format<111, three = #test<"attr_ugly begin 5 : index end">, two = "foo">) -> !test.type_with_format<2147, two = "hi", three = "hi">
attributes {
- // CHECK: #test.attr_with_format<3 : two = "hello", four = [1, 2, 3] : 42 : i64>
- attr0 = #test.attr_with_format<3 : two = "hello", four = [1, 2, 3] : 42 : i64>,
- // CHECK: #test.attr_with_format<5 : two = "a_string", four = [4, 5, 6, 7, 8] : 8 : i8>
- attr1 = #test.attr_with_format<5 : two = "a_string", four = [4, 5, 6, 7, 8] : 8 : i8>,
+ // CHECK: #test.attr_with_format<3 : two = "hello", four = [1, 2, 3] : 42 : i64, [ 10 : i16]
+ attr0 = #test.attr_with_format<3 : two = "hello", four = [1, 2, 3] : 42 : i64, [10 : i16]>,
+ // CHECK: #test.attr_with_format<5 : two = "a_string", four = [4, 5, 6, 7, 8] : 8 : i8, [ 10 : i16]>,
+ attr1 = #test.attr_with_format<5 : two = "a_string", four = [4, 5, 6, 7, 8] : 8 : i8, [10 : i16]>,
// CHECK: #test<"attr_ugly begin 5 : index end">
attr2 = #test<"attr_ugly begin 5 : index end">,
// CHECK: #test.attr_params<42, 24>
diff --git a/mlir/test/mlir-tblgen/attr-or-type-format.mlir b/mlir/test/mlir-tblgen/attr-or-type-format.mlir
index 8a26a5b1405ff..8f0378fde7668 100644
--- a/mlir/test/mlir-tblgen/attr-or-type-format.mlir
+++ b/mlir/test/mlir-tblgen/attr-or-type-format.mlir
@@ -123,7 +123,7 @@ func.func private @test_type_syntax_error() -> !test.type_with_format<42, two =
func.func private @test_verifier_fails() -> () attributes {
// expected-error at +1 {{expected 'one' to equal 'four.size()'}}
- attr = #test.attr_with_format<42 : two = "hello", four = [1, 2, 3] : 42 : i64>
+ attr = #test.attr_with_format<42 : two = "hello", four = [1, 2, 3] : 42 : i64, [10 : i16]>
}
// -----
More information about the Mlir-commits
mailing list