
Add `gen-attr-constraint-decls` and `gen-attr-constraint-defs`, which generate public C++ functions for attribute constraints. The name of the C++ function is specified in the `cppFunctionName` field. This generalize `cppFunctionName` from `TypeConstraint` introduced in https://github.com/llvm/llvm-project/pull/104577 to be usable also in `AttrConstraint`.
63 lines
2.5 KiB
Markdown
63 lines
2.5 KiB
Markdown
# Constraints
|
|
|
|
[TOC]
|
|
|
|
## Attribute / Type Constraints
|
|
|
|
When defining the arguments of an operation in TableGen, users can specify
|
|
either plain attributes/types or use attribute/type constraints to levy
|
|
additional requirements on the attribute value or operand type.
|
|
|
|
```tablegen
|
|
def My_Type1 : MyDialect_Type<"Type1", "type1"> { ... }
|
|
def My_Type2 : MyDialect_Type<"Type2", "type2"> { ... }
|
|
|
|
// Plain type
|
|
let arguments = (ins MyType1:$val);
|
|
// Type constraint
|
|
let arguments = (ins AnyTypeOf<[MyType1, MyType2]>:$val);
|
|
```
|
|
|
|
`AnyTypeOf` is an example for a type constraints. Many useful type constraints
|
|
can be found in `mlir/IR/CommonTypeConstraints.td`. Additional verification
|
|
code is generated for type/attribute constraints. Type constraints can not only
|
|
be used when defining operation arguments, but also when defining type
|
|
parameters.
|
|
|
|
Optionally, C++ functions can be generated, so that type/attribute constraints
|
|
can be checked from C++. The name of the C++ function must be specified in the
|
|
`cppFunctionName` field. If no function name is specified, no C++ function is
|
|
emitted.
|
|
|
|
```tablegen
|
|
// Example: Element type constraint for VectorType
|
|
def Builtin_VectorTypeElementType : AnyTypeOf<[AnyInteger, Index, AnyFloat]> {
|
|
let cppFunctionName = "isValidVectorTypeElementType";
|
|
}
|
|
```
|
|
|
|
The above example tranlates into the following C++ code:
|
|
```c++
|
|
bool isValidVectorTypeElementType(::mlir::Type type) {
|
|
return (((::llvm::isa<::mlir::IntegerType>(type))) || ((::llvm::isa<::mlir::IndexType>(type))) || ((::llvm::isa<::mlir::FloatType>(type))));
|
|
}
|
|
```
|
|
|
|
An extra TableGen rule is needed to emit C++ code for type/attribute
|
|
constraints. This will generate only the declarations/definitions of the
|
|
type/attribute constaraints that are defined in the specified `.td` file, but
|
|
not those that are in included `.td` files.
|
|
|
|
```cmake
|
|
mlir_tablegen(<Your Dialect>TypeConstraints.h.inc -gen-type-constraint-decls)
|
|
mlir_tablegen(<Your Dialect>TypeConstraints.cpp.inc -gen-type-constraint-defs)
|
|
mlir_tablegen(<Your Dialect>AttrConstraints.h.inc -gen-attr-constraint-decls)
|
|
mlir_tablegen(<Your Dialect>AttrConstraints.cpp.inc -gen-attr-constraint-defs)
|
|
```
|
|
|
|
The generated `<Your Dialect>TypeConstraints.h.inc` respectivelly
|
|
`<Your Dialect>AttrConstraints.h.inc` will need to be included whereever you are
|
|
referencing the type/attributes constraint in C++. Note that no C++ namespace
|
|
will be emitted by the code generator. The `#include` statements of the
|
|
`.h.inc`/`.cpp.inc` files should be wrapped in C++ namespaces by the user.
|