blob: 9ee90513cdda3a0f6a2e5002b5829257b0c15f14 [file] [log] [blame]
//===-- SubElementInterfaces.td - Sub-Element Interfaces ---*- 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
//
//===----------------------------------------------------------------------===//
//
// This file contains a set of interfaces that can be used to interface with
// sub-elements, e.g. held attributes and types, of a composite attribute or
// type.
//
//===----------------------------------------------------------------------===//
#ifndef MLIR_IR_SUBELEMENTINTERFACES_TD_
#define MLIR_IR_SUBELEMENTINTERFACES_TD_
include "mlir/IR/OpBase.td"
//===----------------------------------------------------------------------===//
// SubElementInterfaceBase
//===----------------------------------------------------------------------===//
class SubElementInterfaceBase<string interfaceName, string derivedValue> {
string cppNamespace = "::mlir";
list<InterfaceMethod> methods = [
InterfaceMethod<
/*desc=*/[{
Walk all of the immediately nested sub-attributes and sub-types. This
method does not recurse into sub elements.
}], "void", "walkImmediateSubElements",
(ins "llvm::function_ref<void(mlir::Attribute)>":$walkAttrsFn,
"llvm::function_ref<void(mlir::Type)>":$walkTypesFn)
>,
InterfaceMethod<
/*desc=*/[{
Replace the attributes identified by the indices with the corresponding
value. The index is derived from the order of the attributes returned by
the attribute callback of `walkImmediateSubElements`. An index of 0 would
replace the very first attribute given by `walkImmediateSubElements`.
The new instance with the values replaced is returned.
}], cppNamespace # "::" # interfaceName, "replaceImmediateSubAttribute",
(ins "::llvm::ArrayRef<std::pair<size_t, ::mlir::Attribute>>":$replacements),
[{}],
/*defaultImplementation=*/[{
llvm_unreachable("Attribute or Type does not support replacing attributes");
}]
>,
];
code extraClassDeclaration = [{
/// Walk all of the held sub-attributes.
void walkSubAttrs(llvm::function_ref<void(mlir::Attribute)> walkFn) {
walkSubElements(walkFn, /*walkTypesFn=*/[](mlir::Type) {});
}
/// Walk all of the held sub-types.
void walkSubTypes(llvm::function_ref<void(mlir::Type)> walkFn) {
walkSubElements(/*walkAttrsFn=*/[](mlir::Attribute) {}, walkFn);
}
/// Walk all of the held sub-attributes and sub-types.
void walkSubElements(llvm::function_ref<void(mlir::Attribute)> walkAttrsFn,
llvm::function_ref<void(mlir::Type)> walkTypesFn);
}];
code extraTraitClassDeclaration = [{
/// Walk all of the held sub-attributes.
void walkSubAttrs(llvm::function_ref<void(mlir::Attribute)> walkFn) {
walkSubElements(walkFn, /*walkTypesFn=*/[](mlir::Type) {});
}
/// Walk all of the held sub-types.
void walkSubTypes(llvm::function_ref<void(mlir::Type)> walkFn) {
walkSubElements(/*walkAttrsFn=*/[](mlir::Attribute) {}, walkFn);
}
/// Walk all of the held sub-attributes and sub-types.
void walkSubElements(llvm::function_ref<void(mlir::Attribute)> walkAttrsFn,
llvm::function_ref<void(mlir::Type)> walkTypesFn) {
}] # interfaceName # " interface(" # derivedValue # [{);
interface.walkSubElements(walkAttrsFn, walkTypesFn);
}
}];
}
//===----------------------------------------------------------------------===//
// SubElementAttrInterface
//===----------------------------------------------------------------------===//
def SubElementAttrInterface
: AttrInterface<"SubElementAttrInterface">,
SubElementInterfaceBase<"SubElementAttrInterface", "$_attr"> {
let description = [{
An interface used to query and manipulate sub-elements, such as sub-types
and sub-attributes of a composite attribute.
}];
}
//===----------------------------------------------------------------------===//
// SubElementTypeInterface
//===----------------------------------------------------------------------===//
def SubElementTypeInterface
: TypeInterface<"SubElementTypeInterface">,
SubElementInterfaceBase<"SubElementTypeInterface", "$_type"> {
let description = [{
An interface used to query and manipulate sub-elements, such as sub-types
and sub-attributes of a composite type.
}];
}
#endif // MLIR_IR_SUBELEMENTINTERFACES_TD_