[Mlir-commits] [mlir] f6ff757 - [mlir] Attribute add printStripped (#78008)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Mon Jan 15 20:56:40 PST 2024
Author: Jacques Pienaar
Date: 2024-01-15T20:56:35-08:00
New Revision: f6ff7574a6fc979583b8105f0d3f2fac165b6d61
URL: https://github.com/llvm/llvm-project/commit/f6ff7574a6fc979583b8105f0d3f2fac165b6d61
DIFF: https://github.com/llvm/llvm-project/commit/f6ff7574a6fc979583b8105f0d3f2fac165b6d61.diff
LOG: [mlir] Attribute add printStripped (#78008)
Enable printing without dialect wrapping.
This closely matches `AsmPrinter::printStrippedAttrOrType`
implementation wise except templating component.
Added:
Modified:
mlir/include/mlir/IR/Attributes.h
mlir/lib/IR/AsmPrinter.cpp
mlir/unittests/IR/AttributeTest.cpp
Removed:
################################################################################
diff --git a/mlir/include/mlir/IR/Attributes.h b/mlir/include/mlir/IR/Attributes.h
index f433363e5dedec..cc0cee6a31183c 100644
--- a/mlir/include/mlir/IR/Attributes.h
+++ b/mlir/include/mlir/IR/Attributes.h
@@ -78,6 +78,10 @@ class Attribute {
void print(raw_ostream &os, AsmState &state, bool elideType = false) const;
void dump() const;
+ /// Print the attribute without dialect wrapping.
+ void printStripped(raw_ostream &os) const;
+ void printStripped(raw_ostream &os, AsmState &state) const;
+
/// Get an opaque pointer to the attribute.
const void *getAsOpaquePointer() const { return impl; }
/// Construct an attribute from the opaque pointer representation.
diff --git a/mlir/lib/IR/AsmPrinter.cpp b/mlir/lib/IR/AsmPrinter.cpp
index da417945b57fac..6b8b7473bf0f8a 100644
--- a/mlir/lib/IR/AsmPrinter.cpp
+++ b/mlir/lib/IR/AsmPrinter.cpp
@@ -3751,6 +3751,37 @@ void Attribute::dump() const {
llvm::errs() << "\n";
}
+void Attribute::printStripped(raw_ostream &os, AsmState &state) const {
+ if (!*this) {
+ os << "<<NULL ATTRIBUTE>>";
+ return;
+ }
+
+ AsmPrinter::Impl subPrinter(os, state.getImpl());
+ if (succeeded(subPrinter.printAlias(*this)))
+ return;
+
+ auto &dialect = this->getDialect();
+ uint64_t posPrior = os.tell();
+ DialectAsmPrinter printer(subPrinter);
+ dialect.printAttribute(*this, printer);
+ if (posPrior != os.tell())
+ return;
+
+ // Fallback to printing with prefix if the above failed to write anything
+ // to the output stream.
+ print(os, state);
+}
+void Attribute::printStripped(raw_ostream &os) const {
+ if (!*this) {
+ os << "<<NULL ATTRIBUTE>>";
+ return;
+ }
+
+ AsmState state(getContext());
+ printStripped(os, state);
+}
+
void Type::print(raw_ostream &os) const {
if (!*this) {
os << "<<NULL TYPE>>";
diff --git a/mlir/unittests/IR/AttributeTest.cpp b/mlir/unittests/IR/AttributeTest.cpp
index 20167825d4ca82..e72bfe9d82e7cf 100644
--- a/mlir/unittests/IR/AttributeTest.cpp
+++ b/mlir/unittests/IR/AttributeTest.cpp
@@ -483,4 +483,22 @@ TEST(CopyCountAttr, CopyCount) {
#endif
}
+// Test stripped printing using test dialect attribute.
+TEST(CopyCountAttr, PrintStripped) {
+ MLIRContext context;
+ context.loadDialect<test::TestDialect>();
+ // Doesn't matter which dialect attribute is used, just chose TestCopyCount
+ // given proximity.
+ test::CopyCount::counter = 0;
+ test::CopyCount copyCount("hello");
+ Attribute res = test::TestCopyCountAttr::get(&context, std::move(copyCount));
+
+ std::string str;
+ llvm::raw_string_ostream os(str);
+ os << "|" << res << "|";
+ res.printStripped(os << "[");
+ os << "]";
+ EXPECT_EQ(os.str(), "|#test.copy_count<hello>|[copy_count<hello>]");
+}
+
} // namespace
More information about the Mlir-commits
mailing list