diff --git a/src/Builder/FrontendDialectHelper.cpp b/src/Builder/FrontendDialectHelper.cpp index cd41ac1..7cfca8e 100644 --- a/src/Builder/FrontendDialectHelper.cpp +++ b/src/Builder/FrontendDialectHelper.cpp @@ -96,20 +96,22 @@ struct TransformValueToONNXData { // Helper method for constructing an array attribute from a model input. template -static T* CreateArrayAttribute(onnx::TensorProto initializer, int *size) { +static std::vector CreateArrayAttribute(onnx::TensorProto initializer) { + size_t size; if (initializer.raw_data().size()) { // copy & take care of endianness std::vector byteInitializer; std::copy(initializer.raw_data().begin(), initializer.raw_data().end(), back_inserter(byteInitializer)); - *size = initializer.raw_data().size() / sizeof(T); - return reinterpret_cast(&byteInitializer[0]); + size = initializer.raw_data().size() / sizeof(T); + T *res = reinterpret_cast(&byteInitializer[0]); + return std::vector(res, res + size); } // copy, no need to take care of endianness auto data = TransformValueToONNXData::data(initializer); - *size = data.size(); - return &data[0]; + size = data.size(); + return std::vector(&data[0], &data[0] + size); } void InitializedTensorMapping::AddMapping( @@ -139,39 +141,32 @@ mlir::Value InitializedTensorMapping::EmitInitializerForInputTensor( mlir::DenseElementsAttr constantDenseAttribute; mlir::Type elementType; mlir::ShapedType tensorType; - int length; switch (initializer.data_type()) { case (onnx::TensorProto::FLOAT): { - float *typeArray = - CreateArrayAttribute(initializer, &length); - std::vector arrayAttrInitializer( - typeArray, typeArray + length); - llvm::ArrayRef array(typeArray, length); + const auto& arrayAttrInitializer = + CreateArrayAttribute(initializer); elementType = builder.getF32Type(); tensorType = mlir::RankedTensorType::get(tensorDims, elementType); - constantDenseAttribute = mlir::DenseElementsAttr::get(tensorType, array); + constantDenseAttribute = mlir::DenseElementsAttr::get( + tensorType, llvm::makeArrayRef(arrayAttrInitializer)); break; } case (onnx::TensorProto::INT32): { - int32_t *typeArray = - CreateArrayAttribute(initializer, &length); - std::vector arrayAttrInitializer( - typeArray, typeArray + length); - llvm::ArrayRef array(typeArray, length); + const auto& arrayAttrInitializer = + CreateArrayAttribute(initializer); elementType = builder.getIntegerType(32); tensorType = mlir::RankedTensorType::get(tensorDims, elementType); - constantDenseAttribute = mlir::DenseElementsAttr::get(tensorType, array); + constantDenseAttribute = mlir::DenseElementsAttr::get( + tensorType, llvm::makeArrayRef(arrayAttrInitializer)); break; } case (onnx::TensorProto::INT64): { - int64_t *typeArray = - CreateArrayAttribute(initializer, &length); - std::vector arrayAttrInitializer( - typeArray, typeArray + length); - llvm::ArrayRef array(typeArray, length); + const auto& arrayAttrInitializer = + CreateArrayAttribute(initializer); elementType = builder.getIntegerType(64); tensorType = mlir::RankedTensorType::get(tensorDims, elementType); - constantDenseAttribute = mlir::DenseElementsAttr::get(tensorType, array); + constantDenseAttribute = mlir::DenseElementsAttr::get( + tensorType, llvm::makeArrayRef(arrayAttrInitializer)); break; } }