MLIR 22.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
15using namespace mlir;
16using 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
29void PDLDialect::registerTypes() {
30 addTypes<
31#define GET_TYPEDEF_LIST
32#include "mlir/Dialect/PDL/IR/PDLOpsTypes.cpp.inc"
33 >();
34}
35
36static 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
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
72Type RangeType::parse(AsmParser &parser) {
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
90void RangeType::print(AsmPrinter &printer) const {
91 printer << "<";
92 (void)generatedTypePrinter(getElementType(), printer);
93 printer << ">";
94}
95
96LogicalResult RangeType::verify(function_ref<InFlightDiagnostic()> emitError,
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}
return success()
static Type getElementType(Type type)
Determine the element type of type.
static OptionalParseResult generatedTypeParser(AsmParser &parser, StringRef *mnemonic, Type &value)
These are unused for now.
static LogicalResult generatedTypePrinter(Type def, AsmPrinter &printer)
static Type parsePDLType(AsmParser &parser)
Definition PDLTypes.cpp:36
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.
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:107
constexpr Type()=default
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
Include the generated interface declarations.
InFlightDiagnostic emitError(Location loc)
Utility method to emit an error message using this location.
llvm::function_ref< Fn > function_ref
Definition LLVM.h:152