// RUN: mlir-tblgen -gen-dialect-decls -I %S/../../include %s | FileCheck %s --check-prefix=DIALECT // RUN: mlir-tblgen -gen-op-decls -I %S/../../include %s | FileCheck %s --check-prefix=OP // RUN: mlir-tblgen -gen-typedef-decls -I %S/../../include %s | FileCheck %s --check-prefix=TYPE // RUN: mlir-tblgen -gen-attrdef-decls -I %S/../../include %s | FileCheck %s --check-prefix=ATTR // RUN: mlir-tblgen -gen-attr-interface-decls -I %S/../../include %s | FileCheck %s --check-prefix=ATTR-INTERFACE // RUN: mlir-tblgen -gen-op-interface-decls -I %S/../../include %s | FileCheck %s --check-prefix=OP-INTERFACE // RUN: mlir-tblgen -gen-type-interface-decls -I %S/../../include %s | FileCheck %s --check-prefix=TYPE-INTERFACE // RUN: mlir-tblgen -gen-enum-decls -I %S/../../include %s | FileCheck %s --check-prefix=ENUM include "mlir/IR/AttrTypeBase.td" include "mlir/IR/EnumAttr.td" include "mlir/IR/OpBase.td" // check dialect with summary and description def A_Dialect : Dialect { let name = "a"; let cppNamespace = ""; let summary = "This is a summary"; let description = [{ This is a description, needs trimming }]; // DIALECT: /// This is a summary // DIALECT-NEXT: /// This is a description, needs trimming // DIALECT-NEXT: class ADialect : public ::mlir::Dialect { } def A_SomeOp1 : Op{ let summary = "Some Op1 summary line1 \nsummary line2"; let description = [{ Some Op1 description }]; let cppNamespace = "OP1"; // OP: namespace OP1 // OP-NEXT: /// Some Op1 summary line1 // OP-NEXT: /// summary line2 // OP-NEXT: /// Some Op1 description // OP-NEXT: class SomeOp1; } // test weird characters in description def A_SomeOp2 : Op{ let summary = ""; let description = [{ $ptr (`,` $mask^)? (`,` $other^)? oilist( `a` `=` $1 | `b` `=` $2 ) }]; // OP: /// $ptr (`,` $mask^)? (`,` $other^)? // OP-NEXT: /// oilist( // OP-NEXT: /// `a` `=` $1 | `b` `=` $2 // OP-NEXT: /// ) // OP-NEXT: class SomeOp2; } def A_TensorType : TypeDef { let typeName = "a.simple_a_tensor"; let summary = "Tensor Type A summary"; let description = [{ Tensor Type A description }]; let extraClassDeclaration = [{ void getSignlessBlockType() const { } }]; // TYPE: /// Tensor Type A summary // TYPE-NEXT: /// Tensor Type A description // TYPE-NEXT: class TensorType; } def A_SimpleAttr : AttrDef { let attrName = "a.simple_attr"; let summary = "Simple Attr A summary"; let description = [{ Simple Attr A description }]; // ATTR: /// Simple Attr A summary // ATTR-NEXT: /// Simple Attr A description // ATTR-NEXT: class SimpleAAttr; } def EncodingTrait : AttrInterface<"EncodingTrait"> { let cppNamespace = "mlir::a::traits"; let description = [{ Common trait for all layouts. }]; let methods = [ ]; // ATTR-INTERFACE: namespace mlir::a::traits { // ATTR-INTERFACE-NEXT: /// Common trait for all layouts. // ATTR-INTERFACE-NEXT: class EncodingTrait; } def SimpleEncodingTrait : AttrInterface<"SimpleEncodingTrait"> { let cppNamespace = "a::traits"; // ATTR-INTERFACE: namespace a::traits { // ATTR-INTERFACE-NEXT: class SimpleEncodingTrait; } def SimpleOpInterface : OpInterface<"SimpleOpInterface"> { let cppNamespace = "a::traits"; let description = [{ Simple Op Interface description }]; // OP-INTERFACE: namespace a::traits { // OP-INTERFACE-NEXT: /// Simple Op Interface description // OP-INTERFACE-NEXT: class SimpleOpInterface; } def SimpleTypeInterface : TypeInterface<"SimpleTypeInterface"> { let description = [{ Simple Type Interface description }]; // TYPE-INTERFACE: /// Simple Type Interface description // TYPE-INTERFACE-NEXT: class SimpleTypeInterface; } def MyBitEnum: I32BitEnumAttr<"MyBitEnum", "An example bit enum", [I32BitEnumCaseBit<"Bit0", 0, "tagged">, I32BitEnumCaseBit<"Bit1", 1>]> { let genSpecializedAttr = 0; // ENUM: // An example bit enum // ENUM-NEXT: enum class MyBitEnum }