MLIR  20.0.0git
SPIRVAttributes.h
Go to the documentation of this file.
1 //===- SPIRVAttributes.h - SPIR-V attribute declarations -------*- 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 declares SPIR-V dialect specific attributes.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #ifndef MLIR_DIALECT_SPIRV_IR_SPIRVATTRIBUTES_H
14 #define MLIR_DIALECT_SPIRV_IR_SPIRVATTRIBUTES_H
15 
18 #include "mlir/Support/LLVM.h"
19 
20 namespace mlir {
21 namespace spirv {
22 class VerCapExtAttr;
23 }
24 } // namespace mlir
25 
26 // Pull in TableGen'erated SPIR-V attribute definitions for target and ABI.
27 #define GET_ATTRDEF_CLASSES
28 #include "mlir/Dialect/SPIRV/IR/SPIRVAttributes.h.inc"
29 
30 namespace mlir {
31 namespace spirv {
32 enum class Capability : uint32_t;
33 enum class DeviceType : uint32_t;
34 enum class Extension : uint32_t;
35 enum class Vendor : uint32_t;
36 enum class Version : uint32_t;
37 
38 namespace detail {
42 } // namespace detail
43 
44 // TableGen'erated helper functions.
45 //
46 // Get the name used in the Op to refer to an enum value of the given
47 // `EnumClass`.
48 // template <typename EnumClass> StringRef attributeName();
49 //
50 #include "mlir/Dialect/SPIRV/IR/SPIRVAttrUtils.inc"
51 
52 /// An attribute that specifies the information regarding the interface
53 /// variable: descriptor set, binding, storage class.
55  : public Attribute::AttrBase<InterfaceVarABIAttr, Attribute,
56  detail::InterfaceVarABIAttributeStorage> {
57 public:
58  using Base::Base;
59 
60  /// Gets a InterfaceVarABIAttr.
61  static InterfaceVarABIAttr get(uint32_t descriptorSet, uint32_t binding,
62  std::optional<StorageClass> storageClass,
63  MLIRContext *context);
64  static InterfaceVarABIAttr get(IntegerAttr descriptorSet, IntegerAttr binding,
65  IntegerAttr storageClass);
66 
67  /// Returns the attribute kind's name (without the 'spirv.' prefix).
68  static StringRef getKindName();
69 
70  /// Returns descriptor set.
71  uint32_t getDescriptorSet();
72 
73  /// Returns binding.
74  uint32_t getBinding();
75 
76  /// Returns `spirv::StorageClass`.
77  std::optional<StorageClass> getStorageClass();
78 
79  static LogicalResult
81  IntegerAttr descriptorSet, IntegerAttr binding,
82  IntegerAttr storageClass);
83 
84  static constexpr StringLiteral name = "spirv.interface_var_abi";
85 };
86 
87 /// An attribute that specifies the SPIR-V (version, capabilities, extensions)
88 /// triple.
90  : public Attribute::AttrBase<VerCapExtAttr, Attribute,
91  detail::VerCapExtAttributeStorage> {
92 public:
93  using Base::Base;
94 
95  /// Gets a VerCapExtAttr instance.
96  static VerCapExtAttr get(Version version, ArrayRef<Capability> capabilities,
97  ArrayRef<Extension> extensions,
98  MLIRContext *context);
99  static VerCapExtAttr get(IntegerAttr version, ArrayAttr capabilities,
100  ArrayAttr extensions);
101 
102  /// Returns the attribute kind's name (without the 'spirv.' prefix).
103  static StringRef getKindName();
104 
105  /// Returns the version.
106  Version getVersion();
107 
108  struct ext_iterator final
109  : public llvm::mapped_iterator<ArrayAttr::iterator,
110  Extension (*)(Attribute)> {
111  explicit ext_iterator(ArrayAttr::iterator it);
112  };
114 
115  /// Returns the extensions.
117  /// Returns the extensions as a string array attribute.
118  ArrayAttr getExtensionsAttr();
119 
120  struct cap_iterator final
121  : public llvm::mapped_iterator<ArrayAttr::iterator,
122  Capability (*)(Attribute)> {
123  explicit cap_iterator(ArrayAttr::iterator it);
124  };
126 
127  /// Returns the capabilities.
129  /// Returns the capabilities as an integer array attribute.
130  ArrayAttr getCapabilitiesAttr();
131 
132  static LogicalResult
134  IntegerAttr version, ArrayAttr capabilities,
135  ArrayAttr extensions);
136 
137  static constexpr StringLiteral name = "spirv.ver_cap_ext";
138 };
139 
140 /// An attribute that specifies the target version, allowed extensions and
141 /// capabilities, and resource limits. These information describes a SPIR-V
142 /// target environment.
144  : public Attribute::AttrBase<TargetEnvAttr, Attribute,
145  detail::TargetEnvAttributeStorage> {
146 public:
147  /// ID for unknown devices.
148  static constexpr uint32_t kUnknownDeviceID = 0x7FFFFFFF;
149 
150  using Base::Base;
151 
152  /// Gets a TargetEnvAttr instance.
153  static TargetEnvAttr get(VerCapExtAttr triple, ResourceLimitsAttr limits,
154  ClientAPI clientAPI = ClientAPI::Unknown,
155  Vendor vendorID = Vendor::Unknown,
156  DeviceType deviceType = DeviceType::Unknown,
157  uint32_t deviceId = kUnknownDeviceID);
158 
159  /// Returns the attribute kind's name (without the 'spirv.' prefix).
160  static StringRef getKindName();
161 
162  /// Returns the (version, capabilities, extensions) triple attribute.
164 
165  /// Returns the target version.
166  Version getVersion() const;
167 
168  /// Returns the target extensions.
170  /// Returns the target extensions as a string array attribute.
171  ArrayAttr getExtensionsAttr();
172 
173  /// Returns the target capabilities.
175  /// Returns the target capabilities as an integer array attribute.
176  ArrayAttr getCapabilitiesAttr();
177 
178  /// Returns the client API.
179  ClientAPI getClientAPI() const;
180 
181  /// Returns the vendor ID.
182  Vendor getVendorID() const;
183 
184  /// Returns the device type.
185  DeviceType getDeviceType() const;
186 
187  /// Returns the device ID.
188  uint32_t getDeviceID() const;
189 
190  /// Returns the target resource limits.
191  ResourceLimitsAttr getResourceLimits() const;
192 
193  static constexpr StringLiteral name = "spirv.target_env";
194 };
195 } // namespace spirv
196 } // namespace mlir
197 
198 #endif // MLIR_DIALECT_SPIRV_IR_SPIRVATTRIBUTES_H
This class represents a diagnostic that is inflight and set to be reported.
Definition: Diagnostics.h:314
MLIRContext is the top-level object for a collection of MLIR operations.
Definition: MLIRContext.h:60
Utility class for implementing users of storage classes uniqued by a StorageUniquer.
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).
static constexpr StringLiteral name
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.
static constexpr StringLiteral name
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.
static constexpr StringLiteral name
ext_range getExtensions()
Returns the extensions.
ArrayAttr getExtensionsAttr()
Returns the extensions as a string array attribute.
Include the generated interface declarations.
InFlightDiagnostic emitError(Location loc)
Utility method to emit an error message using this location.