MLIR 24.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
12using namespace mlir;
13using namespace mlir::pdl;
14
15//===----------------------------------------------------------------------===//
16// TableGen'd type method definitions
17//===----------------------------------------------------------------------===//
18
19#define GET_TYPEDEF_CLASSES
20#include "mlir/Dialect/PDL/IR/PDLOpsTypes.cpp.inc"
21
22//===----------------------------------------------------------------------===//
23// PDLDialect
24//===----------------------------------------------------------------------===//
25
26void PDLDialect::registerTypes() {
27 addTypes<
28#define GET_TYPEDEF_LIST
29#include "mlir/Dialect/PDL/IR/PDLOpsTypes.cpp.inc"
30 >();
31}
32
33static Type parsePDLType(AsmParser &parser) {
34 StringRef typeTag;
35 {
36 Type genType;
37 auto parseResult = generatedTypeParser(parser, &typeTag, genType);
38 if (parseResult.has_value())
39 return genType;
40 }
41
42 // FIXME: This ends up with a double error being emitted if `RangeType` also
43 // emits an error. We should rework the `generatedTypeParser` to better
44 // support when the keyword is valid but the individual type parser itself
45 // emits an error.
46 parser.emitError(parser.getNameLoc(), "invalid 'pdl' type: `")
47 << typeTag << "'";
48 return Type();
49}
50
51//===----------------------------------------------------------------------===//
52// PDL Types
53//===----------------------------------------------------------------------===//
54
56 return llvm::isa<PDLDialect>(type.getDialect());
57}
58
60 if (auto rangeType = llvm::dyn_cast<RangeType>(type))
61 return rangeType.getElementType();
62 return type;
63}
64
65//===----------------------------------------------------------------------===//
66// RangeType
67//===----------------------------------------------------------------------===//
68
69Type RangeType::parse(AsmParser &parser) {
70 if (parser.parseLess())
71 return Type();
72
73 SMLoc elementLoc = parser.getCurrentLocation();
74 Type elementType = parsePDLType(parser);
75 if (!elementType || parser.parseGreater())
76 return Type();
77
78 if (llvm::isa<RangeType>(elementType)) {
79 parser.emitError(elementLoc)
80 << "element of pdl.range cannot be another range, but got"
81 << elementType;
82 return Type();
83 }
84 return RangeType::get(elementType);
85}
86
87void RangeType::print(AsmPrinter &printer) const {
88 printer << "<";
89 (void)generatedTypePrinter(getElementType(), printer);
90 printer << ">";
91}
92
93LogicalResult RangeType::verify(function_ref<InFlightDiagnostic()> emitError,
94 Type elementType) {
95 if (!llvm::isa<PDLType>(elementType) || llvm::isa<RangeType>(elementType)) {
96 return emitError()
97 << "expected element of pdl.range to be one of [!pdl.attribute, "
98 "!pdl.operation, !pdl.type, !pdl.value], but got "
99 << elementType;
100 }
101 return success();
102}
return success()
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:33
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:229
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:55
Type getRangeElementTypeOrSelf(Type type)
If the given type is a range, return its element type, otherwise return the type itself.
Definition PDLTypes.cpp:59
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:155