[Mlir-commits] [mlir] Enable printing newlines and indents in attribute and type printers (PR #87948)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Sun Apr 7 15:11:14 PDT 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-mlir
@llvm/pr-subscribers-mlir-core
Author: Jacenty Andruszkiewicz (Jacenty-And-Intel)
<details>
<summary>Changes</summary>
This commit moves the code responsible for adding newlines and tracking indent, so that it can be used not only for operation printers, but also for attribute and type printers.
---
Full diff: https://github.com/llvm/llvm-project/pull/87948.diff
9 Files Affected:
- (modified) mlir/include/mlir/IR/OpImplementation.h (+10-10)
- (modified) mlir/lib/IR/AsmPrinter.cpp (+51-19)
- (modified) mlir/test/lib/Dialect/Test/TestAttrDefs.td (+7)
- (modified) mlir/test/lib/Dialect/Test/TestAttributes.cpp (+29)
- (modified) mlir/test/lib/Dialect/Test/TestTypeDefs.td (+5)
- (modified) mlir/test/lib/Dialect/Test/TestTypes.cpp (+27)
- (modified) mlir/test/mlir-tblgen/testdialect-attrdefs.mlir (+15-1)
- (modified) mlir/test/mlir-tblgen/testdialect-typedefs.mlir (+11-1)
- (modified) mlir/tools/mlir-tblgen/AttrOrTypeFormatGen.cpp (+1-3)
``````````diff
diff --git a/mlir/include/mlir/IR/OpImplementation.h b/mlir/include/mlir/IR/OpImplementation.h
index 5333d7446df5cab..64a9184c5c6720b 100644
--- a/mlir/include/mlir/IR/OpImplementation.h
+++ b/mlir/include/mlir/IR/OpImplementation.h
@@ -116,6 +116,16 @@ class AsmPrinter {
/// Return the raw output stream used by this printer.
virtual raw_ostream &getStream() const;
+ /// Print a newline and indent the printer to the start of the current
+ /// operation.
+ virtual void printNewline();
+
+ /// Increase indentation.
+ virtual void increaseIndent();
+
+ /// Decrease indentation.
+ virtual void decreaseIndent();
+
/// Print the given floating point value in a stabilized form that can be
/// roundtripped through the IR. This is the companion to the 'parseFloat'
/// hook on the AsmParser.
@@ -417,16 +427,6 @@ class OpAsmPrinter : public AsmPrinter {
/// Print a loc(...) specifier if printing debug info is enabled.
virtual void printOptionalLocationSpecifier(Location loc) = 0;
- /// Print a newline and indent the printer to the start of the current
- /// operation.
- virtual void printNewline() = 0;
-
- /// Increase indentation.
- virtual void increaseIndent() = 0;
-
- /// Decrease indentation.
- virtual void decreaseIndent() = 0;
-
/// Print a block argument in the usual format of:
/// %ssaName : type {attr1=42} loc("here")
/// where location printing is controlled by the standard internal option.
diff --git a/mlir/lib/IR/AsmPrinter.cpp b/mlir/lib/IR/AsmPrinter.cpp
index 456cf6a2c27783e..fc5c142fc433bb8 100644
--- a/mlir/lib/IR/AsmPrinter.cpp
+++ b/mlir/lib/IR/AsmPrinter.cpp
@@ -376,6 +376,19 @@ class AsmPrinter::Impl {
/// Returns the output stream of the printer.
raw_ostream &getStream() { return os; }
+ /// Print a newline and indent the printer to the start of the current
+ /// operation.
+ void printNewline() {
+ os << newLine;
+ os.indent(currentIndent);
+ }
+
+ /// Increase indentation.
+ void increaseIndent() { currentIndent += indentWidth; }
+
+ /// Decrease indentation.
+ void decreaseIndent() { currentIndent -= indentWidth; }
+
template <typename Container, typename UnaryFunctor>
inline void interleaveComma(const Container &c, UnaryFunctor eachFn) const {
llvm::interleaveComma(c, os, eachFn);
@@ -490,6 +503,12 @@ class AsmPrinter::Impl {
/// A tracker for the number of new lines emitted during printing.
NewLineCounter newLine;
+
+ /// The number of spaces used for indenting nested operations.
+ const static unsigned indentWidth = 2;
+
+ /// This is the current indentation level for nested structures.
+ unsigned currentIndent = 0;
};
} // namespace mlir
@@ -942,6 +961,9 @@ class DummyAliasDialectAsmPrinter : public DialectAsmPrinter {
/// The following are hooks of `DialectAsmPrinter` that are not necessary for
/// determining potential aliases.
+ void printNewline() override {}
+ void increaseIndent() override {}
+ void decreaseIndent() override {}
void printFloat(const APFloat &) override {}
void printKeywordOrString(StringRef) override {}
void printString(StringRef) override {}
@@ -2708,6 +2730,13 @@ void AsmPrinter::Impl::printDialectAttribute(Attribute attr) {
{
llvm::raw_string_ostream attrNameStr(attrName);
Impl subPrinter(attrNameStr, state);
+
+ // The values of currentIndent and newLine are assigned to the created
+ // subprinter, so that the indent level and number of printed lines can be
+ // tracked.
+ subPrinter.currentIndent = currentIndent;
+ subPrinter.newLine = newLine;
+
DialectAsmPrinter printer(subPrinter);
dialect.printAttribute(attr, printer);
}
@@ -2722,6 +2751,13 @@ void AsmPrinter::Impl::printDialectType(Type type) {
{
llvm::raw_string_ostream typeNameStr(typeName);
Impl subPrinter(typeNameStr, state);
+
+ // The values of currentIndent and newLine are assigned to the created
+ // subprinter, so that the indent level and number of printed lines can be
+ // tracked.
+ subPrinter.currentIndent = currentIndent;
+ subPrinter.newLine = newLine;
+
DialectAsmPrinter printer(subPrinter);
dialect.printType(type, printer);
}
@@ -2762,6 +2798,21 @@ raw_ostream &AsmPrinter::getStream() const {
return impl->getStream();
}
+void AsmPrinter::printNewline() {
+ assert(impl && "expected AsmPrinter::printNewLine to be overriden");
+ impl->printNewline();
+}
+
+void AsmPrinter::increaseIndent() {
+ assert(impl && "expected AsmPrinter::increaseIndent to be overriden");
+ impl->increaseIndent();
+}
+
+void AsmPrinter::decreaseIndent() {
+ assert(impl && "expected AsmPrinter::decreaseIndent to be overriden");
+ impl->decreaseIndent();
+}
+
/// Print the given floating point value in a stablized form.
void AsmPrinter::printFloat(const APFloat &value) {
assert(impl && "expected AsmPrinter::printFloat to be overriden");
@@ -3087,19 +3138,6 @@ class OperationPrinter : public AsmPrinter::Impl, private OpAsmPrinter {
printTrailingLocation(loc);
}
- /// Print a newline and indent the printer to the start of the current
- /// operation.
- void printNewline() override {
- os << newLine;
- os.indent(currentIndent);
- }
-
- /// Increase indentation.
- void increaseIndent() override { currentIndent += indentWidth; }
-
- /// Decrease indentation.
- void decreaseIndent() override { currentIndent -= indentWidth; }
-
/// Print a block argument in the usual format of:
/// %ssaName : type {attr1=42} loc("here")
/// where location printing is controlled by the standard internal option.
@@ -3225,12 +3263,6 @@ class OperationPrinter : public AsmPrinter::Impl, private OpAsmPrinter {
// top-level we start with "builtin" as the default, so that the top-level
// `module` operation prints as-is.
SmallVector<StringRef> defaultDialectStack{"builtin"};
-
- /// The number of spaces used for indenting nested operations.
- const static unsigned indentWidth = 2;
-
- // This is the current indentation level for nested structures.
- unsigned currentIndent = 0;
};
} // namespace
diff --git a/mlir/test/lib/Dialect/Test/TestAttrDefs.td b/mlir/test/lib/Dialect/Test/TestAttrDefs.td
index 40f035a3e3a4e5e..7d01979f45a055d 100644
--- a/mlir/test/lib/Dialect/Test/TestAttrDefs.td
+++ b/mlir/test/lib/Dialect/Test/TestAttrDefs.td
@@ -340,4 +340,11 @@ def TestConditionalAliasAttr : Test_Attr<"TestConditionalAlias"> {
}];
}
+def TestAttrNewlineAndIndent : Test_Attr<"TestAttrNewlineAndIndent"> {
+ let mnemonic = "newline_and_indent";
+ let parameters = (ins "::mlir::Type":$indentType);
+ let hasCustomAssemblyFormat = 1;
+}
+
+
#endif // TEST_ATTRDEFS
diff --git a/mlir/test/lib/Dialect/Test/TestAttributes.cpp b/mlir/test/lib/Dialect/Test/TestAttributes.cpp
index d41d495c38e5532..605fa861da823e5 100644
--- a/mlir/test/lib/Dialect/Test/TestAttributes.cpp
+++ b/mlir/test/lib/Dialect/Test/TestAttributes.cpp
@@ -239,6 +239,35 @@ static void printConditionalAlias(AsmPrinter &p, StringAttr value) {
p.printKeywordOrString(value);
}
+//===----------------------------------------------------------------------===//
+// TestAttrNewlineAndIndent
+//===----------------------------------------------------------------------===//
+
+Attribute TestAttrNewlineAndIndentAttr::parse(::mlir::AsmParser &parser,
+ ::mlir::Type type) {
+ Type indentType;
+ if (parser.parseLess()) {
+ return {};
+ }
+ if (parser.parseType(indentType)) {
+ return {};
+ }
+ if (parser.parseGreater()) {
+ return {};
+ }
+ return get(parser.getContext(), indentType);
+}
+
+void TestAttrNewlineAndIndentAttr::print(::mlir::AsmPrinter &printer) const {
+ printer << "<";
+ printer.increaseIndent();
+ printer.printNewline();
+ printer << getIndentType();
+ printer.decreaseIndent();
+ printer.printNewline();
+ printer << ">";
+}
+
//===----------------------------------------------------------------------===//
// Tablegen Generated Definitions
//===----------------------------------------------------------------------===//
diff --git a/mlir/test/lib/Dialect/Test/TestTypeDefs.td b/mlir/test/lib/Dialect/Test/TestTypeDefs.td
index 492642b711e09e8..842af153e98d338 100644
--- a/mlir/test/lib/Dialect/Test/TestTypeDefs.td
+++ b/mlir/test/lib/Dialect/Test/TestTypeDefs.td
@@ -392,4 +392,9 @@ def TestRecursiveAlias
}];
}
+def TestTypeNewlineAndIndent : Test_Type<"TestTypeNewlineAndIndent"> {
+ let mnemonic = "newline_and_indent";
+ let hasCustomAssemblyFormat = 1;
+}
+
#endif // TEST_TYPEDEFS
diff --git a/mlir/test/lib/Dialect/Test/TestTypes.cpp b/mlir/test/lib/Dialect/Test/TestTypes.cpp
index 7a195eb25a3ba1a..21bb2e3efcb805a 100644
--- a/mlir/test/lib/Dialect/Test/TestTypes.cpp
+++ b/mlir/test/lib/Dialect/Test/TestTypes.cpp
@@ -530,3 +530,30 @@ void TestRecursiveAliasType::print(AsmPrinter &printer) const {
}
printer << ">";
}
+
+//===----------------------------------------------------------------------===//
+// TestTypeNewlineAndIndent
+//===----------------------------------------------------------------------===//
+
+Type TestTypeNewlineAndIndentType::parse(::mlir::AsmParser &parser) {
+ if (parser.parseLess()) {
+ return {};
+ }
+ if (parser.parseKeyword("indented_content")) {
+ return {};
+ }
+ if (parser.parseGreater()) {
+ return {};
+ }
+ return get(parser.getContext());
+}
+
+void TestTypeNewlineAndIndentType::print(::mlir::AsmPrinter &printer) const {
+ printer << "<";
+ printer.increaseIndent();
+ printer.printNewline();
+ printer << "indented_content";
+ printer.decreaseIndent();
+ printer.printNewline();
+ printer << ">";
+}
\ No newline at end of file
diff --git a/mlir/test/mlir-tblgen/testdialect-attrdefs.mlir b/mlir/test/mlir-tblgen/testdialect-attrdefs.mlir
index ee92ea06a208c47..1eba4f595694a10 100644
--- a/mlir/test/mlir-tblgen/testdialect-attrdefs.mlir
+++ b/mlir/test/mlir-tblgen/testdialect-attrdefs.mlir
@@ -1,4 +1,4 @@
-// RUN: mlir-opt %s | mlir-opt -verify-diagnostics | FileCheck %s
+// RUN: mlir-opt %s | mlir-opt -verify-diagnostics | FileCheck %s --strict-whitespace
// CHECK-LABEL: func private @compoundA()
// CHECK-SAME: #test.cmpnd_a<1, !test.smpla, [5, 6]>
@@ -19,3 +19,17 @@ func.func private @qualifiedAttr() attributes {foo = #test.cmpnd_nested_outer_qu
func.func private @overriddenAttr() attributes {
foo = #test.override_builder<5>
}
+
+// CHECK-LABEL: @newlineAndIndent
+// CHECK-SAME: indent = #test.newline_and_indent<
+// CHECK-NEXT: {{^ }}!test.newline_and_indent<
+// CHECK-NEXT: {{^ }}indented_content
+// CHECK-NEXT: {{^ }}>
+// CHECK-NEXT: {{^ }}>
+func.func private @newlineAndIndent() attributes {
+ indent = #test.newline_and_indent<
+ !test.newline_and_indent<
+ indented_content
+ >
+ >
+}
diff --git a/mlir/test/mlir-tblgen/testdialect-typedefs.mlir b/mlir/test/mlir-tblgen/testdialect-typedefs.mlir
index 18175edc81cf08b..c00d368fdab8ba8 100644
--- a/mlir/test/mlir-tblgen/testdialect-typedefs.mlir
+++ b/mlir/test/mlir-tblgen/testdialect-typedefs.mlir
@@ -1,4 +1,4 @@
-// RUN: mlir-opt %s | mlir-opt -verify-diagnostics | FileCheck %s
+// RUN: mlir-opt %s | mlir-opt -verify-diagnostics | FileCheck %s --strict-whitespace
//////////////
// Tests the types in the 'Test' dialect, not the ones in 'typedefs.mlir'
@@ -42,3 +42,13 @@ func.func @testInt(%A : !test.int<s, 8>, %B : !test.int<unsigned, 2>, %C : !test
func.func @structTest (%A : !test.struct< {field1, !test.smpla}, {field2, !test.int<none, 3>} > ) {
return
}
+
+// CHECK-LABEL: @newlineAndIndent
+// CHECK-SAME: !test.newline_and_indent<
+// CHECK-NEXT: {{^ }}indented_content
+// CHECK-NEXT: {{^ }}>
+func.func @newlineAndIndent(%A : !test.newline_and_indent<
+ indented_content
+>) {
+ return
+}
diff --git a/mlir/tools/mlir-tblgen/AttrOrTypeFormatGen.cpp b/mlir/tools/mlir-tblgen/AttrOrTypeFormatGen.cpp
index 6098808c646f765..2706e48945d587a 100644
--- a/mlir/tools/mlir-tblgen/AttrOrTypeFormatGen.cpp
+++ b/mlir/tools/mlir-tblgen/AttrOrTypeFormatGen.cpp
@@ -903,9 +903,7 @@ void DefFormat::genOptionalGroupPrinter(OptionalElement *el, FmtContext &ctx,
void DefFormat::genWhitespacePrinter(WhitespaceElement *el, FmtContext &ctx,
MethodBody &os) {
if (el->getValue() == "\\n") {
- // FIXME: The newline should be `printer.printNewLine()`, i.e., handled by
- // the printer.
- os << tgfmt("$_printer << '\\n';\n", &ctx);
+ os << tgfmt("$_printer.printNewline();\n", &ctx);
} else if (!el->getValue().empty()) {
os << tgfmt("$_printer << \"$0\";\n", &ctx, el->getValue());
} else {
``````````
</details>
https://github.com/llvm/llvm-project/pull/87948
More information about the Mlir-commits
mailing list