[Mlir-commits] [mlir] [MLIR] Allow operations to have interfaces as parents (PR #66196)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Wed Sep 13 05:00:09 PDT 2023
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-mlir-core
<details>
<summary>Changes</summary>
... by emitting an operation name for interfaces. The name is only emitted for the parent interface (i.e. base interfaces are not considered).
This change is needed by https://github.com/llvm/llvm-project/blob/main/mlir/include/mlir/IR/OpDefinition.h#L1324C38-L1324C38 wherein _some_ name needs to be reported to the user.
... should interfaces be identified by `getOperationName` and not i.e. `getInterfaceName`? it's a possibility, but would obviously complicate code which wants to treat operation types and interface types as equals.
--
Full diff: https://github.com/llvm/llvm-project/pull/66196.diff
2 Files Affected:
- (modified) mlir/test/mlir-tblgen/op-interface.td (+4)
- (modified) mlir/tools/mlir-tblgen/OpInterfacesGen.cpp (+15-1)
<pre>
diff --git a/mlir/test/mlir-tblgen/op-interface.td b/mlir/test/mlir-tblgen/op-interface.td
index 17bd631fe250d16..80878c9b3205176 100644
--- a/mlir/test/mlir-tblgen/op-interface.td
+++ b/mlir/test/mlir-tblgen/op-interface.td
@@ -167,6 +167,10 @@ def DeclareMethodsOp : Op<TestDialect, "declare_methods_op",
def DeclareMethodsWithDefaultOp : Op<TestDialect, "declare_methods_op",
[DeclareOpInterfaceMethods<TestOpInterface, ["default_foo"]>]>;
+
+// DECL: /// Returns the name of this interface.
+// DECL: static ::llvm::StringLiteral getOperationName() { return ::llvm::StringLiteral( "TestOpInterface"); }
+
// DECL-LABEL: TestOpInterfaceInterfaceTraits
// DECL: class TestOpInterface : public ::mlir::OpInterface<TestOpInterface, detail::TestOpInterfaceInterfaceTraits>
diff --git a/mlir/tools/mlir-tblgen/OpInterfacesGen.cpp b/mlir/tools/mlir-tblgen/OpInterfacesGen.cpp
index 9672a02cc08f68c..153543ab083525e 100644
--- a/mlir/tools/mlir-tblgen/OpInterfacesGen.cpp
+++ b/mlir/tools/mlir-tblgen/OpInterfacesGen.cpp
@@ -494,6 +494,16 @@ void InterfaceGenerator::emitTraitDecl(const Interface &interface,
os << " };\n";
}
+static void emitInterfaceNameGetter(const Interface &interface,
+ raw_ostream &os) {
+ if (!isa<OpInterface>(interface))
+ return;
+ os << " /// Returns the name of this interface.\n"
+ << " static ::llvm::StringLiteral getOperationName() { return "
+ "::llvm::StringLiteral( \""
+ << interface.getName() << "\"); }\n";
+}
+
static void emitInterfaceDeclMethods(const Interface &interface,
raw_ostream &os, StringRef valueType,
bool isOpInterface,
@@ -553,6 +563,9 @@ void InterfaceGenerator::emitInterfaceDecl(const Interface &interface) {
" struct Trait : public detail::{0}Trait<{1}> {{};\n",
interfaceName, valueTemplate);
+ // Emit the name of the interface.
+ emitInterfaceNameGetter(interface, os);
+
// Insert the method declarations.
bool isOpInterface = isa<OpInterface>(interface);
emitInterfaceDeclMethods(interface, os, valueType, isOpInterface,
@@ -588,7 +601,8 @@ void InterfaceGenerator::emitInterfaceDecl(const Interface &interface) {
<< " auto* interface = getInterfaceFor(base);\n"
<< " if (!interface)\n"
" return false;\n"
- " " << interfaceName << " odsInterfaceInstance(base, interface);\n"
+ " "
+ << interfaceName << " odsInterfaceInstance(base, interface);\n"
<< " " << tblgen::tgfmt(extraClassOf->trim(), &extraClassOfFmt)
<< "\n }\n";
}
</pre>
</details>
https://github.com/llvm/llvm-project/pull/66196
More information about the Mlir-commits
mailing list