// RUN: mlir-tblgen -gen-op-decls -I %S/../../include %s | FileCheck %s --check-prefix=DECL
// RUN: mlir-tblgen -gen-op-defs -I %S/../../include %s | FileCheck %s --check-prefix=DEFS
include "mlir/IR/AttrTypeBase.td"
include "mlir/IR/EnumAttr.td"
include "mlir/IR/OpBase.td"
include "mlir/IR/Properties.td"
def Test_Dialect : Dialect {
let name = "test";
let cppNamespace = "foobar";
}
class NS_Op<string mnemonic, list<Trait> traits = []> :
Op<Test_Dialect, mnemonic, traits>;
def OpWithAttr : NS_Op<"op_with_attr">{
let arguments = (ins AnyAttr:$attr, OptionalAttr<AnyAttr>:$optional);
}
// Test required and optional properties
// ---
def DefaultI64Array : IntArrayProperty<"int64_t"> {
let defaultValue = "::llvm::ArrayRef<int64_t>{}";
let storageTypeValueOverride = "::llvm::SmallVector<int64_t>{}";
}
def OpWithProps : NS_Op<"op_with_props"> {
let arguments = (ins
BoolProperty:$flag,
StringProperty:$string,
ArrayProperty<StringProperty>:$strings,
DefaultValuedProperty<I32Property, "0">:$default_int,
OptionalProperty<I64Property>:$optional,
DefaultI64Array:$intArray
);
}
/// Check that optional arguments to builders only go at the end.
def OpWithSomeOptionalProperties : NS_Op<"op_with_some_optional_props"> {
let arguments = (ins
OptionalProperty<I64Property>:$mustSpecify,
I64Property:$required,
OptionalProperty<StringProperty>:$canOmit,
DefaultValuedProperty<I64Property, "-1">:$canOmit2
);
}
/// Check that the ambiguous attribute protection correctly stops optional properties
/// from getting default argument values in builders.
def OpWithOptionalPropsAndAttrs :
NS_Op<"with_some_optional_props_and_atts"> {
let arguments = (ins
OptionalProperty<BoolProperty>:$mustSpecify,
OptionalAttr<BoolAttr>:$ambiguous,
OptionalAttr<I32Attr>:$canOmit,
OptionalProperty<I32Property>:$canOmitProp
);
}
// DECL: void setAttrAttr(::mlir::Attribute attr)
// DECL-NEXT: getProperties().attr = attr
// DECL: void setOptionalAttr(::mlir::Attribute attr)
// DECL-NEXT: getProperties().optional = attr
// -----
// DECL-LABEL: class OpWithOptionalPropsAndAttrs :
// DECL: static void build(
// DECL-SAME: ::mlir::OpBuilder &odsBuilder,
// DECL-SAME: ::mlir::OperationState &odsState,
// DECL-SAME: /*optional*/std::optional<bool> mustSpecify,
// DECL-SAME: /*optional*/::mlir::BoolAttr ambiguous,
// DECL-SAME: /*optional*/::mlir::IntegerAttr canOmit,
// DECL-SAME: /*optional*/std::optional<int32_t> canOmitProp = std::nullopt);
// -----
// COM: Ensure the struct is set up how we expect
// DECL-LABEL: class OpWithPropsGenericAdaptorBase
// DECL: using flagTy = bool;
// DECL-NEXT: flagTy flag;
// DECL-NEXT: bool getFlag()
// DECL-NEXT: propStorage = this->flag
// DECL-NEXT: return propStorage;
// DECL: void setFlag(bool propValue)
// DECL-NEXT: propStorage = this->flag;
// DECL-NEXT: propStorage = propValue;
// DECL: using stringTy = std::string;
// DECL: llvm::StringRef getString()
// DECL: auto &propStorage = this->string;
// DECL-NEXT: return ::llvm::StringRef{propStorage};
// DECL: using stringsTy = ::llvm::SmallVector<std::string>
// DECL: ::llvm::ArrayRef<std::string> getStrings()
// DECL: using default_intTy = int32_t;
// DECL: default_intTy default_int = 0;
// DECL: intArrayTy intArray = ::llvm::SmallVector<int64_t>{};
// DECL: ::llvm::ArrayRef<int64_t> getIntArray()
// DECL: return ::llvm::ArrayRef<int64_t>{propStorage}
// DECL: void setIntArray(::llvm::ArrayRef<int64_t> propValue)
// DECL: propStorage.assign
// DECL-LABEL: class OpWithProps :
// DECL: setString(::llvm::StringRef newString)
// DECL-NEXT: getProperties().setString(newString)
// DECL: static void build(
// DECL-SAME: ::mlir::OpBuilder &odsBuilder,
// DECL-SAME: ::mlir::OperationState &odsState,
// DECL-SAME: bool flag,
// DECL-SAME: ::llvm::StringRef string,
// DECL-SAME: ::llvm::ArrayRef<std::string> strings,
// DECL-SAME: /*optional*/int32_t default_int = 0,
// DECL-SAME: /*optional*/std::optional<int64_t> optional = std::nullopt,
// DECL-SAME: /*optional*/::llvm::ArrayRef<int64_t> intArray = ::llvm::ArrayRef<int64_t>{});
// DEFS-LABEL: OpWithProps::computePropertiesHash
// DEFS: hash_intArray
// DEFS-NEXT: return ::llvm::hash_value(::llvm::ArrayRef<int64_t>{propStorage})
// DEFS: ::llvm::hash_value(prop.optional)
// DEFS: hash_intArray(prop.intArray)
// -----
// DECL-LABEL: class OpWithSomeOptionalProperties :
// DECL: static void build(
// DECL-SAME: ::mlir::OpBuilder &odsBuilder,
// DECL-SAME: ::mlir::OperationState &odsState,
// DECL-SAME: /*optional*/std::optional<int64_t> mustSpecify,
// DECL-SAME: int64_t required,
// DECL-SAME: /*optional*/std::optional<::llvm::StringRef> canOmit = std::nullopt,
// DECL-SAME: /*optional*/int64_t canOmit2 = -1);