194662ee0SRiver Riddle //===- Trait.h - Trait wrapper class ----------------------------*- C++ -*-===// 294662ee0SRiver Riddle // 394662ee0SRiver Riddle // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 494662ee0SRiver Riddle // See https://llvm.org/LICENSE.txt for license information. 594662ee0SRiver Riddle // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 694662ee0SRiver Riddle // 794662ee0SRiver Riddle //===----------------------------------------------------------------------===// 894662ee0SRiver Riddle // 994662ee0SRiver Riddle // Trait wrapper to simplify using TableGen Record defining an MLIR Trait. 1094662ee0SRiver Riddle // 1194662ee0SRiver Riddle //===----------------------------------------------------------------------===// 1294662ee0SRiver Riddle 1394662ee0SRiver Riddle #ifndef MLIR_TABLEGEN_TRAIT_H_ 1494662ee0SRiver Riddle #define MLIR_TABLEGEN_TRAIT_H_ 1594662ee0SRiver Riddle 1694662ee0SRiver Riddle #include "mlir/Support/LLVM.h" 1794662ee0SRiver Riddle #include "llvm/ADT/StringRef.h" 1894662ee0SRiver Riddle #include <vector> 1994662ee0SRiver Riddle 2094662ee0SRiver Riddle namespace llvm { 2194662ee0SRiver Riddle class Init; 2294662ee0SRiver Riddle class Record; 23be0a7e9fSMehdi Amini } // namespace llvm 2494662ee0SRiver Riddle 2594662ee0SRiver Riddle namespace mlir { 2694662ee0SRiver Riddle namespace tblgen { 2794662ee0SRiver Riddle 2894662ee0SRiver Riddle class Interface; 2994662ee0SRiver Riddle 3094662ee0SRiver Riddle // Wrapper class with helper methods for accessing Trait constraints defined in 3194662ee0SRiver Riddle // TableGen. 3294662ee0SRiver Riddle class Trait { 3394662ee0SRiver Riddle public: 3494662ee0SRiver Riddle // Discriminator for kinds of traits. 3594662ee0SRiver Riddle enum class Kind { 3694662ee0SRiver Riddle // Trait corresponding to C++ class. 3794662ee0SRiver Riddle Native, 3894662ee0SRiver Riddle // Trait corresponding to a predicate. 3994662ee0SRiver Riddle Pred, 4094662ee0SRiver Riddle // Trait controlling definition generator internals. 4194662ee0SRiver Riddle Internal, 4294662ee0SRiver Riddle // Trait corresponding to an Interface. 4394662ee0SRiver Riddle Interface 4494662ee0SRiver Riddle }; 4594662ee0SRiver Riddle 4694662ee0SRiver Riddle explicit Trait(Kind kind, const llvm::Record *def); 4794662ee0SRiver Riddle 4894662ee0SRiver Riddle // Returns an Trait corresponding to the init provided. 4994662ee0SRiver Riddle static Trait create(const llvm::Init *init); 5094662ee0SRiver Riddle getKind()5194662ee0SRiver Riddle Kind getKind() const { return kind; } 5294662ee0SRiver Riddle 5394662ee0SRiver Riddle // Returns the Tablegen definition this operator was constructed from. getDef()5494662ee0SRiver Riddle const llvm::Record &getDef() const { return *def; } 5594662ee0SRiver Riddle 5694662ee0SRiver Riddle protected: 5794662ee0SRiver Riddle // The TableGen definition of this trait. 5894662ee0SRiver Riddle const llvm::Record *def; 5994662ee0SRiver Riddle Kind kind; 6094662ee0SRiver Riddle }; 6194662ee0SRiver Riddle 6294662ee0SRiver Riddle // Trait corresponding to a native C++ Trait. 6394662ee0SRiver Riddle class NativeTrait : public Trait { 6494662ee0SRiver Riddle public: 6594662ee0SRiver Riddle // Returns the trait corresponding to a C++ trait class. 6694662ee0SRiver Riddle std::string getFullyQualifiedTraitName() const; 6794662ee0SRiver Riddle 689445b396SChia-hung Duan // Returns if this is a structural op trait. 699445b396SChia-hung Duan bool isStructuralOpTrait() const; 709445b396SChia-hung Duan 71*47b0a9b9SAmanda Tang // Returns extra class declaration code to be added to the concrete instance 72*47b0a9b9SAmanda Tang // when the trait is specified 73*47b0a9b9SAmanda Tang StringRef getExtraConcreteClassDeclaration() const; 74*47b0a9b9SAmanda Tang 75*47b0a9b9SAmanda Tang // Returns extra class definition code to be added to the concrete instance 76*47b0a9b9SAmanda Tang // when the trait is specified 77*47b0a9b9SAmanda Tang StringRef getExtraConcreteClassDefinition() const; 78*47b0a9b9SAmanda Tang classof(const Trait * t)7994662ee0SRiver Riddle static bool classof(const Trait *t) { return t->getKind() == Kind::Native; } 8094662ee0SRiver Riddle }; 8194662ee0SRiver Riddle 8294662ee0SRiver Riddle // Trait corresponding to a predicate on the operation. 8394662ee0SRiver Riddle class PredTrait : public Trait { 8494662ee0SRiver Riddle public: 8594662ee0SRiver Riddle // Returns the template for constructing the predicate. 8694662ee0SRiver Riddle std::string getPredTemplate() const; 8794662ee0SRiver Riddle 8894662ee0SRiver Riddle // Returns the description of what the predicate is verifying. 8994662ee0SRiver Riddle StringRef getSummary() const; 9094662ee0SRiver Riddle classof(const Trait * t)9194662ee0SRiver Riddle static bool classof(const Trait *t) { return t->getKind() == Kind::Pred; } 9294662ee0SRiver Riddle }; 9394662ee0SRiver Riddle 9494662ee0SRiver Riddle // Trait controlling op definition generator internals. 9594662ee0SRiver Riddle class InternalTrait : public Trait { 9694662ee0SRiver Riddle public: 9794662ee0SRiver Riddle // Returns the trait controlling op definition generator internals. 9894662ee0SRiver Riddle StringRef getFullyQualifiedTraitName() const; 9994662ee0SRiver Riddle classof(const Trait * t)10094662ee0SRiver Riddle static bool classof(const Trait *t) { return t->getKind() == Kind::Internal; } 10194662ee0SRiver Riddle }; 10294662ee0SRiver Riddle 10394662ee0SRiver Riddle // Trait corresponding to an OpInterface on the operation. 10494662ee0SRiver Riddle class InterfaceTrait : public Trait { 10594662ee0SRiver Riddle public: 10694662ee0SRiver Riddle // Returns interface corresponding to the trait. 10794662ee0SRiver Riddle Interface getInterface() const; 10894662ee0SRiver Riddle 10994662ee0SRiver Riddle // Returns the trait corresponding to a C++ trait class. 11094662ee0SRiver Riddle std::string getFullyQualifiedTraitName() const; 11194662ee0SRiver Riddle classof(const Trait * t)11294662ee0SRiver Riddle static bool classof(const Trait *t) { 11394662ee0SRiver Riddle return t->getKind() == Kind::Interface; 11494662ee0SRiver Riddle } 11594662ee0SRiver Riddle 11694662ee0SRiver Riddle // Whether the declaration of methods for this trait should be emitted. 11794662ee0SRiver Riddle bool shouldDeclareMethods() const; 11894662ee0SRiver Riddle 11994662ee0SRiver Riddle // Returns the methods that should always be declared if this interface is 12094662ee0SRiver Riddle // emitting declarations. 12194662ee0SRiver Riddle std::vector<StringRef> getAlwaysDeclaredMethods() const; 12294662ee0SRiver Riddle }; 12394662ee0SRiver Riddle 124be0a7e9fSMehdi Amini } // namespace tblgen 125be0a7e9fSMehdi Amini } // namespace mlir 12694662ee0SRiver Riddle 12794662ee0SRiver Riddle #endif // MLIR_TABLEGEN_TRAIT_H_ 128