[Mlir-commits] [mlir] c818c3c - [mlir][spirv] NFC: put SPIR-V attributes in separate files
Lei Zhang
llvmlistbot at llvm.org
Thu Mar 12 16:39:53 PDT 2020
Author: Lei Zhang
Date: 2020-03-12T19:37:45-04:00
New Revision: c818c3cc96ec0894fc08e490a74066da57f7b6d3
URL: https://github.com/llvm/llvm-project/commit/c818c3cc96ec0894fc08e490a74066da57f7b6d3
DIFF: https://github.com/llvm/llvm-project/commit/c818c3cc96ec0894fc08e490a74066da57f7b6d3.diff
LOG: [mlir][spirv] NFC: put SPIR-V attributes in separate files
Differential Revision: https://reviews.llvm.org/D75871
Added:
mlir/include/mlir/Dialect/SPIRV/SPIRVAttributes.h
mlir/lib/Dialect/SPIRV/SPIRVAttributes.cpp
Modified:
mlir/include/mlir/Dialect/SPIRV/TargetAndABI.h
mlir/lib/Dialect/SPIRV/CMakeLists.txt
mlir/lib/Dialect/SPIRV/TargetAndABI.cpp
Removed:
################################################################################
diff --git a/mlir/include/mlir/Dialect/SPIRV/SPIRVAttributes.h b/mlir/include/mlir/Dialect/SPIRV/SPIRVAttributes.h
new file mode 100644
index 000000000000..4e1eb1271b59
--- /dev/null
+++ b/mlir/include/mlir/Dialect/SPIRV/SPIRVAttributes.h
@@ -0,0 +1,137 @@
+//===- 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_SPIRVATTRIBUTES_H
+#define MLIR_DIALECT_SPIRV_SPIRVATTRIBUTES_H
+
+#include "mlir/IR/Attributes.h"
+#include "mlir/Support/LLVM.h"
+
+namespace mlir {
+// Pull in SPIR-V attribute definitions for target and ABI.
+#include "mlir/Dialect/SPIRV/TargetAndABI.h.inc"
+
+namespace spirv {
+enum class Capability : uint32_t;
+enum class Extension;
+enum class Version : uint32_t;
+
+namespace detail {
+struct TargetEnvAttributeStorage;
+struct VerCapExtAttributeStorage;
+} // namespace detail
+
+/// SPIR-V dialect-specific attribute kinds.
+namespace AttrKind {
+enum Kind {
+ TargetEnv = Attribute::FIRST_SPIRV_ATTR, /// Target environment
+ VerCapExt, /// (version, extension, capability) triple
+};
+} // namespace AttrKind
+
+/// 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 bool kindof(unsigned kind) { return kind == AttrKind::VerCapExt; }
+
+ static LogicalResult verifyConstructionInvariants(Location loc,
+ IntegerAttr version,
+ ArrayAttr capabilities,
+ ArrayAttr extensions);
+};
+
+/// An attribute that specifies the target version, allowed extensions and
+/// capabilities, and resource limits. These information describles a SPIR-V
+/// target environment.
+class TargetEnvAttr
+ : public Attribute::AttrBase<TargetEnvAttr, Attribute,
+ detail::TargetEnvAttributeStorage> {
+public:
+ using Base::Base;
+
+ /// Gets a TargetEnvAttr instance.
+ static TargetEnvAttr get(VerCapExtAttr triple, DictionaryAttr limits);
+
+ /// Returns the attribute kind's name (without the 'spv.' prefix).
+ static StringRef getKindName();
+
+ /// Returns the (version, capabilities, extensions) triple attribute.
+ VerCapExtAttr getTripleAttr();
+
+ /// Returns the target version.
+ Version getVersion();
+
+ /// 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 target resource limits.
+ ResourceLimitsAttr getResourceLimits();
+
+ static bool kindof(unsigned kind) { return kind == AttrKind::TargetEnv; }
+
+ static LogicalResult verifyConstructionInvariants(Location loc,
+ VerCapExtAttr triple,
+ DictionaryAttr limits);
+};
+} // namespace spirv
+} // namespace mlir
+
+#endif // MLIR_DIALECT_SPIRV_SPIRVATTRIBUTES_H
diff --git a/mlir/include/mlir/Dialect/SPIRV/TargetAndABI.h b/mlir/include/mlir/Dialect/SPIRV/TargetAndABI.h
index d00468007446..5ffd00c530c6 100644
--- a/mlir/include/mlir/Dialect/SPIRV/TargetAndABI.h
+++ b/mlir/include/mlir/Dialect/SPIRV/TargetAndABI.h
@@ -13,130 +13,14 @@
#ifndef MLIR_DIALECT_SPIRV_TARGETANDABI_H
#define MLIR_DIALECT_SPIRV_TARGETANDABI_H
-#include "mlir/IR/Attributes.h"
+#include "mlir/Dialect/SPIRV/SPIRVAttributes.h"
#include "mlir/Support/LLVM.h"
namespace mlir {
-class OpBuilder;
class Operation;
-class Value;
-
-// Pull in SPIR-V attribute definitions.
-#include "mlir/Dialect/SPIRV/TargetAndABI.h.inc"
namespace spirv {
-enum class Capability : uint32_t;
-enum class Extension;
enum class StorageClass : uint32_t;
-enum class Version : uint32_t;
-
-namespace detail {
-struct TargetEnvAttributeStorage;
-struct VerCapExtAttributeStorage;
-} // namespace detail
-
-/// SPIR-V dialect-specific attribute kinds.
-// TODO(antiagainst): move to a more suitable place if we have more attributes.
-namespace AttrKind {
-enum Kind {
- TargetEnv = Attribute::FIRST_SPIRV_ATTR, /// Target environment
- VerCapExt, /// (version, extension, capability) triple
-};
-} // namespace AttrKind
-
-/// 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 bool kindof(unsigned kind) { return kind == AttrKind::VerCapExt; }
-
- static LogicalResult verifyConstructionInvariants(Location loc,
- IntegerAttr version,
- ArrayAttr capabilities,
- ArrayAttr extensions);
-};
-
-/// An attribute that specifies the target version, allowed extensions and
-/// capabilities, and resource limits. These information describles a SPIR-V
-/// target environment.
-class TargetEnvAttr
- : public Attribute::AttrBase<TargetEnvAttr, Attribute,
- detail::TargetEnvAttributeStorage> {
-public:
- using Base::Base;
-
- /// Gets a TargetEnvAttr instance.
- static TargetEnvAttr get(VerCapExtAttr triple, DictionaryAttr limits);
-
- /// Returns the attribute kind's name (without the 'spv.' prefix).
- static StringRef getKindName();
-
- /// Returns the (version, capabilities, extensions) triple attribute.
- VerCapExtAttr getTripleAttr();
-
- /// Returns the target version.
- Version getVersion();
-
- /// 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 target resource limits.
- ResourceLimitsAttr getResourceLimits();
-
- static bool kindof(unsigned kind) { return kind == AttrKind::TargetEnv; }
-
- static LogicalResult verifyConstructionInvariants(Location loc,
- VerCapExtAttr triple,
- DictionaryAttr limits);
-};
/// Returns the attribute name for specifying argument ABI information.
StringRef getInterfaceVarABIAttrName();
diff --git a/mlir/lib/Dialect/SPIRV/CMakeLists.txt b/mlir/lib/Dialect/SPIRV/CMakeLists.txt
index aa1d23556370..afb7497b9e7c 100644
--- a/mlir/lib/Dialect/SPIRV/CMakeLists.txt
+++ b/mlir/lib/Dialect/SPIRV/CMakeLists.txt
@@ -4,6 +4,7 @@ add_public_tablegen_target(MLIRSPIRVCanonicalizationIncGen)
add_mlir_dialect_library(MLIRSPIRV
LayoutUtils.cpp
+ SPIRVAttributes.cpp
SPIRVCanonicalization.cpp
SPIRVDialect.cpp
SPIRVOps.cpp
diff --git a/mlir/lib/Dialect/SPIRV/SPIRVAttributes.cpp b/mlir/lib/Dialect/SPIRV/SPIRVAttributes.cpp
new file mode 100644
index 000000000000..4ce42a5a7ee1
--- /dev/null
+++ b/mlir/lib/Dialect/SPIRV/SPIRVAttributes.cpp
@@ -0,0 +1,220 @@
+//===- SPIRVAttributes.cpp - SPIR-V attribute definitions -----------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+#include "mlir/Dialect/SPIRV/SPIRVAttributes.h"
+#include "mlir/Dialect/SPIRV/SPIRVTypes.h"
+#include "mlir/IR/Builders.h"
+
+using namespace mlir;
+
+//===----------------------------------------------------------------------===//
+// DictionaryDict derived attributes
+//===----------------------------------------------------------------------===//
+
+namespace mlir {
+#include "mlir/Dialect/SPIRV/TargetAndABI.cpp.inc"
+
+//===----------------------------------------------------------------------===//
+// Attribute storage classes
+//===----------------------------------------------------------------------===//
+
+namespace spirv {
+namespace detail {
+struct VerCapExtAttributeStorage : public AttributeStorage {
+ using KeyTy = std::tuple<Attribute, Attribute, Attribute>;
+
+ VerCapExtAttributeStorage(Attribute version, Attribute capabilities,
+ Attribute extensions)
+ : version(version), capabilities(capabilities), extensions(extensions) {}
+
+ bool operator==(const KeyTy &key) const {
+ return std::get<0>(key) == version && std::get<1>(key) == capabilities &&
+ std::get<2>(key) == extensions;
+ }
+
+ static VerCapExtAttributeStorage *
+ construct(AttributeStorageAllocator &allocator, const KeyTy &key) {
+ return new (allocator.allocate<VerCapExtAttributeStorage>())
+ VerCapExtAttributeStorage(std::get<0>(key), std::get<1>(key),
+ std::get<2>(key));
+ }
+
+ Attribute version;
+ Attribute capabilities;
+ Attribute extensions;
+};
+
+struct TargetEnvAttributeStorage : public AttributeStorage {
+ using KeyTy = std::pair<Attribute, Attribute>;
+
+ TargetEnvAttributeStorage(Attribute triple, Attribute limits)
+ : triple(triple), limits(limits) {}
+
+ bool operator==(const KeyTy &key) const {
+ return key.first == triple && key.second == limits;
+ }
+
+ static TargetEnvAttributeStorage *
+ construct(AttributeStorageAllocator &allocator, const KeyTy &key) {
+ return new (allocator.allocate<TargetEnvAttributeStorage>())
+ TargetEnvAttributeStorage(key.first, key.second);
+ }
+
+ Attribute triple;
+ Attribute limits;
+};
+} // namespace detail
+} // namespace spirv
+} // namespace mlir
+
+//===----------------------------------------------------------------------===//
+// VerCapExtAttr
+//===----------------------------------------------------------------------===//
+
+spirv::VerCapExtAttr spirv::VerCapExtAttr::get(
+ spirv::Version version, ArrayRef<spirv::Capability> capabilities,
+ ArrayRef<spirv::Extension> extensions, MLIRContext *context) {
+ Builder b(context);
+
+ auto versionAttr = b.getI32IntegerAttr(static_cast<uint32_t>(version));
+
+ SmallVector<Attribute, 4> capAttrs;
+ capAttrs.reserve(capabilities.size());
+ for (spirv::Capability cap : capabilities)
+ capAttrs.push_back(b.getI32IntegerAttr(static_cast<uint32_t>(cap)));
+
+ SmallVector<Attribute, 4> extAttrs;
+ extAttrs.reserve(extensions.size());
+ for (spirv::Extension ext : extensions)
+ extAttrs.push_back(b.getStringAttr(spirv::stringifyExtension(ext)));
+
+ return get(versionAttr, b.getArrayAttr(capAttrs), b.getArrayAttr(extAttrs));
+}
+
+spirv::VerCapExtAttr spirv::VerCapExtAttr::get(IntegerAttr version,
+ ArrayAttr capabilities,
+ ArrayAttr extensions) {
+ assert(version && capabilities && extensions);
+ MLIRContext *context = version.getContext();
+ return Base::get(context, spirv::AttrKind::VerCapExt, version, capabilities,
+ extensions);
+}
+
+StringRef spirv::VerCapExtAttr::getKindName() { return "vce"; }
+
+spirv::Version spirv::VerCapExtAttr::getVersion() {
+ return static_cast<spirv::Version>(
+ getImpl()->version.cast<IntegerAttr>().getValue().getZExtValue());
+}
+
+spirv::VerCapExtAttr::ext_iterator::ext_iterator(ArrayAttr::iterator it)
+ : llvm::mapped_iterator<ArrayAttr::iterator,
+ spirv::Extension (*)(Attribute)>(
+ it, [](Attribute attr) {
+ return *symbolizeExtension(attr.cast<StringAttr>().getValue());
+ }) {}
+
+spirv::VerCapExtAttr::ext_range spirv::VerCapExtAttr::getExtensions() {
+ auto range = getExtensionsAttr().getValue();
+ return {ext_iterator(range.begin()), ext_iterator(range.end())};
+}
+
+ArrayAttr spirv::VerCapExtAttr::getExtensionsAttr() {
+ return getImpl()->extensions.cast<ArrayAttr>();
+}
+
+spirv::VerCapExtAttr::cap_iterator::cap_iterator(ArrayAttr::iterator it)
+ : llvm::mapped_iterator<ArrayAttr::iterator,
+ spirv::Capability (*)(Attribute)>(
+ it, [](Attribute attr) {
+ return *symbolizeCapability(
+ attr.cast<IntegerAttr>().getValue().getZExtValue());
+ }) {}
+
+spirv::VerCapExtAttr::cap_range spirv::VerCapExtAttr::getCapabilities() {
+ auto range = getCapabilitiesAttr().getValue();
+ return {cap_iterator(range.begin()), cap_iterator(range.end())};
+}
+
+ArrayAttr spirv::VerCapExtAttr::getCapabilitiesAttr() {
+ return getImpl()->capabilities.cast<ArrayAttr>();
+}
+
+LogicalResult spirv::VerCapExtAttr::verifyConstructionInvariants(
+ Location loc, IntegerAttr version, ArrayAttr capabilities,
+ ArrayAttr extensions) {
+ if (!version.getType().isSignlessInteger(32))
+ return emitError(loc, "expected 32-bit integer for version");
+
+ if (!llvm::all_of(capabilities.getValue(), [](Attribute attr) {
+ if (auto intAttr = attr.dyn_cast<IntegerAttr>())
+ if (spirv::symbolizeCapability(intAttr.getValue().getZExtValue()))
+ return true;
+ return false;
+ }))
+ return emitError(loc, "unknown capability in capability list");
+
+ if (!llvm::all_of(extensions.getValue(), [](Attribute attr) {
+ if (auto strAttr = attr.dyn_cast<StringAttr>())
+ if (spirv::symbolizeExtension(strAttr.getValue()))
+ return true;
+ return false;
+ }))
+ return emitError(loc, "unknown extension in extension list");
+
+ return success();
+}
+
+//===----------------------------------------------------------------------===//
+// TargetEnvAttr
+//===----------------------------------------------------------------------===//
+
+spirv::TargetEnvAttr spirv::TargetEnvAttr::get(spirv::VerCapExtAttr triple,
+ DictionaryAttr limits) {
+ assert(triple && limits && "expected valid triple and limits");
+ MLIRContext *context = triple.getContext();
+ return Base::get(context, spirv::AttrKind::TargetEnv, triple, limits);
+}
+
+StringRef spirv::TargetEnvAttr::getKindName() { return "target_env"; }
+
+spirv::VerCapExtAttr spirv::TargetEnvAttr::getTripleAttr() {
+ return getImpl()->triple.cast<spirv::VerCapExtAttr>();
+}
+
+spirv::Version spirv::TargetEnvAttr::getVersion() {
+ return getTripleAttr().getVersion();
+}
+
+spirv::VerCapExtAttr::ext_range spirv::TargetEnvAttr::getExtensions() {
+ return getTripleAttr().getExtensions();
+}
+
+ArrayAttr spirv::TargetEnvAttr::getExtensionsAttr() {
+ return getTripleAttr().getExtensionsAttr();
+}
+
+spirv::VerCapExtAttr::cap_range spirv::TargetEnvAttr::getCapabilities() {
+ return getTripleAttr().getCapabilities();
+}
+
+ArrayAttr spirv::TargetEnvAttr::getCapabilitiesAttr() {
+ return getTripleAttr().getCapabilitiesAttr();
+}
+
+spirv::ResourceLimitsAttr spirv::TargetEnvAttr::getResourceLimits() {
+ return getImpl()->limits.cast<spirv::ResourceLimitsAttr>();
+}
+
+LogicalResult spirv::TargetEnvAttr::verifyConstructionInvariants(
+ Location loc, spirv::VerCapExtAttr triple, DictionaryAttr limits) {
+ if (!limits.isa<spirv::ResourceLimitsAttr>())
+ return emitError(loc, "expected spirv::ResourceLimitsAttr for limits");
+
+ return success();
+}
diff --git a/mlir/lib/Dialect/SPIRV/TargetAndABI.cpp b/mlir/lib/Dialect/SPIRV/TargetAndABI.cpp
index b2c1dda88294..88f3037ccc1e 100644
--- a/mlir/lib/Dialect/SPIRV/TargetAndABI.cpp
+++ b/mlir/lib/Dialect/SPIRV/TargetAndABI.cpp
@@ -15,217 +15,6 @@
using namespace mlir;
-//===----------------------------------------------------------------------===//
-// DictionaryDict derived attributes
-//===----------------------------------------------------------------------===//
-
-namespace mlir {
-#include "mlir/Dialect/SPIRV/TargetAndABI.cpp.inc"
-
-//===----------------------------------------------------------------------===//
-// Attribute storage classes
-//===----------------------------------------------------------------------===//
-
-namespace spirv {
-namespace detail {
-struct VerCapExtAttributeStorage : public AttributeStorage {
- using KeyTy = std::tuple<Attribute, Attribute, Attribute>;
-
- VerCapExtAttributeStorage(Attribute version, Attribute capabilities,
- Attribute extensions)
- : version(version), capabilities(capabilities), extensions(extensions) {}
-
- bool operator==(const KeyTy &key) const {
- return std::get<0>(key) == version && std::get<1>(key) == capabilities &&
- std::get<2>(key) == extensions;
- }
-
- static VerCapExtAttributeStorage *
- construct(AttributeStorageAllocator &allocator, const KeyTy &key) {
- return new (allocator.allocate<VerCapExtAttributeStorage>())
- VerCapExtAttributeStorage(std::get<0>(key), std::get<1>(key),
- std::get<2>(key));
- }
-
- Attribute version;
- Attribute capabilities;
- Attribute extensions;
-};
-
-struct TargetEnvAttributeStorage : public AttributeStorage {
- using KeyTy = std::pair<Attribute, Attribute>;
-
- TargetEnvAttributeStorage(Attribute triple, Attribute limits)
- : triple(triple), limits(limits) {}
-
- bool operator==(const KeyTy &key) const {
- return key.first == triple && key.second == limits;
- }
-
- static TargetEnvAttributeStorage *
- construct(AttributeStorageAllocator &allocator, const KeyTy &key) {
- return new (allocator.allocate<TargetEnvAttributeStorage>())
- TargetEnvAttributeStorage(key.first, key.second);
- }
-
- Attribute triple;
- Attribute limits;
-};
-} // namespace detail
-} // namespace spirv
-} // namespace mlir
-
-//===----------------------------------------------------------------------===//
-// VerCapExtAttr
-//===----------------------------------------------------------------------===//
-
-spirv::VerCapExtAttr spirv::VerCapExtAttr::get(
- spirv::Version version, ArrayRef<spirv::Capability> capabilities,
- ArrayRef<spirv::Extension> extensions, MLIRContext *context) {
- Builder b(context);
-
- auto versionAttr = b.getI32IntegerAttr(static_cast<uint32_t>(version));
-
- SmallVector<Attribute, 4> capAttrs;
- capAttrs.reserve(capabilities.size());
- for (spirv::Capability cap : capabilities)
- capAttrs.push_back(b.getI32IntegerAttr(static_cast<uint32_t>(cap)));
-
- SmallVector<Attribute, 4> extAttrs;
- extAttrs.reserve(extensions.size());
- for (spirv::Extension ext : extensions)
- extAttrs.push_back(b.getStringAttr(spirv::stringifyExtension(ext)));
-
- return get(versionAttr, b.getArrayAttr(capAttrs), b.getArrayAttr(extAttrs));
-}
-
-spirv::VerCapExtAttr spirv::VerCapExtAttr::get(IntegerAttr version,
- ArrayAttr capabilities,
- ArrayAttr extensions) {
- assert(version && capabilities && extensions);
- MLIRContext *context = version.getContext();
- return Base::get(context, spirv::AttrKind::VerCapExt, version, capabilities,
- extensions);
-}
-
-StringRef spirv::VerCapExtAttr::getKindName() { return "vce"; }
-
-spirv::Version spirv::VerCapExtAttr::getVersion() {
- return static_cast<spirv::Version>(
- getImpl()->version.cast<IntegerAttr>().getValue().getZExtValue());
-}
-
-spirv::VerCapExtAttr::ext_iterator::ext_iterator(ArrayAttr::iterator it)
- : llvm::mapped_iterator<ArrayAttr::iterator,
- spirv::Extension (*)(Attribute)>(
- it, [](Attribute attr) {
- return *symbolizeExtension(attr.cast<StringAttr>().getValue());
- }) {}
-
-spirv::VerCapExtAttr::ext_range spirv::VerCapExtAttr::getExtensions() {
- auto range = getExtensionsAttr().getValue();
- return {ext_iterator(range.begin()), ext_iterator(range.end())};
-}
-
-ArrayAttr spirv::VerCapExtAttr::getExtensionsAttr() {
- return getImpl()->extensions.cast<ArrayAttr>();
-}
-
-spirv::VerCapExtAttr::cap_iterator::cap_iterator(ArrayAttr::iterator it)
- : llvm::mapped_iterator<ArrayAttr::iterator,
- spirv::Capability (*)(Attribute)>(
- it, [](Attribute attr) {
- return *symbolizeCapability(
- attr.cast<IntegerAttr>().getValue().getZExtValue());
- }) {}
-
-spirv::VerCapExtAttr::cap_range spirv::VerCapExtAttr::getCapabilities() {
- auto range = getCapabilitiesAttr().getValue();
- return {cap_iterator(range.begin()), cap_iterator(range.end())};
-}
-
-ArrayAttr spirv::VerCapExtAttr::getCapabilitiesAttr() {
- return getImpl()->capabilities.cast<ArrayAttr>();
-}
-
-LogicalResult spirv::VerCapExtAttr::verifyConstructionInvariants(
- Location loc, IntegerAttr version, ArrayAttr capabilities,
- ArrayAttr extensions) {
- if (!version.getType().isSignlessInteger(32))
- return emitError(loc, "expected 32-bit integer for version");
-
- if (!llvm::all_of(capabilities.getValue(), [](Attribute attr) {
- if (auto intAttr = attr.dyn_cast<IntegerAttr>())
- if (spirv::symbolizeCapability(intAttr.getValue().getZExtValue()))
- return true;
- return false;
- }))
- return emitError(loc, "unknown capability in capability list");
-
- if (!llvm::all_of(extensions.getValue(), [](Attribute attr) {
- if (auto strAttr = attr.dyn_cast<StringAttr>())
- if (spirv::symbolizeExtension(strAttr.getValue()))
- return true;
- return false;
- }))
- return emitError(loc, "unknown extension in extension list");
-
- return success();
-}
-
-//===----------------------------------------------------------------------===//
-// TargetEnvAttr
-//===----------------------------------------------------------------------===//
-
-spirv::TargetEnvAttr spirv::TargetEnvAttr::get(spirv::VerCapExtAttr triple,
- DictionaryAttr limits) {
- assert(triple && limits && "expected valid triple and limits");
- MLIRContext *context = triple.getContext();
- return Base::get(context, spirv::AttrKind::TargetEnv, triple, limits);
-}
-
-StringRef spirv::TargetEnvAttr::getKindName() { return "target_env"; }
-
-spirv::VerCapExtAttr spirv::TargetEnvAttr::getTripleAttr() {
- return getImpl()->triple.cast<spirv::VerCapExtAttr>();
-}
-
-spirv::Version spirv::TargetEnvAttr::getVersion() {
- return getTripleAttr().getVersion();
-}
-
-spirv::VerCapExtAttr::ext_range spirv::TargetEnvAttr::getExtensions() {
- return getTripleAttr().getExtensions();
-}
-
-ArrayAttr spirv::TargetEnvAttr::getExtensionsAttr() {
- return getTripleAttr().getExtensionsAttr();
-}
-
-spirv::VerCapExtAttr::cap_range spirv::TargetEnvAttr::getCapabilities() {
- return getTripleAttr().getCapabilities();
-}
-
-ArrayAttr spirv::TargetEnvAttr::getCapabilitiesAttr() {
- return getTripleAttr().getCapabilitiesAttr();
-}
-
-spirv::ResourceLimitsAttr spirv::TargetEnvAttr::getResourceLimits() {
- return getImpl()->limits.cast<spirv::ResourceLimitsAttr>();
-}
-
-LogicalResult spirv::TargetEnvAttr::verifyConstructionInvariants(
- Location loc, spirv::VerCapExtAttr triple, DictionaryAttr limits) {
- if (!limits.isa<spirv::ResourceLimitsAttr>())
- return emitError(loc, "expected spirv::ResourceLimitsAttr for limits");
-
- return success();
-}
-
-//===----------------------------------------------------------------------===//
-// Utility functions
-//===----------------------------------------------------------------------===//
-
StringRef spirv::getInterfaceVarABIAttrName() {
return "spv.interface_var_abi";
}
More information about the Mlir-commits
mailing list