| //===- SPIRVAttributes.h - SPIR-V attribute declarations -------*- C++ -*-===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file declares SPIR-V dialect specific attributes. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef MLIR_DIALECT_SPIRV_IR_SPIRVATTRIBUTES_H |
| #define MLIR_DIALECT_SPIRV_IR_SPIRVATTRIBUTES_H |
| |
| #include "mlir/Dialect/SPIRV/IR/SPIRVTypes.h" |
| #include "mlir/IR/BuiltinAttributes.h" |
| #include "mlir/Support/LLVM.h" |
| |
| // Pull in TableGen'erated SPIR-V attribute definitions for target and ABI. |
| #include "mlir/Dialect/SPIRV/IR/TargetAndABI.h.inc" |
| |
| namespace mlir { |
| namespace spirv { |
| enum class Capability : uint32_t; |
| enum class DeviceType; |
| enum class Extension; |
| enum class Vendor; |
| enum class Version : uint32_t; |
| |
| namespace detail { |
| struct InterfaceVarABIAttributeStorage; |
| struct TargetEnvAttributeStorage; |
| struct VerCapExtAttributeStorage; |
| } // namespace detail |
| |
| // TableGen'erated helper functions. |
| // |
| // Get the name used in the Op to refer to an enum value of the given |
| // `EnumClass`. |
| // template <typename EnumClass> StringRef attributeName(); |
| // |
| #include "mlir/Dialect/SPIRV/IR/SPIRVAttrUtils.inc" |
| |
| /// An attribute that specifies the information regarding the interface |
| /// variable: descriptor set, binding, storage class. |
| class InterfaceVarABIAttr |
| : public Attribute::AttrBase<InterfaceVarABIAttr, Attribute, |
| detail::InterfaceVarABIAttributeStorage> { |
| public: |
| using Base::Base; |
| |
| /// Gets a InterfaceVarABIAttr. |
| static InterfaceVarABIAttr get(uint32_t descriptorSet, uint32_t binding, |
| Optional<StorageClass> storageClass, |
| MLIRContext *context); |
| static InterfaceVarABIAttr get(IntegerAttr descriptorSet, IntegerAttr binding, |
| IntegerAttr storageClass); |
| |
| /// Returns the attribute kind's name (without the 'spv.' prefix). |
| static StringRef getKindName(); |
| |
| /// Returns descriptor set. |
| uint32_t getDescriptorSet(); |
| |
| /// Returns binding. |
| uint32_t getBinding(); |
| |
| /// Returns `spirv::StorageClass`. |
| Optional<StorageClass> getStorageClass(); |
| |
| static LogicalResult verify(function_ref<InFlightDiagnostic()> emitError, |
| IntegerAttr descriptorSet, IntegerAttr binding, |
| IntegerAttr storageClass); |
| }; |
| |
| /// An attribute that specifies the SPIR-V (version, capabilities, extensions) |
| /// triple. |
| class VerCapExtAttr |
| : public Attribute::AttrBase<VerCapExtAttr, Attribute, |
| detail::VerCapExtAttributeStorage> { |
| public: |
| using Base::Base; |
| |
| /// Gets a VerCapExtAttr instance. |
| static VerCapExtAttr get(Version version, ArrayRef<Capability> capabilities, |
| ArrayRef<Extension> extensions, |
| MLIRContext *context); |
| static VerCapExtAttr get(IntegerAttr version, ArrayAttr capabilities, |
| ArrayAttr extensions); |
| |
| /// Returns the attribute kind's name (without the 'spv.' prefix). |
| static StringRef getKindName(); |
| |
| /// Returns the version. |
| Version getVersion(); |
| |
| struct ext_iterator final |
| : public llvm::mapped_iterator<ArrayAttr::iterator, |
| Extension (*)(Attribute)> { |
| explicit ext_iterator(ArrayAttr::iterator it); |
| }; |
| using ext_range = llvm::iterator_range<ext_iterator>; |
| |
| /// Returns the extensions. |
| ext_range getExtensions(); |
| /// Returns the extensions as a string array attribute. |
| ArrayAttr getExtensionsAttr(); |
| |
| struct cap_iterator final |
| : public llvm::mapped_iterator<ArrayAttr::iterator, |
| Capability (*)(Attribute)> { |
| explicit cap_iterator(ArrayAttr::iterator it); |
| }; |
| using cap_range = llvm::iterator_range<cap_iterator>; |
| |
| /// Returns the capabilities. |
| cap_range getCapabilities(); |
| /// Returns the capabilities as an integer array attribute. |
| ArrayAttr getCapabilitiesAttr(); |
| |
| static LogicalResult verify(function_ref<InFlightDiagnostic()> emitError, |
| IntegerAttr version, ArrayAttr capabilities, |
| ArrayAttr extensions); |
| }; |
| |
| /// An attribute that specifies the target version, allowed extensions and |
| /// capabilities, and resource limits. These information describes a SPIR-V |
| /// target environment. |
| class TargetEnvAttr |
| : public Attribute::AttrBase<TargetEnvAttr, Attribute, |
| detail::TargetEnvAttributeStorage> { |
| public: |
| /// ID for unknown devices. |
| static constexpr uint32_t kUnknownDeviceID = 0x7FFFFFFF; |
| |
| using Base::Base; |
| |
| /// Gets a TargetEnvAttr instance. |
| static TargetEnvAttr get(VerCapExtAttr triple, Vendor vendorID, |
| DeviceType deviceType, uint32_t deviceId, |
| DictionaryAttr limits); |
| |
| /// Returns the attribute kind's name (without the 'spv.' prefix). |
| static StringRef getKindName(); |
| |
| /// Returns the (version, capabilities, extensions) triple attribute. |
| VerCapExtAttr getTripleAttr() const; |
| |
| /// Returns the target version. |
| Version getVersion() const; |
| |
| /// Returns the target extensions. |
| VerCapExtAttr::ext_range getExtensions(); |
| /// Returns the target extensions as a string array attribute. |
| ArrayAttr getExtensionsAttr(); |
| |
| /// Returns the target capabilities. |
| VerCapExtAttr::cap_range getCapabilities(); |
| /// Returns the target capabilities as an integer array attribute. |
| ArrayAttr getCapabilitiesAttr(); |
| |
| /// Returns the vendor ID. |
| Vendor getVendorID() const; |
| |
| /// Returns the device type. |
| DeviceType getDeviceType() const; |
| |
| /// Returns the device ID. |
| uint32_t getDeviceID() const; |
| |
| /// Returns the target resource limits. |
| ResourceLimitsAttr getResourceLimits() const; |
| |
| static LogicalResult verify(function_ref<InFlightDiagnostic()> emitError, |
| VerCapExtAttr triple, Vendor vendorID, |
| DeviceType deviceType, uint32_t deviceID, |
| DictionaryAttr limits); |
| }; |
| } // namespace spirv |
| } // namespace mlir |
| |
| #endif // MLIR_DIALECT_SPIRV_IR_SPIRVATTRIBUTES_H |