xref: /llvm-project/mlir/include/mlir/TableGen/Constraint.h (revision a3d41879ecf5690a73f9226951d3856c7faa34a4)
1 //===- Constraint.h - Constraint class --------------------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // Constraint wrapper to simplify using TableGen Record for constraints.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #ifndef MLIR_TABLEGEN_CONSTRAINT_H_
14 #define MLIR_TABLEGEN_CONSTRAINT_H_
15 
16 #include "mlir/Support/LLVM.h"
17 #include "mlir/TableGen/Predicate.h"
18 #include "llvm/ADT/SmallVector.h"
19 #include "llvm/ADT/StringRef.h"
20 
21 namespace llvm {
22 class Record;
23 } // namespace llvm
24 
25 namespace mlir {
26 namespace tblgen {
27 
28 // Wrapper class with helper methods for accessing Constraint defined in
29 // TableGen.
30 class Constraint {
31 public:
32   // Constraint kind
33   enum Kind { CK_Attr, CK_Region, CK_Successor, CK_Type, CK_Uncategorized };
34 
35   // Create a constraint with a TableGen definition and a kind.
36   Constraint(const llvm::Record *record, Kind kind) : def(record), kind(kind) {}
37   // Create a constraint with a TableGen definition, and infer the kind.
38   Constraint(const llvm::Record *record);
39 
40   /// Constraints are pointer-comparable.
41   bool operator==(const Constraint &that) { return def == that.def; }
42   bool operator!=(const Constraint &that) { return def != that.def; }
43 
44   // Returns the predicate for this constraint.
45   Pred getPredicate() const;
46 
47   // Returns the condition template that can be used to check if a type or
48   // attribute satisfies this constraint.  The template may contain "{0}" that
49   // must be substituted with an expression returning an mlir::Type or
50   // mlir::Attribute.
51   std::string getConditionTemplate() const;
52 
53   // Returns the user-readable summary of this constraint. If the summary is not
54   // provided, returns the TableGen def name.
55   StringRef getSummary() const;
56 
57   // Returns the long-form description of this constraint. If the description is
58   // not provided, returns an empty string.
59   StringRef getDescription() const;
60 
61   /// Returns the name of the TablGen def of this constraint. In some cases
62   /// where the current def is anonymous, the name of the base def is used (e.g.
63   /// `std::optional<>`/`Variadic<>` type constraints).
64   StringRef getDefName() const;
65 
66   /// Returns a unique name for the TablGen def of this constraint. This is
67   /// generally just the name of the def, but in some cases where the current
68   /// def is anonymous, the name of the base def is attached (to provide more
69   /// context on the def).
70   std::string getUniqueDefName() const;
71 
72   /// Returns the name of the C++ function that should be generated for this
73   /// constraint, or std::nullopt if no C++ function should be generated.
74   std::optional<StringRef> getCppFunctionName() const;
75 
76   Kind getKind() const { return kind; }
77 
78   /// Return the underlying def.
79   const llvm::Record &getDef() const { return *def; }
80 
81 protected:
82   // The TableGen definition of this constraint.
83   const llvm::Record *def;
84 
85 private:
86   /// Return the name of the base def if there is one, or std::nullopt
87   /// otherwise.
88   std::optional<StringRef> getBaseDefName() const;
89 
90   // What kind of constraint this is.
91   Kind kind;
92 };
93 
94 // An constraint and the concrete entities to place the constraint on.
95 struct AppliedConstraint {
96   AppliedConstraint(Constraint &&constraint, StringRef self,
97                     std::vector<std::string> &&entities);
98 
99   Constraint constraint;
100   // The symbol to replace `$_self` special placeholder in the constraint.
101   std::string self;
102   // The symbols to replace `$N` positional placeholders in the constraint.
103   std::vector<std::string> entities;
104 };
105 
106 } // namespace tblgen
107 } // namespace mlir
108 
109 namespace llvm {
110 /// Unique constraints by their predicate and summary. Constraints that share
111 /// the same predicate may have different descriptions; ensure that the
112 /// correct error message is reported when verification fails.
113 template <>
114 struct DenseMapInfo<mlir::tblgen::Constraint> {
115   using RecordDenseMapInfo = llvm::DenseMapInfo<const llvm::Record *>;
116 
117   static mlir::tblgen::Constraint getEmptyKey();
118   static mlir::tblgen::Constraint getTombstoneKey();
119   static unsigned getHashValue(mlir::tblgen::Constraint constraint);
120   static bool isEqual(mlir::tblgen::Constraint lhs,
121                       mlir::tblgen::Constraint rhs);
122 };
123 } // namespace llvm
124 
125 #endif // MLIR_TABLEGEN_CONSTRAINT_H_
126