| //===- Trait.h - Trait wrapper class ----------------------------*- C++ -*-===// |
| // |
| // 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 |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // Trait wrapper to simplify using TableGen Record defining an MLIR Trait. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef MLIR_TABLEGEN_TRAIT_H_ |
| #define MLIR_TABLEGEN_TRAIT_H_ |
| |
| #include "mlir/Support/LLVM.h" |
| #include "llvm/ADT/StringRef.h" |
| #include <vector> |
| |
| namespace llvm { |
| class Init; |
| class Record; |
| } // end namespace llvm |
| |
| namespace mlir { |
| namespace tblgen { |
| |
| class Interface; |
| |
| // Wrapper class with helper methods for accessing Trait constraints defined in |
| // TableGen. |
| class Trait { |
| public: |
| // Discriminator for kinds of traits. |
| enum class Kind { |
| // Trait corresponding to C++ class. |
| Native, |
| // Trait corresponding to a predicate. |
| Pred, |
| // Trait controlling definition generator internals. |
| Internal, |
| // Trait corresponding to an Interface. |
| Interface |
| }; |
| |
| explicit Trait(Kind kind, const llvm::Record *def); |
| |
| // Returns an Trait corresponding to the init provided. |
| static Trait create(const llvm::Init *init); |
| |
| Kind getKind() const { return kind; } |
| |
| // Returns the Tablegen definition this operator was constructed from. |
| const llvm::Record &getDef() const { return *def; } |
| |
| protected: |
| // The TableGen definition of this trait. |
| const llvm::Record *def; |
| Kind kind; |
| }; |
| |
| // Trait corresponding to a native C++ Trait. |
| class NativeTrait : public Trait { |
| public: |
| // Returns the trait corresponding to a C++ trait class. |
| std::string getFullyQualifiedTraitName() const; |
| |
| static bool classof(const Trait *t) { return t->getKind() == Kind::Native; } |
| }; |
| |
| // Trait corresponding to a predicate on the operation. |
| class PredTrait : public Trait { |
| public: |
| // Returns the template for constructing the predicate. |
| std::string getPredTemplate() const; |
| |
| // Returns the description of what the predicate is verifying. |
| StringRef getSummary() const; |
| |
| static bool classof(const Trait *t) { return t->getKind() == Kind::Pred; } |
| }; |
| |
| // Trait controlling op definition generator internals. |
| class InternalTrait : public Trait { |
| public: |
| // Returns the trait controlling op definition generator internals. |
| StringRef getFullyQualifiedTraitName() const; |
| |
| static bool classof(const Trait *t) { return t->getKind() == Kind::Internal; } |
| }; |
| |
| // Trait corresponding to an OpInterface on the operation. |
| class InterfaceTrait : public Trait { |
| public: |
| // Returns interface corresponding to the trait. |
| Interface getInterface() const; |
| |
| // Returns the trait corresponding to a C++ trait class. |
| std::string getFullyQualifiedTraitName() const; |
| |
| static bool classof(const Trait *t) { |
| return t->getKind() == Kind::Interface; |
| } |
| |
| // Whether the declaration of methods for this trait should be emitted. |
| bool shouldDeclareMethods() const; |
| |
| // Returns the methods that should always be declared if this interface is |
| // emitting declarations. |
| std::vector<StringRef> getAlwaysDeclaredMethods() const; |
| }; |
| |
| } // end namespace tblgen |
| } // end namespace mlir |
| |
| #endif // MLIR_TABLEGEN_TRAIT_H_ |