211 lines · plain
1// RUN: mlir-tblgen -gen-op-interface-decls -I %S/../../include %s | FileCheck %s --check-prefix=DECL2// RUN: mlir-tblgen -gen-op-interface-defs -I %S/../../include %s | FileCheck %s --check-prefix=DEF3// RUN: mlir-tblgen -gen-op-decls -I %S/../../include %s | FileCheck %s --check-prefix=OP_DECL4// RUN: mlir-tblgen -gen-op-interface-docs -I %S/../../include %s | FileCheck %s --check-prefix=DOCS5 6include "mlir/IR/OpBase.td"7 8def ExtraClassOfInterface : OpInterface<"ExtraClassOfInterface"> {9 let extraClassOf = "return $_op->someOtherMethod();";10}11 12// DECL: class ExtraClassOfInterface13// DECL: static bool classof(::mlir::Operation * base) {14// DECL-NEXT: auto* interface = getInterfaceFor(base);15// DECL-NEXT: if (!interface)16// DECL-NEXT: return false;17// DECL-NEXT: ExtraClassOfInterface odsInterfaceInstance(base, interface);18// DECL-NEXT: return odsInterfaceInstance->someOtherMethod();19// DECL-NEXT: }20 21def ExtraShardDeclsInterface : OpInterface<"ExtraShardDeclsInterface"> {22 let extraSharedClassDeclaration = [{23 bool sharedMethodDeclaration() {24 return $_op.someOtherMethod();25 }26 }];27}28 29// DECL: class ExtraShardDeclsInterface30// DECL: bool sharedMethodDeclaration() {31// DECL-NEXT: return (*this).someOtherMethod();32// DECL-NEXT: }33 34def TestInheritanceMultiBaseInterface : OpInterface<"TestInheritanceMultiBaseInterface"> {35 let methods = [36 InterfaceMethod<37 /*desc=*/[{some function comment}],38 /*retTy=*/"int",39 /*methodName=*/"baz",40 /*args=*/(ins "int":$input)41 >42 ];43}44 45def TestInheritanceBaseInterface : OpInterface<"TestInheritanceBaseInterface", [TestInheritanceMultiBaseInterface]> {46 let methods = [47 InterfaceMethod<48 /*desc=*/[{some function comment}],49 /*retTy=*/"int",50 /*methodName=*/"foo",51 /*args=*/(ins "int":$input)52 >53 ];54}55def TestInheritanceMiddleBaseInterface56 : OpInterface<"TestInheritanceMiddleBaseInterface", [TestInheritanceBaseInterface]> {57 let methods = [58 InterfaceMethod<59 /*desc=*/[{some function comment}],60 /*retTy=*/"int",61 /*methodName=*/"bar",62 /*args=*/(ins "int":$input)63 >64 ];65}66def TestInheritanceZDerivedInterface67 : OpInterface<"TestInheritanceZDerivedInterface", [TestInheritanceMiddleBaseInterface]>;68 69// DECL: struct TestInheritanceZDerivedInterfaceInterfaceTraits70// DECL: struct Concept {71// DECL: const TestInheritanceMultiBaseInterface::Concept *implTestInheritanceMultiBaseInterface = nullptr;72// DECL-NOT: const TestInheritanceMultiBaseInterface::Concept73// DECL: const TestInheritanceBaseInterface::Concept *implTestInheritanceBaseInterface = nullptr;74// DECL: const TestInheritanceMiddleBaseInterface::Concept *implTestInheritanceMiddleBaseInterface = nullptr;75 76// DECL: void initializeInterfaceConcept(::mlir::detail::InterfaceMap &interfaceMap) {77// DECL: implTestInheritanceBaseInterface = interfaceMap.lookup<TestInheritanceBaseInterface>();78// DECL: assert(implTestInheritanceBaseInterface && "`TestInheritanceZDerivedInterface` expected its base interface `TestInheritanceBaseInterface` to be registered");79// DECL: implTestInheritanceMiddleBaseInterface = interfaceMap.lookup<TestInheritanceMiddleBaseInterface>();80// DECL: assert(implTestInheritanceMiddleBaseInterface81// DECL: }82 83// DECL: //===----------------------------------------------------------------===//84// DECL: // Inherited from TestInheritanceBaseInterface85// DECL: //===----------------------------------------------------------------===//86// DECL: operator TestInheritanceBaseInterface () const {87// DECL: return TestInheritanceBaseInterface(*this, getImpl()->implTestInheritanceBaseInterface);88// DECL: }89// DECL: /// some function comment90// DECL: int foo(int input);91 92// DECL: //===----------------------------------------------------------------===//93// DECL: // Inherited from TestInheritanceMiddleBaseInterface94// DECL: //===----------------------------------------------------------------===//95// DECL: operator TestInheritanceMiddleBaseInterface () const {96// DECL: return TestInheritanceMiddleBaseInterface(*this, getImpl()->implTestInheritanceMiddleBaseInterface);97// DECL: }98// DECL: /// some function comment99// DECL: int bar(int input);100 101// DEF: int TestInheritanceZDerivedInterface::foo(int input) {102// DEF-NEXT: getImpl()->implTestInheritanceBaseInterface->foo(getImpl()->implTestInheritanceBaseInterface, getOperation(), input);103 104// DEF: int TestInheritanceZDerivedInterface::bar(int input) {105// DEF-NEXT: return getImpl()->implTestInheritanceMiddleBaseInterface->bar(getImpl()->implTestInheritanceMiddleBaseInterface, getOperation(), input);106 107def TestOpInterface : OpInterface<"TestOpInterface"> {108 let description = [{some op interface description}];109 110 let methods = [111 InterfaceMethod<112 /*desc=*/[{some function comment}],113 /*retTy=*/"int",114 /*methodName=*/"foo",115 /*args=*/(ins "int":$input)116 >,117 InterfaceMethod<118 /*desc=*/[{some function comment}],119 /*retTy=*/"int",120 /*methodName=*/"body_foo",121 /*args=*/(ins "int":$input),122 /*body=*/[{ return 0; }]123 >,124 InterfaceMethod<125 /*desc=*/[{some function comment}],126 /*retTy=*/"int",127 /*methodName=*/"default_foo",128 /*args=*/(ins "int":$input),129 /*body=*/[{}],130 /*defaultBody=*/[{ return 0; }]131 >,132 ];133}134 135def TestOpInterfaceVerify : OpInterface<"TestOpInterfaceVerify"> {136 let verify = [{137 return foo();138 }];139}140 141def TestOpInterfaceVerifyRegion : OpInterface<"TestOpInterfaceVerifyRegion"> {142 let verify = [{143 return foo();144 }];145 let verifyWithRegions = 1;146}147 148// Define Ops with TestOpInterface and149// DeclareOpInterfaceMethods<TestOpInterface> traits to check that there150// are not duplicated C++ classes generated.151def TestDialect : Dialect {152 let name = "test";153}154 155def OpInterfaceOp : Op<TestDialect, "op_interface_op", [TestOpInterface]>;156 157def OpInterfaceInterfacesOp : Op<TestDialect, "op_inherit_interface_op", [TestInheritanceZDerivedInterface]>;158 159def DeclareMethodsOp : Op<TestDialect, "declare_methods_op",160 [DeclareOpInterfaceMethods<TestOpInterface>]>;161 162def DeclareMethodsWithDefaultOp : Op<TestDialect, "declare_methods_op",163 [DeclareOpInterfaceMethods<TestOpInterface, ["default_foo"]>]>;164 165// DECL-LABEL: TestOpInterfaceInterfaceTraits166// DECL: class TestOpInterface : public ::mlir::OpInterface<TestOpInterface, detail::TestOpInterfaceInterfaceTraits>167 168// DECL: /// some function comment169// DECL: int foo(int input);170 171// Trait declarations / definitions come after interface definitions.172// DECL: struct ExtraShardDeclsInterfaceTrait : public173// DECL: bool sharedMethodDeclaration() {174// DECL-NEXT: return (*static_cast<ConcreteOp *>(this)).someOtherMethod();175// DECL-NEXT: }176 177// DECL-LABEL: struct TestOpInterfaceVerifyTrait : public178// DECL: verifyTrait179 180// DECL-LABEL: struct TestOpInterfaceVerifyRegionTrait : public181// DECL: verifyRegionTrait182 183// Method implementations come last, after all class definitions.184// DECL: template<typename ConcreteOp>185// DECL: int detail::TestOpInterfaceInterfaceTraits::Model<ConcreteOp>::foo186 187// OP_DECL-LABEL: class DeclareMethodsOp : public188// OP_DECL: int foo(int input);189// OP_DECL-NOT: int default_foo(int input);190 191// OP_DECL-LABEL: class DeclareMethodsWithDefaultOp : public192// OP_DECL: int foo(int input);193// OP_DECL: int default_foo(int input);194 195// OP_DECL: class OpInterfaceInterfacesOp :196// OP_DECL-SAME: TestInheritanceBaseInterface::Trait, TestInheritanceMiddleBaseInterface::Trait, TestInheritanceZDerivedInterface::Trait197 198// DOCS-LABEL: {{^}}## TestOpInterface (`TestOpInterface`)199// DOCS: some op interface description200 201// DOCS: {{^}}### Methods:202 203// DOCS: {{^}}#### `foo`204// DOCS: some function comment205 206// DOCS: {{^}}#### `body_foo`207// DOCS: some function comment208 209// DOCS: {{^}}#### `default_foo`210// DOCS: some function comment211