My Project
DialectImplementation.h
Go to the documentation of this file.
1 //===- DialectImplementation.h ----------------------------------*- C++ -*-===//
2 //
3 // Part of the MLIR 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 // This file contains utilities classes for implementing dialect attributes and
10 // types.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #ifndef MLIR_IR_DIALECTIMPLEMENTATION_H
15 #define MLIR_IR_DIALECTIMPLEMENTATION_H
16 
18 #include "llvm/ADT/Twine.h"
19 #include "llvm/Support/SMLoc.h"
20 #include "llvm/Support/raw_ostream.h"
21 
22 namespace mlir {
23 
24 class Builder;
25 
26 //===----------------------------------------------------------------------===//
27 // DialectAsmPrinter
28 //===----------------------------------------------------------------------===//
29 
34 public:
36  virtual ~DialectAsmPrinter();
37  virtual raw_ostream &getStream() const = 0;
38 
40  virtual void printAttribute(Attribute attr) = 0;
41 
45  virtual void printFloat(const APFloat &value) = 0;
46 
48  virtual void printType(Type type) = 0;
49 
50 private:
51  DialectAsmPrinter(const DialectAsmPrinter &) = delete;
52  void operator=(const DialectAsmPrinter &) = delete;
53 };
54 
55 // Make the implementations convenient to use.
57  p.printAttribute(attr);
58  return p;
59 }
60 
62  const APFloat &value) {
63  p.printFloat(value);
64  return p;
65 }
67  return p << APFloat(value);
68 }
69 inline DialectAsmPrinter &operator<<(DialectAsmPrinter &p, double value) {
70  return p << APFloat(value);
71 }
72 
74  p.printType(type);
75  return p;
76 }
77 
78 // Support printing anything that isn't convertible to one of the above types,
79 // even if it isn't exactly one of them. For example, we want to print
80 // FunctionType with the Type version above, not have it match this.
81 template <typename T, typename std::enable_if<
82  !std::is_convertible<T &, Attribute &>::value &&
83  !std::is_convertible<T &, Type &>::value &&
84  !std::is_convertible<T &, APFloat &>::value &&
85  !llvm::is_one_of<T, double, float>::value,
86  T>::type * = nullptr>
87 inline DialectAsmPrinter &operator<<(DialectAsmPrinter &p, const T &other) {
88  p.getStream() << other;
89  return p;
90 }
91 
92 //===----------------------------------------------------------------------===//
93 // DialectAsmParser
94 //===----------------------------------------------------------------------===//
95 
101 public:
102  virtual ~DialectAsmParser();
103 
105  virtual InFlightDiagnostic emitError(llvm::SMLoc loc,
106  const Twine &message = {}) = 0;
107 
110  virtual Builder &getBuilder() const = 0;
111 
114  virtual llvm::SMLoc getCurrentLocation() = 0;
115  ParseResult getCurrentLocation(llvm::SMLoc *loc) {
116  *loc = getCurrentLocation();
117  return success();
118  }
119 
121  virtual llvm::SMLoc getNameLoc() const = 0;
122 
124  virtual Location getEncodedSourceLoc(llvm::SMLoc loc) = 0;
125 
128  virtual StringRef getFullSymbolSpec() const = 0;
129 
130  // These methods emit an error and return failure or success. This allows
131  // these to be chained together into a linear sequence of || expressions in
132  // many cases.
133 
135  virtual ParseResult parseFloat(double &result) = 0;
136 
138  template <typename IntT> ParseResult parseInteger(IntT &result) {
139  auto loc = getCurrentLocation();
140  OptionalParseResult parseResult = parseOptionalInteger(result);
141  if (!parseResult.hasValue())
142  return emitError(loc, "expected integer value");
143  return *parseResult;
144  }
145 
147  virtual OptionalParseResult parseOptionalInteger(uint64_t &result) = 0;
148 
149  template <typename IntT>
151  auto loc = getCurrentLocation();
152 
153  // Parse the unsigned variant.
154  uint64_t uintResult;
155  OptionalParseResult parseResult = parseOptionalInteger(uintResult);
156  if (!parseResult.hasValue() || failed(*parseResult))
157  return parseResult;
158 
159  // Try to convert to the provided integer type.
160  result = IntT(uintResult);
161  if (uint64_t(result) != uintResult)
162  return emitError(loc, "integer value too large");
163  return success();
164  }
165 
166  //===--------------------------------------------------------------------===//
167  // Token Parsing
168  //===--------------------------------------------------------------------===//
169 
171  virtual ParseResult parseArrow() = 0;
172 
174  virtual ParseResult parseOptionalArrow() = 0;
175 
177  virtual ParseResult parseLBrace() = 0;
178 
180  virtual ParseResult parseOptionalLBrace() = 0;
181 
183  virtual ParseResult parseRBrace() = 0;
184 
186  virtual ParseResult parseOptionalRBrace() = 0;
187 
189  virtual ParseResult parseColon() = 0;
190 
192  virtual ParseResult parseOptionalColon() = 0;
193 
195  virtual ParseResult parseComma() = 0;
196 
198  virtual ParseResult parseOptionalComma() = 0;
199 
201  virtual ParseResult parseEqual() = 0;
202 
204  ParseResult parseKeyword(StringRef keyword, const Twine &msg = "") {
205  auto loc = getCurrentLocation();
206  if (parseOptionalKeyword(keyword))
207  return emitError(loc, "expected '") << keyword << "'" << msg;
208  return success();
209  }
210 
212  ParseResult parseKeyword(StringRef *keyword) {
213  auto loc = getCurrentLocation();
214  if (parseOptionalKeyword(keyword))
215  return emitError(loc, "expected valid keyword");
216  return success();
217  }
218 
220  virtual ParseResult parseOptionalKeyword(StringRef keyword) = 0;
221 
223  virtual ParseResult parseOptionalKeyword(StringRef *keyword) = 0;
224 
226  virtual ParseResult parseLess() = 0;
227 
229  virtual ParseResult parseOptionalLess() = 0;
230 
232  virtual ParseResult parseGreater() = 0;
233 
235  virtual ParseResult parseOptionalGreater() = 0;
236 
238  virtual ParseResult parseLParen() = 0;
239 
241  virtual ParseResult parseOptionalLParen() = 0;
242 
244  virtual ParseResult parseRParen() = 0;
245 
247  virtual ParseResult parseOptionalRParen() = 0;
248 
250  virtual ParseResult parseLSquare() = 0;
251 
253  virtual ParseResult parseOptionalLSquare() = 0;
254 
256  virtual ParseResult parseRSquare() = 0;
257 
259  virtual ParseResult parseOptionalRSquare() = 0;
260 
262  virtual ParseResult parseOptionalEllipsis() = 0;
263 
265  virtual ParseResult parseOptionalQuestion() = 0;
266 
268  virtual ParseResult parseOptionalStar() = 0;
269 
270  //===--------------------------------------------------------------------===//
271  // Attribute Parsing
272  //===--------------------------------------------------------------------===//
273 
275  virtual ParseResult parseAttribute(Attribute &result, Type type = {}) = 0;
276 
278  template <typename AttrType>
279  ParseResult parseAttribute(AttrType &result, Type type = {}) {
280  llvm::SMLoc loc = getCurrentLocation();
281 
282  // Parse any kind of attribute.
283  Attribute attr;
284  if (parseAttribute(attr))
285  return failure();
286 
287  // Check for the right kind of attribute.
288  result = attr.dyn_cast<AttrType>();
289  if (!result)
290  return emitError(loc, "invalid kind of attribute specified");
291  return success();
292  }
293 
294  //===--------------------------------------------------------------------===//
295  // Type Parsing
296  //===--------------------------------------------------------------------===//
297 
299  virtual ParseResult parseType(Type &result) = 0;
300 
302  template <typename TypeType> ParseResult parseType(TypeType &result) {
303  llvm::SMLoc loc = getCurrentLocation();
304 
305  // Parse any kind of type.
306  Type type;
307  if (parseType(type))
308  return failure();
309 
310  // Check for the right kind of attribute.
311  result = type.dyn_cast<TypeType>();
312  if (!result)
313  return emitError(loc, "invalid kind of type specified");
314  return success();
315  }
316 
327  virtual ParseResult parseDimensionList(SmallVectorImpl<int64_t> &dimensions,
328  bool allowDynamic = true) = 0;
329 };
330 
331 } // end namespace mlir
332 
333 #endif
ParseResult parseInteger(IntT &result)
Parse an integer value from the stream.
Definition: DialectImplementation.h:138
Definition: InferTypeOpInterface.cpp:20
Attribute parseAttribute(llvm::StringRef attrStr, MLIRContext *context)
Definition: Diagnostics.h:320
ParseResult getCurrentLocation(llvm::SMLoc *loc)
Definition: DialectImplementation.h:115
ParseResult parseAttribute(AttrType &result, Type type={})
Parse an attribute of a specific kind and type.
Definition: DialectImplementation.h:279
bool failed(LogicalResult result)
Definition: LogicalResult.h:45
virtual ~DialectAsmPrinter()
Definition: AsmPrinter.cpp:48
Definition: LLVM.h:34
Definition: Location.h:52
LogicalResult success(bool isSuccess=true)
Definition: LogicalResult.h:25
ParseResult parseType(TypeType &result)
Parse a type of a specific kind, e.g. a FunctionType.
Definition: DialectImplementation.h:302
LogicalResult failure(bool isFailure=true)
Definition: LogicalResult.h:32
ParseResult parseKeyword(StringRef *keyword)
Parse a keyword into &#39;keyword&#39;.
Definition: DialectImplementation.h:212
U dyn_cast() const
Definition: Types.h:258
Definition: Attributes.h:53
virtual void printType(Type type)=0
Print the given type to the stream.
virtual void printFloat(const APFloat &value)=0
ParseResult parseKeyword(StringRef keyword, const Twine &msg="")
Parse a given keyword.
Definition: DialectImplementation.h:204
Type parseType(llvm::StringRef typeStr, MLIRContext *context)
Definition: Types.h:84
virtual raw_ostream & getStream() const =0
Definition: OpDefinition.h:52
virtual void printAttribute(Attribute attr)=0
Print the given attribute to the stream.
InFlightDiagnostic emitError(Location loc)
Utility method to emit an error message using this location.
Definition: Diagnostics.cpp:301
Definition: Builders.h:47
U dyn_cast() const
Definition: Attributes.h:1347
Definition: DialectImplementation.h:33
bool hasValue() const
Returns true if we contain a valid ParseResult value.
Definition: OpDefinition.h:62
OptionalParseResult parseOptionalInteger(IntT &result)
Definition: DialectImplementation.h:150
raw_ostream & operator<<(raw_ostream &os, SubViewOp::Range &range)
Definition: Ops.cpp:2759
Definition: OpDefinition.h:36
Definition: DialectImplementation.h:100
DialectAsmPrinter()
Definition: DialectImplementation.h:35