//===-- Traits.td - Trait definations file ------------------*- 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 definations for traits.
//
//===----------------------------------------------------------------------===//
#ifndef TRAITS_TD
#define TRAITS_TD
include "mlir/IR/Constraints.td"
//===----------------------------------------------------------------------===//
// Trait definitions
//===----------------------------------------------------------------------===//
// Trait represents a trait regarding an attribute, operation, or type.
class Trait;
// Define a Trait corresponding to a list of Traits, this allows for specifying
// a list of traits as trait. Avoids needing to do `[Traits, ...] # ListOfTraits
// # [Others, ...]` while still allowing providing convenient groupings.
class TraitList<list<Trait> props> : Trait {
list<Trait> traits = props;
}
// NativeTrait corresponds to the MLIR C++ trait mechanism. The purpose to wrap
// around C++ symbol string with this class is to make traits specified for
// entities in TableGen less alien and more integrated.
// `extraConcreteClassDeclaration` and `extraConcreteClassDefinition` code
// get injected into the entities in which the NativeTrait is specified for.
class NativeTrait<string name, string entityType,
code extraClassDeclaration = [{}],
code extraClassDefinition = [{}]> : Trait {
string trait = name;
string cppNamespace = "::mlir::" # entityType # "Trait";
code extraConcreteClassDeclaration = extraClassDeclaration;
code extraConcreteClassDefinition = extraClassDefinition;
}
// ParamNativeTrait corresponds to the template-parameterized traits in the C++
// implementation. MLIR uses nested class templates to implement such traits
// leading to constructs of the form "TraitName<Parameters>::Impl". Use the
// value in `prop` as the trait name and the value in `params` as parameters to
// construct the native trait class name.
class ParamNativeTrait<string prop, string params, string entityType>
: NativeTrait<prop # "<" # params # ">::Impl", entityType>;
// GenInternalTrait is a trait that does not have direct C++ mapping but affects
// an entities definition generator internals, like how operation builders and
// operand/attribute/result getters are generated.
class GenInternalTrait<string prop, string entityType> : Trait {
string trait = "::mlir::" # entityType # "Trait::" # prop;
}
// PredTrait is a trait implemented by way of a predicate on an entity.
class PredTrait<string descr, Pred pred> : Trait {
string summary = descr;
Pred predicate = pred;
}
#endif // TRAITS_TD