1 //===- TestAttributes.cpp - MLIR Test Dialect Attributes --------*- C++ -*-===//
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 // This file contains attributes defined by the TestDialect for testing various
10 // features of MLIR.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #include "TestAttributes.h"
15 #include "TestDialect.h"
16 #include "mlir/IR/Builders.h"
17 #include "mlir/IR/DialectImplementation.h"
18 #include "mlir/IR/Types.h"
19 #include "llvm/ADT/Hashing.h"
20 #include "llvm/ADT/SetVector.h"
21 #include "llvm/ADT/TypeSwitch.h"
22
23 using namespace mlir;
24 using namespace test;
25
26 //===----------------------------------------------------------------------===//
27 // AttrWithSelfTypeParamAttr
28 //===----------------------------------------------------------------------===//
29
parse(DialectAsmParser & parser,Type type)30 Attribute AttrWithSelfTypeParamAttr::parse(DialectAsmParser &parser,
31 Type type) {
32 Type selfType;
33 if (parser.parseType(selfType))
34 return Attribute();
35 return get(parser.getContext(), selfType);
36 }
37
print(DialectAsmPrinter & printer) const38 void AttrWithSelfTypeParamAttr::print(DialectAsmPrinter &printer) const {
39 printer << "attr_with_self_type_param " << getType();
40 }
41
42 //===----------------------------------------------------------------------===//
43 // AttrWithTypeBuilderAttr
44 //===----------------------------------------------------------------------===//
45
parse(DialectAsmParser & parser,Type type)46 Attribute AttrWithTypeBuilderAttr::parse(DialectAsmParser &parser, Type type) {
47 IntegerAttr element;
48 if (parser.parseAttribute(element))
49 return Attribute();
50 return get(parser.getContext(), element);
51 }
52
print(DialectAsmPrinter & printer) const53 void AttrWithTypeBuilderAttr::print(DialectAsmPrinter &printer) const {
54 printer << "attr_with_type_builder " << getAttr();
55 }
56
57 //===----------------------------------------------------------------------===//
58 // CompoundAAttr
59 //===----------------------------------------------------------------------===//
60
parse(DialectAsmParser & parser,Type type)61 Attribute CompoundAAttr::parse(DialectAsmParser &parser, Type type) {
62 int widthOfSomething;
63 Type oneType;
64 SmallVector<int, 4> arrayOfInts;
65 if (parser.parseLess() || parser.parseInteger(widthOfSomething) ||
66 parser.parseComma() || parser.parseType(oneType) || parser.parseComma() ||
67 parser.parseLSquare())
68 return Attribute();
69
70 int intVal;
71 while (!*parser.parseOptionalInteger(intVal)) {
72 arrayOfInts.push_back(intVal);
73 if (parser.parseOptionalComma())
74 break;
75 }
76
77 if (parser.parseRSquare() || parser.parseGreater())
78 return Attribute();
79 return get(parser.getContext(), widthOfSomething, oneType, arrayOfInts);
80 }
81
print(DialectAsmPrinter & printer) const82 void CompoundAAttr::print(DialectAsmPrinter &printer) const {
83 printer << "cmpnd_a<" << getWidthOfSomething() << ", " << getOneType()
84 << ", [";
85 llvm::interleaveComma(getArrayOfInts(), printer);
86 printer << "]>";
87 }
88
89 //===----------------------------------------------------------------------===//
90 // CompoundAAttr
91 //===----------------------------------------------------------------------===//
92
parse(DialectAsmParser & parser,Type type)93 Attribute TestI64ElementsAttr::parse(DialectAsmParser &parser, Type type) {
94 SmallVector<uint64_t> elements;
95 if (parser.parseLess() || parser.parseLSquare())
96 return Attribute();
97 uint64_t intVal;
98 while (succeeded(*parser.parseOptionalInteger(intVal))) {
99 elements.push_back(intVal);
100 if (parser.parseOptionalComma())
101 break;
102 }
103
104 if (parser.parseRSquare() || parser.parseGreater())
105 return Attribute();
106 return parser.getChecked<TestI64ElementsAttr>(
107 parser.getContext(), type.cast<ShapedType>(), elements);
108 }
109
print(DialectAsmPrinter & printer) const110 void TestI64ElementsAttr::print(DialectAsmPrinter &printer) const {
111 printer << "i64_elements<[";
112 llvm::interleaveComma(getElements(), printer);
113 printer << "] : " << getType() << ">";
114 }
115
116 LogicalResult
verify(function_ref<InFlightDiagnostic ()> emitError,ShapedType type,ArrayRef<uint64_t> elements)117 TestI64ElementsAttr::verify(function_ref<InFlightDiagnostic()> emitError,
118 ShapedType type, ArrayRef<uint64_t> elements) {
119 if (type.getNumElements() != static_cast<int64_t>(elements.size())) {
120 return emitError()
121 << "number of elements does not match the provided shape type, got: "
122 << elements.size() << ", but expected: " << type.getNumElements();
123 }
124 if (type.getRank() != 1 || !type.getElementType().isSignlessInteger(64))
125 return emitError() << "expected single rank 64-bit shape type, but got: "
126 << type;
127 return success();
128 }
129
130 //===----------------------------------------------------------------------===//
131 // Tablegen Generated Definitions
132 //===----------------------------------------------------------------------===//
133
134 #include "TestAttrInterfaces.cpp.inc"
135
136 #define GET_ATTRDEF_CLASSES
137 #include "TestAttrDefs.cpp.inc"
138
139 //===----------------------------------------------------------------------===//
140 // TestDialect
141 //===----------------------------------------------------------------------===//
142
registerAttributes()143 void TestDialect::registerAttributes() {
144 addAttributes<
145 #define GET_ATTRDEF_LIST
146 #include "TestAttrDefs.cpp.inc"
147 >();
148 }
149
parseAttribute(DialectAsmParser & parser,Type type) const150 Attribute TestDialect::parseAttribute(DialectAsmParser &parser,
151 Type type) const {
152 StringRef attrTag;
153 if (failed(parser.parseKeyword(&attrTag)))
154 return Attribute();
155 {
156 Attribute attr;
157 auto parseResult = generatedAttributeParser(parser, attrTag, type, attr);
158 if (parseResult.hasValue())
159 return attr;
160 }
161 parser.emitError(parser.getNameLoc(), "unknown test attribute");
162 return Attribute();
163 }
164
printAttribute(Attribute attr,DialectAsmPrinter & printer) const165 void TestDialect::printAttribute(Attribute attr,
166 DialectAsmPrinter &printer) const {
167 if (succeeded(generatedAttributePrinter(attr, printer)))
168 return;
169 }
170