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
9 #include "mlir/Dialect/PDL/IR/PDLTypes.h"
10 #include "mlir/Dialect/PDL/IR/PDL.h"
11 #include "mlir/IR/Builders.h"
12 #include "mlir/IR/DialectImplementation.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
registerTypes()29 void PDLDialect::registerTypes() {
30 addTypes<
31 #define GET_TYPEDEF_LIST
32 #include "mlir/Dialect/PDL/IR/PDLOpsTypes.cpp.inc"
33 >();
34 }
35
parsePDLType(AsmParser & parser)36 static Type parsePDLType(AsmParser &parser) {
37 StringRef typeTag;
38 {
39 Type genType;
40 auto parseResult = generatedTypeParser(parser, &typeTag, genType);
41 if (parseResult.hasValue())
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
classof(Type type)58 bool PDLType::classof(Type type) {
59 return llvm::isa<PDLDialect>(type.getDialect());
60 }
61
62 //===----------------------------------------------------------------------===//
63 // RangeType
64 //===----------------------------------------------------------------------===//
65
parse(AsmParser & parser)66 Type RangeType::parse(AsmParser &parser) {
67 if (parser.parseLess())
68 return Type();
69
70 SMLoc elementLoc = parser.getCurrentLocation();
71 Type elementType = parsePDLType(parser);
72 if (!elementType || parser.parseGreater())
73 return Type();
74
75 if (elementType.isa<RangeType>()) {
76 parser.emitError(elementLoc)
77 << "element of pdl.range cannot be another range, but got"
78 << elementType;
79 return Type();
80 }
81 return RangeType::get(elementType);
82 }
83
print(AsmPrinter & printer) const84 void RangeType::print(AsmPrinter &printer) const {
85 printer << "<";
86 (void)generatedTypePrinter(getElementType(), printer);
87 printer << ">";
88 }
89
verify(function_ref<InFlightDiagnostic ()> emitError,Type elementType)90 LogicalResult RangeType::verify(function_ref<InFlightDiagnostic()> emitError,
91 Type elementType) {
92 if (!elementType.isa<PDLType>() || elementType.isa<RangeType>()) {
93 return emitError()
94 << "expected element of pdl.range to be one of [!pdl.attribute, "
95 "!pdl.operation, !pdl.type, !pdl.value], but got "
96 << elementType;
97 }
98 return success();
99 }
100