This is a new ODS feature that allows dialects to define a list of
key/value pair representing an attribute type and a name.
This will generate helper classes on the dialect to be able to
manage discardable attributes on operations in a type safe way.
For example the `test` dialect can define:
```
let discardableAttrs = (ins
"mlir::IntegerAttr":$discardable_attr_key,
);
```
And the following will be generated in the TestDialect class:
```
/// Helper to manage the discardable attribute `discardable_attr_key`.
class DiscardableAttrKeyAttrHelper {
::mlir::StringAttr name;
public:
static constexpr ::llvm::StringLiteral getNameStr() {
return "test.discardable_attr_key";
}
constexpr ::mlir::StringAttr getName() {
return name;
}
DiscardableAttrKeyAttrHelper(::mlir::MLIRContext *ctx)
: name(::mlir::StringAttr::get(ctx, getNameStr())) {}
mlir::IntegerAttr getAttr(::mlir::Operation *op) {
return op->getAttrOfType<mlir::IntegerAttr>(name);
}
void setAttr(::mlir::Operation *op, mlir::IntegerAttr val) {
op->setAttr(name, val);
}
bool isAttrPresent(::mlir::Operation *op) {
return op->hasAttrOfType<mlir::IntegerAttr>(name);
}
void removeAttr(::mlir::Operation *op) {
assert(op->hasAttrOfType<mlir::IntegerAttr>(name));
op->removeAttr(name);
}
};
DiscardableAttrKeyAttrHelper getDiscardableAttrKeyAttrHelper() {
return discardableAttrKeyAttrName;
}
```
User code having an instance of the TestDialect can then manipulate this
attribute on operation using:
```
auto helper = testDialect.getDiscardableAttrKeyAttrHelper();
helper.setAttr(op, value);
helper.isAttrPresent(op);
...
```
57 lines
1.8 KiB
TableGen
57 lines
1.8 KiB
TableGen
//===-- TestDialect.td - Test dialect definition -----------*- tablegen -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef TEST_DIALECT
|
|
#define TEST_DIALECT
|
|
|
|
include "mlir/IR/OpBase.td"
|
|
|
|
def Test_Dialect : Dialect {
|
|
let name = "test";
|
|
let cppNamespace = "::test";
|
|
let hasCanonicalizer = 1;
|
|
let hasConstantMaterializer = 1;
|
|
let hasOperationAttrVerify = 1;
|
|
let hasRegionArgAttrVerify = 1;
|
|
let hasRegionResultAttrVerify = 1;
|
|
let hasOperationInterfaceFallback = 1;
|
|
let hasNonDefaultDestructor = 1;
|
|
let useDefaultTypePrinterParser = 0;
|
|
let useDefaultAttributePrinterParser = 1;
|
|
let isExtensible = 1;
|
|
let dependentDialects = ["::mlir::DLTIDialect"];
|
|
let discardableAttrs = (ins
|
|
"mlir::IntegerAttr":$discardable_attr_key,
|
|
"SimpleAAttr":$other_discardable_attr_key
|
|
);
|
|
|
|
let extraClassDeclaration = [{
|
|
void registerAttributes();
|
|
void registerInterfaces();
|
|
void registerTypes();
|
|
void registerOpsSyntax();
|
|
|
|
// Provides a custom printing/parsing for some operations.
|
|
::std::optional<ParseOpHook>
|
|
getParseOperationHook(::llvm::StringRef opName) const override;
|
|
::llvm::unique_function<void(::mlir::Operation *,
|
|
::mlir::OpAsmPrinter &printer)>
|
|
getOperationPrinter(::mlir::Operation *op) const override;
|
|
|
|
::mlir::Type parseType(::mlir::DialectAsmParser &parser) const override;
|
|
void printType(::mlir::Type type,
|
|
::mlir::DialectAsmPrinter &printer) const override;
|
|
|
|
private:
|
|
// Storage for a custom fallback interface.
|
|
void *fallbackEffectOpInterfaces;
|
|
}];
|
|
}
|
|
|
|
#endif // TEST_DIALECT
|