MLIR  20.0.0git
PDLTypes.cpp
Go to the documentation of this file.
1 //===- PDLTypes.cpp - Pattern Descriptor Language Types -------------------===//
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 
11 #include "mlir/IR/Builders.h"
13 #include "llvm/ADT/TypeSwitch.h"
14 
15 using namespace mlir;
16 using namespace mlir::pdl;
17 
18 //===----------------------------------------------------------------------===//
19 // TableGen'd type method definitions
20 //===----------------------------------------------------------------------===//
21 
22 #define GET_TYPEDEF_CLASSES
23 #include "mlir/Dialect/PDL/IR/PDLOpsTypes.cpp.inc"
24 
25 //===----------------------------------------------------------------------===//
26 // PDLDialect
27 //===----------------------------------------------------------------------===//
28 
29 void PDLDialect::registerTypes() {
30  addTypes<
31 #define GET_TYPEDEF_LIST
32 #include "mlir/Dialect/PDL/IR/PDLOpsTypes.cpp.inc"
33  >();
34 }
35 
36 static Type parsePDLType(AsmParser &parser) {
37  StringRef typeTag;
38  {
39  Type genType;
40  auto parseResult = generatedTypeParser(parser, &typeTag, genType);
41  if (parseResult.has_value())
42  return genType;
43  }
44 
45  // FIXME: This ends up with a double error being emitted if `RangeType` also
46  // emits an error. We should rework the `generatedTypeParser` to better
47  // support when the keyword is valid but the individual type parser itself
48  // emits an error.
49  parser.emitError(parser.getNameLoc(), "invalid 'pdl' type: `")
50  << typeTag << "'";
51  return Type();
52 }
53 
54 //===----------------------------------------------------------------------===//
55 // PDL Types
56 //===----------------------------------------------------------------------===//
57 
58 bool PDLType::classof(Type type) {
59  return llvm::isa<PDLDialect>(type.getDialect());
60 }
61 
63  if (auto rangeType = llvm::dyn_cast<RangeType>(type))
64  return rangeType.getElementType();
65  return type;
66 }
67 
68 //===----------------------------------------------------------------------===//
69 // RangeType
70 //===----------------------------------------------------------------------===//
71 
73  if (parser.parseLess())
74  return Type();
75 
76  SMLoc elementLoc = parser.getCurrentLocation();
77  Type elementType = parsePDLType(parser);
78  if (!elementType || parser.parseGreater())
79  return Type();
80 
81  if (llvm::isa<RangeType>(elementType)) {
82  parser.emitError(elementLoc)
83  << "element of pdl.range cannot be another range, but got"
84  << elementType;
85  return Type();
86  }
87  return RangeType::get(elementType);
88 }
89 
90 void RangeType::print(AsmPrinter &printer) const {
91  printer << "<";
92  (void)generatedTypePrinter(getElementType(), printer);
93  printer << ">";
94 }
95 
97  Type elementType) {
98  if (!llvm::isa<PDLType>(elementType) || llvm::isa<RangeType>(elementType)) {
99  return emitError()
100  << "expected element of pdl.range to be one of [!pdl.attribute, "
101  "!pdl.operation, !pdl.type, !pdl.value], but got "
102  << elementType;
103  }
104  return success();
105 }
static LLVM_ATTRIBUTE_UNUSED OptionalParseResult generatedTypeParser(AsmParser &parser, StringRef *mnemonic, Type &value)
These are unused for now.
static LLVM_ATTRIBUTE_UNUSED LogicalResult generatedTypePrinter(Type def, AsmPrinter &printer)
static Type parsePDLType(AsmParser &parser)
Definition: PDLTypes.cpp:36
static void print(spirv::VerCapExtAttr triple, DialectAsmPrinter &printer)
static Type getElementType(Type type, ArrayRef< int32_t > indices, function_ref< InFlightDiagnostic(StringRef)> emitErrorFn)
Walks the given type hierarchy with the given indices, potentially down to component granularity,...
Definition: SPIRVOps.cpp:215
This base class exposes generic asm parser hooks, usable across the various derived parsers.
virtual InFlightDiagnostic emitError(SMLoc loc, const Twine &message={})=0
Emit a diagnostic at the specified location and return failure.
virtual ParseResult parseLess()=0
Parse a '<' token.
virtual SMLoc getCurrentLocation()=0
Get the location of the next token and store it into the argument.
virtual SMLoc getNameLoc() const =0
Return the location of the original name token.
virtual ParseResult parseGreater()=0
Parse a '>' token.
This base class exposes generic asm printer hooks, usable across the various derived printers.
This class represents a diagnostic that is inflight and set to be reported.
Definition: Diagnostics.h:314
Instances of the Type class are uniqued, have an immutable identifier and an optional mutable compone...
Definition: Types.h:74
Dialect & getDialect() const
Get the dialect this type is registered to.
Definition: Types.h:123
static bool classof(Type type)
Definition: PDLTypes.cpp:58
Type getRangeElementTypeOrSelf(Type type)
If the given type is a range, return its element type, otherwise return the type itself.
Definition: PDLTypes.cpp:62
QueryRef parse(llvm::StringRef line, const QuerySession &qs)
Definition: Query.cpp:20
Include the generated interface declarations.
InFlightDiagnostic emitError(Location loc)
Utility method to emit an error message using this location.
auto get(MLIRContext *context, Ts &&...params)
Helper method that injects context only if needed, this helps unify some of the attribute constructio...
LogicalResult verify(Operation *op, bool verifyRecursively=true)
Perform (potentially expensive) checks of invariants, used to detect compiler bugs,...
Definition: Verifier.cpp:426