xref: /llvm-project/mlir/include/mlir/TableGen/Trait.h (revision 47b0a9b9311ffdaab511c240de89b5da75b1252b)
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