xref: /llvm-project/mlir/include/mlir/TableGen/AttrOrTypeDef.h (revision e768b076e3b7ed38485a29244a0b989076e4b131)
1 //===-- AttrOrTypeDef.h - Wrapper for attr and type definitions -*- 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 // AttrOrTypeDef, AttrDef, and TypeDef wrappers to simplify using TableGen
10 // Record defining a MLIR attributes and types.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #ifndef MLIR_TABLEGEN_ATTRORTYPEDEF_H
15 #define MLIR_TABLEGEN_ATTRORTYPEDEF_H
16 
17 #include "mlir/Support/LLVM.h"
18 #include "mlir/TableGen/Builder.h"
19 #include "mlir/TableGen/Constraint.h"
20 #include "mlir/TableGen/Trait.h"
21 
22 namespace llvm {
23 class DagInit;
24 class Record;
25 class SMLoc;
26 } // namespace llvm
27 
28 namespace mlir {
29 namespace tblgen {
30 class Dialect;
31 
32 //===----------------------------------------------------------------------===//
33 // AttrOrTypeBuilder
34 //===----------------------------------------------------------------------===//
35 
36 /// Wrapper class that represents a Tablegen AttrOrTypeBuilder.
37 class AttrOrTypeBuilder : public Builder {
38 public:
39   using Builder::Builder;
40 
41   /// Returns an optional builder return type.
42   std::optional<StringRef> getReturnType() const;
43 
44   /// Returns true if this builder is able to infer the MLIRContext parameter.
45   bool hasInferredContextParameter() const;
46 };
47 
48 //===----------------------------------------------------------------------===//
49 // AttrOrTypeParameter
50 //===----------------------------------------------------------------------===//
51 
52 /// A wrapper class for tblgen AttrOrTypeParameter, arrays of which belong to
53 /// AttrOrTypeDefs to parameterize them.
54 class AttrOrTypeParameter {
55 public:
56   explicit AttrOrTypeParameter(const llvm::DagInit *def, unsigned index)
57       : def(def), index(index) {}
58 
59   /// Returns true if the parameter is anonymous (has no name).
60   bool isAnonymous() const;
61 
62   /// Get the parameter name.
63   StringRef getName() const;
64 
65   /// Get the parameter accessor name.
66   std::string getAccessorName() const;
67 
68   /// If specified, get the custom allocator code for this parameter.
69   std::optional<StringRef> getAllocator() const;
70 
71   /// If specified, get the custom comparator code for this parameter.
72   StringRef getComparator() const;
73 
74   /// Get the C++ type of this parameter.
75   StringRef getCppType() const;
76 
77   /// Get the C++ accessor type of this parameter.
78   StringRef getCppAccessorType() const;
79 
80   /// Get the C++ storage type of this parameter.
81   StringRef getCppStorageType() const;
82 
83   /// Get the C++ code to convert from the storage type to the parameter type.
84   StringRef getConvertFromStorage() const;
85 
86   /// Get an optional C++ parameter parser.
87   std::optional<StringRef> getParser() const;
88 
89   /// If this is a type constraint, return it.
90   std::optional<Constraint> getConstraint() const;
91 
92   /// Get an optional C++ parameter printer.
93   std::optional<StringRef> getPrinter() const;
94 
95   /// Get a description of this parameter for documentation purposes.
96   std::optional<StringRef> getSummary() const;
97 
98   /// Get the assembly syntax documentation.
99   StringRef getSyntax() const;
100 
101   /// Returns true if the parameter is optional.
102   bool isOptional() const;
103 
104   /// Get the default value of the parameter if it has one.
105   std::optional<StringRef> getDefaultValue() const;
106 
107   /// Return the underlying def of this parameter.
108   const llvm::Init *getDef() const;
109 
110   /// The parameter is pointer-comparable.
111   bool operator==(const AttrOrTypeParameter &other) const {
112     return def == other.def && index == other.index;
113   }
114   bool operator!=(const AttrOrTypeParameter &other) const {
115     return !(*this == other);
116   }
117 
118 private:
119   /// A parameter can be either a string or a def. Get a potentially null value
120   /// from the def.
121   template <typename InitT>
122   auto getDefValue(StringRef name) const;
123 
124   /// The underlying tablegen parameter list this parameter is a part of.
125   const llvm::DagInit *def;
126   /// The index of the parameter within the parameter list (`def`).
127   unsigned index;
128 };
129 
130 //===----------------------------------------------------------------------===//
131 // AttributeSelfTypeParameter
132 //===----------------------------------------------------------------------===//
133 
134 // A wrapper class for the AttributeSelfTypeParameter tblgen class. This
135 // represents a parameter of mlir::Type that is the value type of an AttrDef.
136 class AttributeSelfTypeParameter : public AttrOrTypeParameter {
137 public:
138   static bool classof(const AttrOrTypeParameter *param);
139 };
140 
141 //===----------------------------------------------------------------------===//
142 // AttrOrTypeDef
143 //===----------------------------------------------------------------------===//
144 
145 /// Wrapper class that contains a TableGen AttrOrTypeDef's record and provides
146 /// helper methods for accessing them.
147 class AttrOrTypeDef {
148 public:
149   explicit AttrOrTypeDef(const llvm::Record *def);
150 
151   /// Get the dialect for which this def belongs.
152   Dialect getDialect() const;
153 
154   /// Returns the name of this AttrOrTypeDef record.
155   StringRef getName() const;
156 
157   /// Query functions for the documentation of the def.
158   bool hasDescription() const;
159   StringRef getDescription() const;
160   bool hasSummary() const;
161   StringRef getSummary() const;
162 
163   /// Returns the name of the C++ class to generate.
164   StringRef getCppClassName() const;
165 
166   /// Returns the name of the C++ base class to use when generating this def.
167   StringRef getCppBaseClassName() const;
168 
169   /// Returns the name of the storage class for this def.
170   StringRef getStorageClassName() const;
171 
172   /// Returns the C++ namespace for this def's storage class.
173   StringRef getStorageNamespace() const;
174 
175   /// Returns true if we should generate the storage class.
176   bool genStorageClass() const;
177 
178   /// Indicates whether or not to generate the storage class constructor.
179   bool hasStorageCustomConstructor() const;
180 
181   /// Get the parameters of this attribute or type.
182   ArrayRef<AttrOrTypeParameter> getParameters() const { return parameters; }
183 
184   /// Return the number of parameters
185   unsigned getNumParameters() const;
186 
187   /// Return the keyword/mnemonic to use in the printer/parser methods if we are
188   /// supposed to auto-generate them.
189   std::optional<StringRef> getMnemonic() const;
190 
191   /// Returns if the attribute or type has a custom assembly format implemented
192   /// in C++. Corresponds to the `hasCustomAssemblyFormat` field.
193   bool hasCustomAssemblyFormat() const;
194 
195   /// Returns the custom assembly format, if one was specified.
196   std::optional<StringRef> getAssemblyFormat() const;
197 
198   /// Returns true if the accessors based on the parameters should be generated.
199   bool genAccessors() const;
200 
201   /// Return true if we need to generate the verify declaration and getChecked
202   /// method.
203   bool genVerifyDecl() const;
204 
205   /// Return true if we need to generate any type constraint verification and
206   /// the getChecked method.
207   bool genVerifyInvariantsImpl() const;
208 
209   /// Returns the def's extra class declaration code.
210   std::optional<StringRef> getExtraDecls() const;
211 
212   /// Returns the def's extra class definition code.
213   std::optional<StringRef> getExtraDefs() const;
214 
215   /// Get the code location (for error printing).
216   ArrayRef<SMLoc> getLoc() const;
217 
218   /// Returns true if the default get/getChecked methods should be skipped
219   /// during generation.
220   bool skipDefaultBuilders() const;
221 
222   /// Returns the builders of this def.
223   ArrayRef<AttrOrTypeBuilder> getBuilders() const { return builders; }
224 
225   /// Returns the traits of this def.
226   ArrayRef<Trait> getTraits() const { return traits; }
227 
228   /// Returns whether two AttrOrTypeDefs are equal by checking the equality of
229   /// the underlying record.
230   bool operator==(const AttrOrTypeDef &other) const;
231 
232   /// Compares two AttrOrTypeDefs by comparing the names of the dialects.
233   bool operator<(const AttrOrTypeDef &other) const;
234 
235   /// Returns whether the AttrOrTypeDef is defined.
236   operator bool() const { return def != nullptr; }
237 
238   /// Return the underlying def.
239   const llvm::Record *getDef() const { return def; }
240 
241 protected:
242   const llvm::Record *def;
243 
244   /// The builders of this definition.
245   SmallVector<AttrOrTypeBuilder> builders;
246 
247   /// The traits of this definition.
248   SmallVector<Trait> traits;
249 
250   /// The parameters of this attribute or type.
251   SmallVector<AttrOrTypeParameter> parameters;
252 };
253 
254 //===----------------------------------------------------------------------===//
255 // AttrDef
256 //===----------------------------------------------------------------------===//
257 
258 /// This class represents a wrapper around a tablegen AttrDef record.
259 class AttrDef : public AttrOrTypeDef {
260 public:
261   using AttrOrTypeDef::AttrOrTypeDef;
262 
263   /// Returns the attributes value type builder code block, or std::nullopt if
264   /// it doesn't have one.
265   std::optional<StringRef> getTypeBuilder() const;
266 
267   static bool classof(const AttrOrTypeDef *def);
268 
269   /// Get the unique attribute name "dialect.attrname".
270   StringRef getAttrName() const;
271 };
272 
273 //===----------------------------------------------------------------------===//
274 // TypeDef
275 //===----------------------------------------------------------------------===//
276 
277 /// This class represents a wrapper around a tablegen TypeDef record.
278 class TypeDef : public AttrOrTypeDef {
279 public:
280   using AttrOrTypeDef::AttrOrTypeDef;
281 
282   static bool classof(const AttrOrTypeDef *def);
283 
284   /// Get the unique type name "dialect.typename".
285   StringRef getTypeName() const;
286 };
287 
288 } // namespace tblgen
289 } // namespace mlir
290 
291 #endif // MLIR_TABLEGEN_ATTRORTYPEDEF_H
292