brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.8 KiB · aa71bad Raw
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