//===- ODSSupport.cpp -----------------------------------------------------===// // // 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 contains out-of-line implementations of the support types that // Operation and related classes build on top of. // //===----------------------------------------------------------------------===// #include "mlir/IR/ODSSupport.h" #include "mlir/IR/BuiltinAttributes.h" #include "mlir/IR/BuiltinTypes.h" #include "mlir/IR/Diagnostics.h" using namespace mlir; LogicalResult mlir::convertFromAttribute(int64_t &storage, Attribute attr, function_ref emitError) { auto valueAttr = dyn_cast(attr); if (!valueAttr) { emitError() << "expected IntegerAttr for key `value`"; return failure(); } storage = valueAttr.getValue().getSExtValue(); return success(); } Attribute mlir::convertToAttribute(MLIRContext *ctx, int64_t storage) { return IntegerAttr::get(IntegerType::get(ctx, 64), storage); } template LogicalResult convertDenseArrayFromAttr(MutableArrayRef storage, Attribute attr, function_ref emitError, StringRef denseArrayTyStr) { auto valueAttr = dyn_cast(attr); if (!valueAttr) { emitError() << "expected " << denseArrayTyStr << " for key `value`"; return failure(); } if (valueAttr.size() != static_cast(storage.size())) { emitError() << "size mismatch in attribute conversion: " << valueAttr.size() << " vs " << storage.size(); return failure(); } llvm::copy(valueAttr.asArrayRef(), storage.begin()); return success(); } LogicalResult mlir::convertFromAttribute(MutableArrayRef storage, Attribute attr, function_ref emitError) { return convertDenseArrayFromAttr(storage, attr, emitError, "DenseI64ArrayAttr"); } LogicalResult mlir::convertFromAttribute(MutableArrayRef storage, Attribute attr, function_ref emitError) { return convertDenseArrayFromAttr(storage, attr, emitError, "DenseI32ArrayAttr"); } Attribute mlir::convertToAttribute(MLIRContext *ctx, ArrayRef storage) { return DenseI64ArrayAttr::get(ctx, storage); }