MLIR 22.0.0git
SPIRVAttributes.cpp
Go to the documentation of this file.
1//===- SPIRVAttributes.cpp - SPIR-V attribute definitions -----------------===//
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
12#include "mlir/IR/Builders.h"
14#include "llvm/ADT/TypeSwitch.h"
15#include "llvm/Support/InterleavedRange.h"
16
17using namespace mlir;
18using namespace mlir::spirv;
19
20//===----------------------------------------------------------------------===//
21// TableGen'erated attribute utility functions
22//===----------------------------------------------------------------------===//
23
24namespace mlir {
25namespace spirv {
26#include "mlir/Dialect/SPIRV/IR/SPIRVAttrUtils.inc"
27} // namespace spirv
28
29//===----------------------------------------------------------------------===//
30// Attribute storage classes
31//===----------------------------------------------------------------------===//
32
33namespace spirv {
34namespace detail {
35
37 using KeyTy = std::tuple<Attribute, Attribute, Attribute>;
38
43
44 bool operator==(const KeyTy &key) const {
45 return std::get<0>(key) == descriptorSet && std::get<1>(key) == binding &&
46 std::get<2>(key) == storageClass;
47 }
48
50 construct(AttributeStorageAllocator &allocator, const KeyTy &key) {
51 return new (allocator.allocate<InterfaceVarABIAttributeStorage>())
52 InterfaceVarABIAttributeStorage(std::get<0>(key), std::get<1>(key),
53 std::get<2>(key));
54 }
55
59};
60
62 using KeyTy = std::tuple<Attribute, Attribute, Attribute>;
63
67
68 bool operator==(const KeyTy &key) const {
69 return std::get<0>(key) == version && std::get<1>(key) == capabilities &&
70 std::get<2>(key) == extensions;
71 }
72
74 construct(AttributeStorageAllocator &allocator, const KeyTy &key) {
75 return new (allocator.allocate<VerCapExtAttributeStorage>())
76 VerCapExtAttributeStorage(std::get<0>(key), std::get<1>(key),
77 std::get<2>(key));
78 }
79
83};
84
86 using KeyTy =
87 std::tuple<Attribute, ClientAPI, Vendor, DeviceType, uint32_t, Attribute>;
88
94
95 bool operator==(const KeyTy &key) const {
96 return key == std::make_tuple(triple, clientAPI, vendorID, deviceType,
98 }
99
101 construct(AttributeStorageAllocator &allocator, const KeyTy &key) {
102 return new (allocator.allocate<TargetEnvAttributeStorage>())
103 TargetEnvAttributeStorage(std::get<0>(key), std::get<1>(key),
104 std::get<2>(key), std::get<3>(key),
105 std::get<4>(key), std::get<5>(key));
106 }
107
110 ClientAPI clientAPI;
111 Vendor vendorID;
112 DeviceType deviceType;
113 uint32_t deviceID;
114};
115} // namespace detail
116} // namespace spirv
117} // namespace mlir
118
119//===----------------------------------------------------------------------===//
120// InterfaceVarABIAttr
121//===----------------------------------------------------------------------===//
122
124spirv::InterfaceVarABIAttr::get(uint32_t descriptorSet, uint32_t binding,
125 std::optional<spirv::StorageClass> storageClass,
126 MLIRContext *context) {
127 Builder b(context);
128 auto descriptorSetAttr = b.getI32IntegerAttr(descriptorSet);
129 auto bindingAttr = b.getI32IntegerAttr(binding);
130 auto storageClassAttr =
131 storageClass ? b.getI32IntegerAttr(static_cast<uint32_t>(*storageClass))
132 : IntegerAttr();
133 return get(descriptorSetAttr, bindingAttr, storageClassAttr);
134}
135
136spirv::InterfaceVarABIAttr
137spirv::InterfaceVarABIAttr::get(IntegerAttr descriptorSet, IntegerAttr binding,
138 IntegerAttr storageClass) {
139 assert(descriptorSet && binding);
140 MLIRContext *context = descriptorSet.getContext();
141 return Base::get(context, descriptorSet, binding, storageClass);
142}
143
145 return "interface_var_abi";
146}
147
149 return cast<IntegerAttr>(getImpl()->binding).getInt();
150}
151
153 return cast<IntegerAttr>(getImpl()->descriptorSet).getInt();
154}
155
156std::optional<spirv::StorageClass>
158 if (getImpl()->storageClass)
159 return static_cast<spirv::StorageClass>(
160 cast<IntegerAttr>(getImpl()->storageClass).getValue().getZExtValue());
161 return std::nullopt;
162}
163
165 function_ref<InFlightDiagnostic()> emitError, IntegerAttr descriptorSet,
166 IntegerAttr binding, IntegerAttr storageClass) {
167 if (!descriptorSet.getType().isSignlessInteger(32))
168 return emitError() << "expected 32-bit integer for descriptor set";
169
170 if (!binding.getType().isSignlessInteger(32))
171 return emitError() << "expected 32-bit integer for binding";
172
173 if (storageClass) {
174 if (auto storageClassAttr = cast<IntegerAttr>(storageClass)) {
175 auto storageClassValue =
176 spirv::symbolizeStorageClass(storageClassAttr.getInt());
177 if (!storageClassValue)
178 return emitError() << "unknown storage class";
179 } else {
180 return emitError() << "expected valid storage class";
181 }
182 }
183
184 return success();
185}
186
187//===----------------------------------------------------------------------===//
188// VerCapExtAttr
189//===----------------------------------------------------------------------===//
190
192 spirv::Version version, ArrayRef<spirv::Capability> capabilities,
193 ArrayRef<spirv::Extension> extensions, MLIRContext *context) {
194 Builder b(context);
195
196 auto versionAttr = b.getI32IntegerAttr(static_cast<uint32_t>(version));
197
199 capAttrs.reserve(capabilities.size());
200 for (spirv::Capability cap : capabilities)
201 capAttrs.push_back(b.getI32IntegerAttr(static_cast<uint32_t>(cap)));
202
204 extAttrs.reserve(extensions.size());
205 for (spirv::Extension ext : extensions)
206 extAttrs.push_back(b.getStringAttr(spirv::stringifyExtension(ext)));
207
208 return get(versionAttr, b.getArrayAttr(capAttrs), b.getArrayAttr(extAttrs));
209}
210
212 ArrayAttr capabilities,
213 ArrayAttr extensions) {
214 assert(version && capabilities && extensions);
215 MLIRContext *context = version.getContext();
216 return Base::get(context, version, capabilities, extensions);
217}
218
219StringRef spirv::VerCapExtAttr::getKindName() { return "vce"; }
220
222 return static_cast<spirv::Version>(
223 cast<IntegerAttr>(getImpl()->version).getValue().getZExtValue());
224}
225
227 : llvm::mapped_iterator<ArrayAttr::iterator,
228 spirv::Extension (*)(Attribute)>(
229 it, [](Attribute attr) {
230 return *symbolizeExtension(cast<StringAttr>(attr).getValue());
231 }) {}
232
234 auto range = getExtensionsAttr().getValue();
235 return {ext_iterator(range.begin()), ext_iterator(range.end())};
236}
237
239 return cast<ArrayAttr>(getImpl()->extensions);
240}
241
243 : llvm::mapped_iterator<ArrayAttr::iterator,
244 spirv::Capability (*)(Attribute)>(
245 it, [](Attribute attr) {
246 return *symbolizeCapability(
247 cast<IntegerAttr>(attr).getValue().getZExtValue());
248 }) {}
249
251 auto range = getCapabilitiesAttr().getValue();
252 return {cap_iterator(range.begin()), cap_iterator(range.end())};
253}
254
256 return cast<ArrayAttr>(getImpl()->capabilities);
257}
258
260 function_ref<InFlightDiagnostic()> emitError, IntegerAttr version,
261 ArrayAttr capabilities, ArrayAttr extensions) {
262 if (!version.getType().isSignlessInteger(32))
263 return emitError() << "expected 32-bit integer for version";
264
265 if (!llvm::all_of(capabilities.getValue(), [](Attribute attr) {
266 if (auto intAttr = dyn_cast<IntegerAttr>(attr))
267 if (spirv::symbolizeCapability(intAttr.getValue().getZExtValue()))
268 return true;
269 return false;
270 }))
271 return emitError() << "unknown capability in capability list";
272
273 if (!llvm::all_of(extensions.getValue(), [](Attribute attr) {
274 if (auto strAttr = dyn_cast<StringAttr>(attr))
275 if (spirv::symbolizeExtension(strAttr.getValue()))
276 return true;
277 return false;
278 }))
279 return emitError() << "unknown extension in extension list";
280
281 return success();
282}
283
284//===----------------------------------------------------------------------===//
285// TargetEnvAttr
286//===----------------------------------------------------------------------===//
287
289 spirv::VerCapExtAttr triple, ResourceLimitsAttr limits, ClientAPI clientAPI,
290 Vendor vendorID, DeviceType deviceType, uint32_t deviceID) {
291 assert(triple && limits && "expected valid triple and limits");
292 MLIRContext *context = triple.getContext();
293 return Base::get(context, triple, clientAPI, vendorID, deviceType, deviceID,
294 limits);
295}
296
297StringRef spirv::TargetEnvAttr::getKindName() { return "target_env"; }
298
300 return cast<spirv::VerCapExtAttr>(getImpl()->triple);
301}
302
303spirv::Version spirv::TargetEnvAttr::getVersion() const {
304 return getTripleAttr().getVersion();
305}
306
310
312 return getTripleAttr().getExtensionsAttr();
313}
314
318
320 return getTripleAttr().getCapabilitiesAttr();
321}
322
323spirv::ClientAPI spirv::TargetEnvAttr::getClientAPI() const {
324 return getImpl()->clientAPI;
325}
326
328 return getImpl()->vendorID;
329}
330
331spirv::DeviceType spirv::TargetEnvAttr::getDeviceType() const {
332 return getImpl()->deviceType;
333}
334
336 return getImpl()->deviceID;
337}
338
339spirv::ResourceLimitsAttr spirv::TargetEnvAttr::getResourceLimits() const {
340 return cast<spirv::ResourceLimitsAttr>(getImpl()->limits);
341}
342
343//===----------------------------------------------------------------------===//
344// ODS Generated Attributes
345//===----------------------------------------------------------------------===//
346
347#define GET_ATTRDEF_CLASSES
348#include "mlir/Dialect/SPIRV/IR/SPIRVAttributes.cpp.inc"
349
350//===----------------------------------------------------------------------===//
351// Attribute Parsing
352//===----------------------------------------------------------------------===//
353
354/// Parses a comma-separated list of keywords, invokes `processKeyword` on each
355/// of the parsed keyword, and returns failure if any error occurs.
356static ParseResult
358 function_ref<LogicalResult(SMLoc, StringRef)> processKeyword) {
359 if (parser.parseLSquare())
360 return failure();
361
362 // Special case for empty list.
363 if (succeeded(parser.parseOptionalRSquare()))
364 return success();
365
366 // Keep parsing the keyword and an optional comma following it. If the comma
367 // is successfully parsed, then we have more keywords to parse.
368 if (failed(parser.parseCommaSeparatedList([&]() {
369 auto loc = parser.getCurrentLocation();
370 StringRef keyword;
371 if (parser.parseKeyword(&keyword) ||
372 failed(processKeyword(loc, keyword)))
373 return failure();
374 return success();
375 })))
376 return failure();
377 return parser.parseRSquare();
378}
379
380/// Parses a spirv::InterfaceVarABIAttr.
382 if (parser.parseLess())
383 return {};
384
385 Builder &builder = parser.getBuilder();
386
387 if (parser.parseLParen())
388 return {};
389
390 IntegerAttr descriptorSetAttr;
391 {
392 auto loc = parser.getCurrentLocation();
393 uint32_t descriptorSet = 0;
394 auto descriptorSetParseResult = parser.parseOptionalInteger(descriptorSet);
395
396 if (!descriptorSetParseResult.has_value() ||
397 failed(*descriptorSetParseResult)) {
398 parser.emitError(loc, "missing descriptor set");
399 return {};
400 }
401 descriptorSetAttr = builder.getI32IntegerAttr(descriptorSet);
402 }
403
404 if (parser.parseComma())
405 return {};
406
407 IntegerAttr bindingAttr;
408 {
409 auto loc = parser.getCurrentLocation();
410 uint32_t binding = 0;
411 auto bindingParseResult = parser.parseOptionalInteger(binding);
412
413 if (!bindingParseResult.has_value() || failed(*bindingParseResult)) {
414 parser.emitError(loc, "missing binding");
415 return {};
416 }
417 bindingAttr = builder.getI32IntegerAttr(binding);
418 }
419
420 if (parser.parseRParen())
421 return {};
422
423 IntegerAttr storageClassAttr;
424 {
425 if (succeeded(parser.parseOptionalComma())) {
426 auto loc = parser.getCurrentLocation();
427 StringRef storageClass;
428 if (parser.parseKeyword(&storageClass))
429 return {};
430
431 if (auto storageClassSymbol =
432 spirv::symbolizeStorageClass(storageClass)) {
433 storageClassAttr = builder.getI32IntegerAttr(
434 static_cast<uint32_t>(*storageClassSymbol));
435 } else {
436 parser.emitError(loc, "unknown storage class: ") << storageClass;
437 return {};
438 }
439 }
440 }
441
442 if (parser.parseGreater())
443 return {};
444
445 return spirv::InterfaceVarABIAttr::get(descriptorSetAttr, bindingAttr,
446 storageClassAttr);
447}
448
450 if (parser.parseLess())
451 return {};
452
453 Builder &builder = parser.getBuilder();
454
455 IntegerAttr versionAttr;
456 {
457 auto loc = parser.getCurrentLocation();
458 StringRef version;
459 if (parser.parseKeyword(&version) || parser.parseComma())
460 return {};
461
462 if (auto versionSymbol = spirv::symbolizeVersion(version)) {
463 versionAttr =
464 builder.getI32IntegerAttr(static_cast<uint32_t>(*versionSymbol));
465 } else {
466 parser.emitError(loc, "unknown version: ") << version;
467 return {};
468 }
469 }
470
471 ArrayAttr capabilitiesAttr;
472 {
473 SmallVector<Attribute, 4> capabilities;
474 SMLoc errorloc;
475 StringRef errorKeyword;
476
477 auto processCapability = [&](SMLoc loc, StringRef capability) {
478 if (auto capSymbol = spirv::symbolizeCapability(capability)) {
479 capabilities.push_back(
480 builder.getI32IntegerAttr(static_cast<uint32_t>(*capSymbol)));
481 return success();
482 }
483 return errorloc = loc, errorKeyword = capability, failure();
484 };
485 if (parseKeywordList(parser, processCapability) || parser.parseComma()) {
486 if (!errorKeyword.empty())
487 parser.emitError(errorloc, "unknown capability: ") << errorKeyword;
488 return {};
489 }
490
491 capabilitiesAttr = builder.getArrayAttr(capabilities);
492 }
493
494 ArrayAttr extensionsAttr;
495 {
496 SmallVector<Attribute, 1> extensions;
497 SMLoc errorloc;
498 StringRef errorKeyword;
499
500 auto processExtension = [&](SMLoc loc, StringRef extension) {
501 if (spirv::symbolizeExtension(extension)) {
502 extensions.push_back(builder.getStringAttr(extension));
503 return success();
504 }
505 return errorloc = loc, errorKeyword = extension, failure();
506 };
507 if (parseKeywordList(parser, processExtension)) {
508 if (!errorKeyword.empty())
509 parser.emitError(errorloc, "unknown extension: ") << errorKeyword;
510 return {};
511 }
512
513 extensionsAttr = builder.getArrayAttr(extensions);
514 }
515
516 if (parser.parseGreater())
517 return {};
518
519 return spirv::VerCapExtAttr::get(versionAttr, capabilitiesAttr,
520 extensionsAttr);
521}
522
523/// Parses a spirv::TargetEnvAttr.
525 if (parser.parseLess())
526 return {};
527
528 spirv::VerCapExtAttr tripleAttr;
529 if (parser.parseAttribute(tripleAttr) || parser.parseComma())
530 return {};
531
532 auto clientAPI = spirv::ClientAPI::Unknown;
533 if (succeeded(parser.parseOptionalKeyword("api"))) {
534 if (parser.parseEqual())
535 return {};
536 auto loc = parser.getCurrentLocation();
537 StringRef apiStr;
538 if (parser.parseKeyword(&apiStr))
539 return {};
540 if (auto apiSymbol = spirv::symbolizeClientAPI(apiStr))
541 clientAPI = *apiSymbol;
542 else
543 parser.emitError(loc, "unknown client API: ") << apiStr;
544 if (parser.parseComma())
545 return {};
546 }
547
548 // Parse [vendor[:device-type[:device-id]]]
549 Vendor vendorID = Vendor::Unknown;
550 DeviceType deviceType = DeviceType::Unknown;
551 uint32_t deviceID = spirv::TargetEnvAttr::kUnknownDeviceID;
552 {
553 auto loc = parser.getCurrentLocation();
554 StringRef vendorStr;
555 if (succeeded(parser.parseOptionalKeyword(&vendorStr))) {
556 if (auto vendorSymbol = spirv::symbolizeVendor(vendorStr))
557 vendorID = *vendorSymbol;
558 else
559 parser.emitError(loc, "unknown vendor: ") << vendorStr;
560
561 if (succeeded(parser.parseOptionalColon())) {
562 loc = parser.getCurrentLocation();
563 StringRef deviceTypeStr;
564 if (parser.parseKeyword(&deviceTypeStr))
565 return {};
566 if (auto deviceTypeSymbol = spirv::symbolizeDeviceType(deviceTypeStr))
567 deviceType = *deviceTypeSymbol;
568 else
569 parser.emitError(loc, "unknown device type: ") << deviceTypeStr;
570
571 if (succeeded(parser.parseOptionalColon())) {
572 loc = parser.getCurrentLocation();
573 if (parser.parseInteger(deviceID))
574 return {};
575 }
576 }
577 if (parser.parseComma())
578 return {};
579 }
580 }
581
582 ResourceLimitsAttr limitsAttr;
583 if (parser.parseAttribute(limitsAttr) || parser.parseGreater())
584 return {};
585
586 return spirv::TargetEnvAttr::get(tripleAttr, limitsAttr, clientAPI, vendorID,
587 deviceType, deviceID);
588}
589
590Attribute SPIRVDialect::parseAttribute(DialectAsmParser &parser,
591 Type type) const {
592 // SPIR-V attributes are dictionaries so they do not have type.
593 if (type) {
594 parser.emitError(parser.getNameLoc(), "unexpected type");
595 return {};
596 }
597
598 // Parse the kind keyword first.
599 StringRef attrKind;
600 Attribute attr;
601 OptionalParseResult result =
602 generatedAttributeParser(parser, &attrKind, type, attr);
603 if (result.has_value())
604 return attr;
605
606 if (attrKind == spirv::TargetEnvAttr::getKindName())
607 return parseTargetEnvAttr(parser);
608 if (attrKind == spirv::VerCapExtAttr::getKindName())
609 return parseVerCapExtAttr(parser);
611 return parseInterfaceVarABIAttr(parser);
612
613 parser.emitError(parser.getNameLoc(), "unknown SPIR-V attribute kind: ")
614 << attrKind;
615 return {};
616}
617
618//===----------------------------------------------------------------------===//
619// Attribute Printing
620//===----------------------------------------------------------------------===//
621
622static void print(spirv::VerCapExtAttr triple, DialectAsmPrinter &printer) {
623 printer << spirv::VerCapExtAttr::getKindName() << "<"
624 << spirv::stringifyVersion(triple.getVersion()) << ", "
625 << llvm::interleaved_array(llvm::map_range(
626 triple.getCapabilities(), spirv::stringifyCapability))
627 << ", "
628 << llvm::interleaved_array(
629 triple.getExtensionsAttr().getAsValueRange<StringAttr>())
630 << ">";
631}
632
633static void print(spirv::TargetEnvAttr targetEnv, DialectAsmPrinter &printer) {
634 printer << spirv::TargetEnvAttr::getKindName() << "<#spirv.";
635 print(targetEnv.getTripleAttr(), printer);
636 auto clientAPI = targetEnv.getClientAPI();
637 if (clientAPI != spirv::ClientAPI::Unknown)
638 printer << ", api=" << clientAPI;
639 spirv::Vendor vendorID = targetEnv.getVendorID();
640 spirv::DeviceType deviceType = targetEnv.getDeviceType();
641 uint32_t deviceID = targetEnv.getDeviceID();
642 if (vendorID != spirv::Vendor::Unknown) {
643 printer << ", " << spirv::stringifyVendor(vendorID);
644 if (deviceType != spirv::DeviceType::Unknown) {
645 printer << ":" << spirv::stringifyDeviceType(deviceType);
647 printer << ":" << deviceID;
648 }
649 }
650 printer << ", " << targetEnv.getResourceLimits() << ">";
651}
652
653static void print(spirv::InterfaceVarABIAttr interfaceVarABIAttr,
654 DialectAsmPrinter &printer) {
655 printer << spirv::InterfaceVarABIAttr::getKindName() << "<("
656 << interfaceVarABIAttr.getDescriptorSet() << ", "
657 << interfaceVarABIAttr.getBinding() << ")";
658 auto storageClass = interfaceVarABIAttr.getStorageClass();
659 if (storageClass)
660 printer << ", " << spirv::stringifyStorageClass(*storageClass);
661 printer << ">";
662}
663
664void SPIRVDialect::printAttribute(Attribute attr,
665 DialectAsmPrinter &printer) const {
666 if (succeeded(generatedAttributePrinter(attr, printer)))
667 return;
668
669 if (auto targetEnv = dyn_cast<TargetEnvAttr>(attr))
670 print(targetEnv, printer);
671 else if (auto vceAttr = dyn_cast<VerCapExtAttr>(attr))
672 print(vceAttr, printer);
673 else if (auto interfaceVarABIAttr = dyn_cast<InterfaceVarABIAttr>(attr))
674 print(interfaceVarABIAttr, printer);
675 else
676 llvm_unreachable("unhandled SPIR-V attribute kind");
677}
678
679//===----------------------------------------------------------------------===//
680// SPIR-V Dialect
681//===----------------------------------------------------------------------===//
682
683void spirv::SPIRVDialect::registerAttributes() {
684 addAttributes<InterfaceVarABIAttr, TargetEnvAttr, VerCapExtAttr>();
685 addAttributes<
686#define GET_ATTRDEF_LIST
687#include "mlir/Dialect/SPIRV/IR/SPIRVAttributes.cpp.inc"
688 >();
689}
return success()
b
Return true if permutation is a valid permutation of the outer_dims_perm (case OuterOrInnerPerm::Oute...
ArrayAttr()
static Attribute parseTargetEnvAttr(DialectAsmParser &parser)
Parses a spirv::TargetEnvAttr.
static ParseResult parseKeywordList(DialectAsmParser &parser, function_ref< LogicalResult(SMLoc, StringRef)> processKeyword)
Parses a comma-separated list of keywords, invokes processKeyword on each of the parsed keyword,...
static void print(spirv::VerCapExtAttr triple, DialectAsmPrinter &printer)
static Attribute parseVerCapExtAttr(DialectAsmParser &parser)
static Attribute parseInterfaceVarABIAttr(DialectAsmParser &parser)
Parses a spirv::InterfaceVarABIAttr.
virtual OptionalParseResult parseOptionalInteger(APInt &result)=0
Parse an optional integer value from the stream.
virtual Builder & getBuilder() const =0
Return a builder which provides useful access to MLIRContext, global objects like types and attribute...
virtual ParseResult parseCommaSeparatedList(Delimiter delimiter, function_ref< ParseResult()> parseElementFn, StringRef contextMessage=StringRef())=0
Parse a list of comma-separated items with an optional delimiter.
virtual ParseResult parseOptionalKeyword(StringRef keyword)=0
Parse the given keyword if present.
virtual ParseResult parseRParen()=0
Parse a ) token.
virtual InFlightDiagnostic emitError(SMLoc loc, const Twine &message={})=0
Emit a diagnostic at the specified location and return failure.
virtual ParseResult parseOptionalColon()=0
Parse a : token if present.
virtual ParseResult parseLSquare()=0
Parse a [ token.
virtual ParseResult parseRSquare()=0
Parse a ] token.
ParseResult parseInteger(IntT &result)
Parse an integer value from the stream.
virtual ParseResult parseLess()=0
Parse a '<' token.
virtual ParseResult parseEqual()=0
Parse a = token.
virtual SMLoc getCurrentLocation()=0
Get the location of the next token and store it into the argument.
virtual ParseResult parseOptionalComma()=0
Parse a , token if present.
virtual SMLoc getNameLoc() const =0
Return the location of the original name token.
virtual ParseResult parseOptionalRSquare()=0
Parse a ] token if present.
virtual ParseResult parseGreater()=0
Parse a '>' token.
virtual ParseResult parseLParen()=0
Parse a ( token.
virtual ParseResult parseComma()=0
Parse a , token.
ParseResult parseKeyword(StringRef keyword)
Parse a given keyword.
virtual ParseResult parseAttribute(Attribute &result, Type type={})=0
Parse an arbitrary attribute of a given type and return it in result.
Base storage class appearing in an attribute.
Attributes are known-constant values of operations.
Definition Attributes.h:25
This class is a general helper class for creating context-global objects like types,...
Definition Builders.h:51
IntegerAttr getI32IntegerAttr(int32_t value)
Definition Builders.cpp:200
StringAttr getStringAttr(const Twine &bytes)
Definition Builders.cpp:262
ArrayAttr getArrayAttr(ArrayRef< Attribute > value)
Definition Builders.cpp:266
The DialectAsmParser has methods for interacting with the asm parser when parsing attributes and type...
This is a pure-virtual base class that exposes the asmprinter hooks necessary to implement a custom p...
This class represents a diagnostic that is inflight and set to be reported.
MLIRContext is the top-level object for a collection of MLIR operations.
Definition MLIRContext.h:63
T * allocate()
Allocate an instance of the provided type.
An attribute that specifies the information regarding the interface variable: descriptor set,...
uint32_t getBinding()
Returns binding.
static StringRef getKindName()
Returns the attribute kind's name (without the 'spirv.' prefix).
uint32_t getDescriptorSet()
Returns descriptor set.
static InterfaceVarABIAttr get(uint32_t descriptorSet, uint32_t binding, std::optional< StorageClass > storageClass, MLIRContext *context)
Gets a InterfaceVarABIAttr.
static LogicalResult verifyInvariants(function_ref< InFlightDiagnostic()> emitError, IntegerAttr descriptorSet, IntegerAttr binding, IntegerAttr storageClass)
std::optional< StorageClass > getStorageClass()
Returns spirv::StorageClass.
An attribute that specifies the target version, allowed extensions and capabilities,...
Version getVersion() const
Returns the target version.
VerCapExtAttr::cap_range getCapabilities()
Returns the target capabilities.
ResourceLimitsAttr getResourceLimits() const
Returns the target resource limits.
static StringRef getKindName()
Returns the attribute kind's name (without the 'spirv.' prefix).
VerCapExtAttr getTripleAttr() const
Returns the (version, capabilities, extensions) triple attribute.
ArrayAttr getCapabilitiesAttr()
Returns the target capabilities as an integer array attribute.
VerCapExtAttr::ext_range getExtensions()
Returns the target extensions.
Vendor getVendorID() const
Returns the vendor ID.
DeviceType getDeviceType() const
Returns the device type.
ClientAPI getClientAPI() const
Returns the client API.
ArrayAttr getExtensionsAttr()
Returns the target extensions as a string array attribute.
uint32_t getDeviceID() const
Returns the device ID.
static constexpr uint32_t kUnknownDeviceID
ID for unknown devices.
static TargetEnvAttr get(VerCapExtAttr triple, ResourceLimitsAttr limits, ClientAPI clientAPI=ClientAPI::Unknown, Vendor vendorID=Vendor::Unknown, DeviceType deviceType=DeviceType::Unknown, uint32_t deviceId=kUnknownDeviceID)
Gets a TargetEnvAttr instance.
An attribute that specifies the SPIR-V (version, capabilities, extensions) triple.
cap_range getCapabilities()
Returns the capabilities.
static LogicalResult verifyInvariants(function_ref< InFlightDiagnostic()> emitError, IntegerAttr version, ArrayAttr capabilities, ArrayAttr extensions)
Version getVersion()
Returns the version.
static StringRef getKindName()
Returns the attribute kind's name (without the 'spirv.' prefix).
static VerCapExtAttr get(Version version, ArrayRef< Capability > capabilities, ArrayRef< Extension > extensions, MLIRContext *context)
Gets a VerCapExtAttr instance.
ArrayAttr getCapabilitiesAttr()
Returns the capabilities as an integer array attribute.
llvm::iterator_range< ext_iterator > ext_range
ext_range getExtensions()
Returns the extensions.
ArrayAttr getExtensionsAttr()
Returns the extensions as a string array attribute.
llvm::iterator_range< cap_iterator > cap_range
The OpAsmOpInterface, see OpAsmInterface.td for more details.
Definition CallGraph.h:229
Include the generated interface declarations.
InFlightDiagnostic emitError(Location loc)
Utility method to emit an error message using this location.
StorageUniquer::StorageAllocator AttributeStorageAllocator
auto get(MLIRContext *context, Ts &&...params)
Helper method that injects context only if needed, this helps unify some of the attribute constructio...
llvm::function_ref< Fn > function_ref
Definition LLVM.h:152
InterfaceVarABIAttributeStorage(Attribute descriptorSet, Attribute binding, Attribute storageClass)
std::tuple< Attribute, Attribute, Attribute > KeyTy
static InterfaceVarABIAttributeStorage * construct(AttributeStorageAllocator &allocator, const KeyTy &key)
std::tuple< Attribute, ClientAPI, Vendor, DeviceType, uint32_t, Attribute > KeyTy
TargetEnvAttributeStorage(Attribute triple, ClientAPI clientAPI, Vendor vendorID, DeviceType deviceType, uint32_t deviceID, Attribute limits)
static TargetEnvAttributeStorage * construct(AttributeStorageAllocator &allocator, const KeyTy &key)
std::tuple< Attribute, Attribute, Attribute > KeyTy
static VerCapExtAttributeStorage * construct(AttributeStorageAllocator &allocator, const KeyTy &key)
VerCapExtAttributeStorage(Attribute version, Attribute capabilities, Attribute extensions)