Cleaning up unused dawn HAL backend and legacy shape/shaped buffer print/parsing
diff --git a/.bazelignore b/.bazelignore
index 0cdaee2..743cde4 100644
--- a/.bazelignore
+++ b/.bazelignore
@@ -22,10 +22,6 @@
third_party
build_tools/bazel/third_party_import/llvm-project/overlay
-# TODO(scotttodd): enable when Dawn HAL implementation is functional
-iree/hal/dawn
-iree/tools/web
-
# TODO: enable this when Java bindings are wired up.
bindings/java
bindings/javatests
diff --git a/build_tools/bazel_to_cmake/bazel_to_cmake_converter.py b/build_tools/bazel_to_cmake/bazel_to_cmake_converter.py
index 112bacc..34e09a8 100644
--- a/build_tools/bazel_to_cmake/bazel_to_cmake_converter.py
+++ b/build_tools/bazel_to_cmake/bazel_to_cmake_converter.py
@@ -43,8 +43,6 @@
self.FLATBUFFER_SUPPORTS_REFLECTIONS = False
self.PLATFORM_VULKAN_LOADER_COPTS = []
self.IREE_DRIVER_MODULES = [
- # TODO(b/142004903): enable when Dawn HAL implementation is functional
- # "//iree/hal/dawn:dawn_driver_module",
"//iree/hal/vmla:vmla_driver_module",
"//iree/hal/vulkan:vulkan_driver_module",
"//iree/hal/llvmjit:llvmjit_driver_module",
diff --git a/iree/base/BUILD b/iree/base/BUILD
index 375fab2..b8c81ed 100644
--- a/iree/base/BUILD
+++ b/iree/base/BUILD
@@ -112,35 +112,6 @@
)
cc_library(
- name = "buffer_string_util",
- srcs = ["buffer_string_util.cc"],
- hdrs = ["buffer_string_util.h"],
- deps = [
- ":memory",
- ":shape",
- ":source_location",
- ":status",
- "@com_google_absl//absl/container:flat_hash_map",
- "@com_google_absl//absl/strings",
- "@com_google_absl//absl/types:optional",
- "@com_google_absl//absl/types:span",
- ],
-)
-
-cc_test(
- name = "buffer_string_util_test",
- srcs = ["buffer_string_util_test.cc"],
- deps = [
- ":buffer_string_util",
- ":memory",
- ":status",
- ":status_matchers",
- "//iree/testing:gtest_main",
- "@com_google_absl//absl/strings",
- ],
-)
-
-cc_library(
name = "dynamic_library",
srcs = [
"dynamic_library_posix.cc",
@@ -398,76 +369,6 @@
)
cc_library(
- name = "shape",
- srcs = ["shape.cc"],
- hdrs = ["shape.h"],
- deps = [
- ":logging",
- ":source_location",
- ":status",
- "@com_google_absl//absl/meta:type_traits",
- "@com_google_absl//absl/strings",
- "@com_google_absl//absl/types:span",
- ],
-)
-
-cc_test(
- name = "shape_test",
- srcs = ["shape_test.cc"],
- deps = [
- ":shape",
- ":status",
- ":status_matchers",
- "//iree/testing:gtest_main",
- ],
-)
-
-cc_library(
- name = "shaped_buffer",
- hdrs = ["shaped_buffer.h"],
- deps = [
- ":logging",
- ":memory",
- ":shape",
- "@com_google_absl//absl/container:fixed_array",
- "@com_google_absl//absl/types:span",
- ],
-)
-
-cc_library(
- name = "shaped_buffer_string_util",
- srcs = ["shaped_buffer_string_util.cc"],
- hdrs = ["shaped_buffer_string_util.h"],
- deps = [
- ":buffer_string_util",
- ":memory",
- ":shape",
- ":shaped_buffer",
- ":source_location",
- ":status",
- "@com_google_absl//absl/container:fixed_array",
- "@com_google_absl//absl/strings",
- "@com_google_absl//absl/types:optional",
- "@com_google_absl//absl/types:span",
- ],
-)
-
-cc_test(
- name = "shaped_buffer_string_util_test",
- srcs = ["shaped_buffer_string_util_test.cc"],
- deps = [
- ":buffer_string_util",
- ":memory",
- ":shaped_buffer",
- ":shaped_buffer_string_util",
- ":status",
- ":status_matchers",
- "//iree/testing:gtest_main",
- "@com_google_absl//absl/strings",
- ],
-)
-
-cc_library(
name = "signature_mangle",
srcs = ["signature_mangle.cc"],
hdrs = ["signature_mangle.h"],
diff --git a/iree/base/CMakeLists.txt b/iree/base/CMakeLists.txt
index 64e0b5e..3a6ca54 100644
--- a/iree/base/CMakeLists.txt
+++ b/iree/base/CMakeLists.txt
@@ -120,39 +120,6 @@
iree::testing::gtest_main
)
-iree_cc_library(
- NAME
- buffer_string_util
- HDRS
- "buffer_string_util.h"
- SRCS
- "buffer_string_util.cc"
- DEPS
- ::memory
- ::shape
- ::source_location
- ::status
- absl::flat_hash_map
- absl::optional
- absl::span
- absl::strings
- PUBLIC
-)
-
-iree_cc_test(
- NAME
- buffer_string_util_test
- SRCS
- "buffer_string_util_test.cc"
- DEPS
- ::buffer_string_util
- ::memory
- ::status
- ::status_matchers
- absl::strings
- iree::testing::gtest_main
-)
-
iree_select_compiler_opts(_DYNAMIC_LIBRARY_LINKOPTS
CLANG_OR_GCC
"-ldl"
@@ -470,86 +437,6 @@
iree_cc_library(
NAME
- shape
- HDRS
- "shape.h"
- SRCS
- "shape.cc"
- DEPS
- ::logging
- ::source_location
- ::status
- absl::span
- absl::strings
- absl::type_traits
- PUBLIC
-)
-
-iree_cc_test(
- NAME
- shape_test
- SRCS
- "shape_test.cc"
- DEPS
- ::shape
- ::status
- ::status_matchers
- iree::testing::gtest_main
-)
-
-iree_cc_library(
- NAME
- shaped_buffer
- HDRS
- "shaped_buffer.h"
- DEPS
- ::logging
- ::memory
- ::shape
- absl::fixed_array
- absl::span
- PUBLIC
-)
-
-iree_cc_library(
- NAME
- shaped_buffer_string_util
- HDRS
- "shaped_buffer_string_util.h"
- SRCS
- "shaped_buffer_string_util.cc"
- DEPS
- ::buffer_string_util
- ::memory
- ::shape
- ::shaped_buffer
- ::source_location
- ::status
- absl::fixed_array
- absl::optional
- absl::span
- absl::strings
- PUBLIC
-)
-
-iree_cc_test(
- NAME
- shaped_buffer_string_util_test
- SRCS
- "shaped_buffer_string_util_test.cc"
- DEPS
- ::buffer_string_util
- ::memory
- ::shaped_buffer
- ::shaped_buffer_string_util
- ::status
- ::status_matchers
- absl::strings
- iree::testing::gtest_main
-)
-
-iree_cc_library(
- NAME
signature_mangle
HDRS
"signature_mangle.h"
diff --git a/iree/base/buffer_string_util.cc b/iree/base/buffer_string_util.cc
deleted file mode 100644
index 5317349..0000000
--- a/iree/base/buffer_string_util.cc
+++ /dev/null
@@ -1,563 +0,0 @@
-// Copyright 2019 Google LLC
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// https://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "iree/base/buffer_string_util.h"
-
-#include <functional>
-#include <sstream>
-#include <string>
-#include <type_traits>
-
-#include "absl/container/flat_hash_map.h"
-#include "absl/strings/ascii.h"
-#include "absl/strings/numbers.h"
-#include "absl/strings/str_join.h"
-#include "absl/strings/str_split.h"
-#include "absl/strings/string_view.h"
-#include "absl/strings/strip.h"
-#include "absl/types/optional.h"
-#include "iree/base/memory.h"
-#include "iree/base/source_location.h"
-#include "iree/base/status.h"
-
-namespace iree {
-
-namespace {
-
-/* clang-format off */
-constexpr char kHexValue[256] = {
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, // '0'..'9'
- 0, 10, 11, 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 'A'..'F'
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 10, 11, 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 'a'..'f'
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
-};
-/* clang-format on */
-
-template <typename T>
-void HexStringToBytes(const char* from, T to, ptrdiff_t num) {
- for (int i = 0; i < num; i++) {
- to[i] = (kHexValue[from[i * 2] & 0xFF] << 4) +
- (kHexValue[from[i * 2 + 1] & 0xFF]);
- }
-}
-
-constexpr char kHexTable[513] =
- "000102030405060708090a0b0c0d0e0f"
- "101112131415161718191a1b1c1d1e1f"
- "202122232425262728292a2b2c2d2e2f"
- "303132333435363738393a3b3c3d3e3f"
- "404142434445464748494a4b4c4d4e4f"
- "505152535455565758595a5b5c5d5e5f"
- "606162636465666768696a6b6c6d6e6f"
- "707172737475767778797a7b7c7d7e7f"
- "808182838485868788898a8b8c8d8e8f"
- "909192939495969798999a9b9c9d9e9f"
- "a0a1a2a3a4a5a6a7a8a9aaabacadaeaf"
- "b0b1b2b3b4b5b6b7b8b9babbbcbdbebf"
- "c0c1c2c3c4c5c6c7c8c9cacbcccdcecf"
- "d0d1d2d3d4d5d6d7d8d9dadbdcdddedf"
- "e0e1e2e3e4e5e6e7e8e9eaebecedeeef"
- "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff";
-
-// Like the absl method, but works in-place.
-template <typename T>
-void BytesToHexString(const unsigned char* src, T dest, ptrdiff_t num) {
- auto dest_ptr = &dest[0];
- for (auto src_ptr = src; src_ptr != (src + num); ++src_ptr, dest_ptr += 2) {
- const char* hex_p = &kHexTable[*src_ptr * 2];
- std::copy(hex_p, hex_p + 2, dest_ptr);
- }
-}
-
-// Returns true if the given type is represented as binary hex data.
-bool IsBinaryType(absl::string_view type_str) {
- return !type_str.empty() && absl::ascii_isdigit(type_str[0]);
-}
-
-// Parses binary hex data.
-Status ParseBinaryData(absl::string_view data_str, absl::Span<uint8_t> output) {
- data_str = absl::StripAsciiWhitespace(data_str);
- size_t dst_i = 0;
- size_t src_i = 0;
- while (src_i < data_str.size() && dst_i < output.size()) {
- char c = data_str[src_i];
- if (absl::ascii_isspace(c) || c == ',') {
- ++src_i;
- continue;
- }
- if (src_i + 1 >= data_str.size()) {
- return InvalidArgumentErrorBuilder(IREE_LOC)
- << "Invalid input hex data (offset=" << src_i << ")";
- }
- HexStringToBytes(data_str.data() + src_i, output.data() + dst_i, 1);
- src_i += 2;
- ++dst_i;
- }
- if (dst_i < output.size()) {
- return InvalidArgumentErrorBuilder(IREE_LOC)
- << "Too few elements to fill type; expected " << output.size()
- << " but only read " << dst_i;
- } else if (data_str.size() - src_i > 0) {
- return InvalidArgumentErrorBuilder(IREE_LOC)
- << "Input data string contains more elements than the underlying "
- "buffer ("
- << output.size() << "): " << data_str;
- }
- return OkStatus();
-}
-
-template <typename ElementType, typename Enabled = void>
-struct SimpleStrToValue {
- absl::optional<ElementType> operator()(absl::string_view text) const = delete;
-};
-
-template <typename IntegerType>
-struct SimpleStrToValue<
- IntegerType,
- typename std::enable_if<(sizeof(IntegerType) < 4), void>::type> {
- absl::optional<IntegerType> operator()(absl::string_view text) const {
- int32_t value;
- return absl::SimpleAtoi(text, &value) ? absl::optional<IntegerType>{value}
- : absl::nullopt;
- }
-};
-
-template <typename IntegerType>
-struct SimpleStrToValue<
- IntegerType,
- typename std::enable_if<(sizeof(IntegerType) >= 4), void>::type> {
- absl::optional<IntegerType> operator()(absl::string_view text) const {
- IntegerType value;
- return absl::SimpleAtoi(text, &value) ? absl::optional<IntegerType>{value}
- : absl::nullopt;
- }
-};
-
-template <>
-struct SimpleStrToValue<float, void> {
- absl::optional<float> operator()(absl::string_view text) const {
- float value;
- return absl::SimpleAtof(text, &value) ? absl::optional<float>{value}
- : absl::nullopt;
- }
-};
-
-template <>
-struct SimpleStrToValue<double, void> {
- absl::optional<double> operator()(absl::string_view text) const {
- double value;
- return absl::SimpleAtod(text, &value) ? absl::optional<double>{value}
- : absl::nullopt;
- }
-};
-
-template <typename T>
-Status ParseNumericalDataElement(absl::string_view data_str, size_t token_start,
- size_t token_end, absl::Span<T> output,
- int dst_i) {
- if (dst_i >= output.size()) {
- return InvalidArgumentErrorBuilder(IREE_LOC)
- << "Input data string contains more elements than the underlying "
- "buffer ("
- << output.size() << "): " << data_str;
- }
- auto element_str = data_str.substr(token_start, token_end - token_start + 1);
- auto element = SimpleStrToValue<T>()(element_str);
- if (!element.has_value()) {
- return InvalidArgumentErrorBuilder(IREE_LOC)
- << "Unable to parse element " << dst_i << " = '" << element_str
- << "'";
- }
- output[dst_i] = element.value();
- return OkStatus();
-}
-
-template <typename T>
-Status ParseNumericalDataAsType(absl::string_view data_str,
- absl::Span<uint8_t> output) {
- auto cast_output = ReinterpretSpan<T>(output);
- size_t src_i = 0;
- size_t dst_i = 0;
- size_t token_start = std::string::npos;
- while (src_i < data_str.size()) {
- char c = data_str[src_i++];
- bool is_separator =
- absl::ascii_isspace(c) || c == ',' || c == '[' || c == ']';
- if (token_start == std::string::npos) {
- if (!is_separator) {
- token_start = src_i - 1;
- }
- continue;
- } else if (token_start != std::string::npos && !is_separator) {
- continue;
- }
- RETURN_IF_ERROR(ParseNumericalDataElement<T>(
- data_str, token_start, src_i - 2, cast_output, dst_i++));
- token_start = std::string::npos;
- }
- if (token_start != std::string::npos) {
- RETURN_IF_ERROR(ParseNumericalDataElement<T>(
- data_str, token_start, data_str.size() - 1, cast_output, dst_i++));
- }
- if (dst_i == 1 && cast_output.size() > 1) {
- // Splat the single value we got to the entire tensor.
- for (int i = 1; i < cast_output.size(); ++i) {
- cast_output[i] = cast_output[0];
- }
- } else if (dst_i < cast_output.size()) {
- return InvalidArgumentErrorBuilder(IREE_LOC)
- << "Input data string contains fewer elements than the underlying "
- "buffer (expected "
- << cast_output.size() << ") " << data_str;
- }
- return OkStatus();
-}
-
-// Parses numerical data (ints, floats, etc) in some typed form.
-Status ParseNumericalData(absl::string_view type_str,
- absl::string_view data_str,
- absl::Span<uint8_t> output) {
- if (type_str == "i8") {
- return ParseNumericalDataAsType<int8_t>(data_str, output);
- } else if (type_str == "u8") {
- return ParseNumericalDataAsType<uint8_t>(data_str, output);
- } else if (type_str == "i16") {
- return ParseNumericalDataAsType<int16_t>(data_str, output);
- } else if (type_str == "u16") {
- return ParseNumericalDataAsType<uint16_t>(data_str, output);
- } else if (type_str == "i32") {
- return ParseNumericalDataAsType<int32_t>(data_str, output);
- } else if (type_str == "u32") {
- return ParseNumericalDataAsType<uint32_t>(data_str, output);
- } else if (type_str == "i64") {
- return ParseNumericalDataAsType<int64_t>(data_str, output);
- } else if (type_str == "u64") {
- return ParseNumericalDataAsType<uint64_t>(data_str, output);
- } else if (type_str == "f32") {
- return ParseNumericalDataAsType<float>(data_str, output);
- } else if (type_str == "f64") {
- return ParseNumericalDataAsType<double>(data_str, output);
- } else {
- return InvalidArgumentErrorBuilder(IREE_LOC)
- << "Unsupported type: " << type_str;
- }
-}
-
-template <typename T>
-void PrintElementList(const Shape& shape, absl::Span<const T> data,
- size_t* max_entries, std::ostream* stream) {
- if (shape.empty()) {
- // Scalar value.
- PrintElementList({1}, data, max_entries, stream);
- return;
- } else if (shape.size() == 1) {
- // Leaf dimension; output data.
- size_t max_count = std::min(*max_entries, static_cast<size_t>(shape[0]));
- *stream << absl::StrJoin(data.subspan(0, max_count), " ");
- if (max_count < shape[0]) {
- *stream << "...";
- }
- *max_entries -= max_count;
- } else {
- // Nested; recurse into next dimension.
- Shape nested_shape = Shape(shape.subspan(1));
- size_t length = nested_shape.element_count();
- size_t offset = 0;
- for (int i = 0; i < shape[0]; ++i) {
- *stream << "[";
- PrintElementList<T>(nested_shape, data.subspan(offset, length),
- max_entries, stream);
- offset += length;
- *stream << "]";
- }
- }
-}
-
-template <typename T>
-Status PrintNumericalDataToStreamAsType(const Shape& shape,
- absl::Span<const uint8_t> contents,
- size_t max_entries,
- std::ostream* stream) {
- auto cast_contents = ReinterpretSpan<T>(contents);
- PrintElementList(shape, cast_contents, &max_entries, stream);
- return OkStatus();
-}
-
-} // namespace
-
-StatusOr<BufferDataPrintMode> ParseBufferDataPrintMode(absl::string_view str) {
- if (str.empty()) {
- return InvalidArgumentErrorBuilder(IREE_LOC)
- << "Cannot get print mode of empty string";
- }
- switch (str[0]) {
- case 'b':
- return BufferDataPrintMode::kBinary;
- case 'i':
- return BufferDataPrintMode::kSignedInteger;
- case 'u':
- return BufferDataPrintMode::kUnsignedInteger;
- case 'f':
- return BufferDataPrintMode::kFloatingPoint;
- default:
- return InvalidArgumentErrorBuilder(IREE_LOC)
- << "Unsupported output type '" << str << "'";
- }
-}
-
-StatusOr<int> ParseBufferTypeElementSize(absl::string_view type_str) {
- static const auto* const type_sizes =
- new absl::flat_hash_map<absl::string_view, int>{
- {"1", 1}, {"2", 2}, {"4", 4}, {"8", 8}, {"i8", 1},
- {"u8", 1}, {"i16", 2}, {"u16", 2}, {"i32", 4}, {"u32", 4},
- {"i64", 8}, {"u64", 8}, {"f32", 4}, {"f64", 8},
- };
- auto type_size = type_sizes->find(type_str);
- if (type_size != type_sizes->end()) {
- return type_size->second;
- } else {
- return InvalidArgumentErrorBuilder(IREE_LOC)
- << "Unsupported type '" << type_str << "'";
- }
-}
-
-StatusOr<std::string> MakeBufferTypeString(int element_size,
- BufferDataPrintMode print_mode) {
- if (element_size <= 0) {
- return InvalidArgumentErrorBuilder(IREE_LOC)
- << "Invalid element size '" << element_size << "'";
- }
- switch (print_mode) {
- case BufferDataPrintMode::kBinary:
- return absl::StrCat(element_size);
- case BufferDataPrintMode::kSignedInteger:
- return absl::StrCat("i", element_size * 8);
- case BufferDataPrintMode::kUnsignedInteger:
- return absl::StrCat("u", element_size * 8);
- case BufferDataPrintMode::kFloatingPoint:
- return absl::StrCat("f", element_size * 8);
- default:
- return InvalidArgumentErrorBuilder(IREE_LOC)
- << "Unsupported print mode (" << static_cast<int>(print_mode)
- << ")";
- }
-}
-
-StatusOr<Shape> ParseShape(absl::string_view shape_str) {
- if (shape_str.empty()) {
- return Shape{};
- }
- std::vector<int> dims;
- for (auto dim_str : absl::StrSplit(shape_str, 'x')) {
- int dim_value = 0;
- if (!absl::SimpleAtoi(dim_str, &dim_value)) {
- return InvalidArgumentErrorBuilder(IREE_LOC)
- << "Invalid shape dimension '" << dim_str
- << "' while parsing shape '" << shape_str << "'";
- }
- if (dim_value < 0) {
- return InvalidArgumentErrorBuilder(IREE_LOC)
- << "Unsupported shape dimension '" << dim_str << "'";
- }
- dims.push_back(dim_value);
- }
- if (dims.size() > kMaxRank) {
- return InvalidArgumentErrorBuilder(IREE_LOC)
- << "Shape rank '" << dims.size() << "' exceeds maximum rank '"
- << kMaxRank << "'";
- }
- return Shape{dims};
-}
-
-std::string PrintShapedTypeToString(const Shape& shape,
- absl::string_view type_str) {
- std::string result;
- PrintShapedTypeToString(shape, type_str, &result);
- return result;
-}
-
-void PrintShapedTypeToString(const Shape& shape, absl::string_view type_str,
- std::string* out_result) {
- std::ostringstream stream;
- PrintShapedTypeToStream(shape, type_str, &stream);
- *out_result = stream.str();
-}
-
-void PrintShapedTypeToStream(const Shape& shape, absl::string_view type_str,
- std::ostream* stream) {
- *stream << absl::StrJoin(shape.begin(), shape.end(), "x");
- if (!shape.empty()) *stream << "x";
- *stream << type_str;
-}
-
-// Prints binary hex data.
-StatusOr<std::string> PrintBinaryDataToString(
- int element_size, absl::Span<const uint8_t> contents, size_t max_entries) {
- std::string result;
- RETURN_IF_ERROR(
- PrintBinaryDataToString(element_size, contents, max_entries, &result));
- return result;
-}
-
-Status PrintBinaryDataToString(int element_size,
- absl::Span<const uint8_t> contents,
- size_t max_entries, std::string* out_result) {
- std::ostringstream stream;
- RETURN_IF_ERROR(
- PrintBinaryDataToStream(element_size, contents, max_entries, &stream));
- *out_result = stream.str();
- return OkStatus();
-}
-
-Status PrintBinaryDataToStream(int element_size,
- absl::Span<const uint8_t> contents,
- size_t max_entries, std::ostream* stream) {
- // TODO(gcmn) Can we avoid this fiddly byte counting?
- max_entries *= element_size; // Counting bytes, but treat them as elements.
- constexpr size_t hex_chars_per_byte = 2;
- constexpr size_t max_bytes = sizeof(int64_t);
- if (element_size != 1 && element_size != 2 && element_size != 4 &&
- element_size != 8) {
- return InvalidArgumentErrorBuilder(IREE_LOC)
- << "Invalid element size '" << element_size
- << "'; only '1', '2', '4' and '8' are supported";
- }
- if (contents.size() % element_size != 0) {
- return InvalidArgumentErrorBuilder(IREE_LOC)
- << "Element size '" << element_size
- << "' doesn't divide contents size " << contents.size();
- }
- // Plus one char for the null terminator.
- char hex_buffer[hex_chars_per_byte * max_bytes + 1] = {0};
- for (size_t i = 0; i < std::min(max_entries, contents.size());
- i += element_size) {
- if (i > 0) *stream << " ";
- BytesToHexString(contents.data() + i, hex_buffer, element_size);
- *stream << hex_buffer;
- }
- if (contents.size() > max_entries) *stream << "...";
- return OkStatus();
-}
-
-StatusOr<std::string> PrintNumericalDataToString(
- const Shape& shape, absl::string_view type_str,
- absl::Span<const uint8_t> contents, size_t max_entries) {
- std::string result;
- RETURN_IF_ERROR(PrintNumericalDataToString(shape, type_str, contents,
- max_entries, &result));
- return result;
-}
-
-Status PrintNumericalDataToString(const Shape& shape,
- absl::string_view type_str,
- absl::Span<const uint8_t> contents,
- size_t max_entries, std::string* out_result) {
- std::ostringstream stream;
- RETURN_IF_ERROR(PrintNumericalDataToStream(shape, type_str, contents,
- max_entries, &stream));
- *out_result = stream.str();
- return OkStatus();
-}
-
-// Prints numerical data (ints, floats, etc) from some typed form.
-Status PrintNumericalDataToStream(const Shape& shape,
- absl::string_view type_str,
- absl::Span<const uint8_t> contents,
- size_t max_entries, std::ostream* stream) {
- if (type_str == "i8") {
- return PrintNumericalDataToStreamAsType<int8_t>(shape, contents,
- max_entries, stream);
- } else if (type_str == "u8") {
- return PrintNumericalDataToStreamAsType<uint8_t>(shape, contents,
- max_entries, stream);
- } else if (type_str == "i16") {
- return PrintNumericalDataToStreamAsType<int16_t>(shape, contents,
- max_entries, stream);
- } else if (type_str == "u16") {
- return PrintNumericalDataToStreamAsType<uint16_t>(shape, contents,
- max_entries, stream);
- } else if (type_str == "i32") {
- return PrintNumericalDataToStreamAsType<int32_t>(shape, contents,
- max_entries, stream);
- } else if (type_str == "u32") {
- return PrintNumericalDataToStreamAsType<uint32_t>(shape, contents,
- max_entries, stream);
- } else if (type_str == "i64") {
- return PrintNumericalDataToStreamAsType<int64_t>(shape, contents,
- max_entries, stream);
- } else if (type_str == "u64") {
- return PrintNumericalDataToStreamAsType<uint64_t>(shape, contents,
- max_entries, stream);
- } else if (type_str == "f32") {
- return PrintNumericalDataToStreamAsType<float>(shape, contents, max_entries,
- stream);
- } else if (type_str == "f64") {
- return PrintNumericalDataToStreamAsType<double>(shape, contents,
- max_entries, stream);
- } else {
- return InvalidArgumentErrorBuilder(IREE_LOC)
- << "Unsupported type: " << type_str;
- }
-}
-
-Status ParseBufferDataAsType(absl::string_view data_str,
- absl::string_view type_str,
- absl::Span<uint8_t> output) {
- // Parse the data from the string right into the buffer.
- if (IsBinaryType(type_str)) {
- // Parse as binary hex.
- return ParseBinaryData(data_str, output);
- }
- // Parse as some nicely formatted type.
- return ParseNumericalData(type_str, data_str, output);
-}
-
-// static
-BufferStringParts BufferStringParts::ExtractFrom(
- absl::string_view shaped_buf_str) {
- BufferStringParts parts;
- absl::string_view shape_and_type_str;
- auto equal_index = shaped_buf_str.find('=');
- if (equal_index == std::string::npos) {
- // Treat a lack of = as defaulting the data to zeros.
- shape_and_type_str = shaped_buf_str;
- } else {
- shape_and_type_str = shaped_buf_str.substr(0, equal_index);
- parts.data_str = shaped_buf_str.substr(equal_index + 1);
- }
- auto last_x_index = shape_and_type_str.rfind('x');
- if (last_x_index == std::string::npos) {
- // Scalar.
- parts.type_str = shape_and_type_str;
- } else {
- // Has a shape.
- parts.shape_str = shape_and_type_str.substr(0, last_x_index);
- parts.type_str = shape_and_type_str.substr(last_x_index + 1);
- }
- return parts;
-}
-
-} // namespace iree
diff --git a/iree/base/buffer_string_util.h b/iree/base/buffer_string_util.h
deleted file mode 100644
index 62add6e..0000000
--- a/iree/base/buffer_string_util.h
+++ /dev/null
@@ -1,141 +0,0 @@
-// Copyright 2019 Google LLC
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// https://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Utilities for working with strings defining buffers and associated shapes,
-// mostly useful for testing.
-//
-// The canonical shaped buffer string format is:
-// [shape]x[type]=value,value,...
-// For example:
-// 2x2xi32=0,1,2,3
-// Characters like [] are optional and will be ignored during parsing:
-// 2x2xi32=[[0 1][2 3]]
-//
-// The type may be one of the following:
-// * 1/2/4/8 = 1/2/4/8 byte elements in binary hex format.
-// * i8/u8 = signed/unsigned 8-bit integers.
-// * i16/u16 = signed/unsigned 16-bit integers.
-// * i32/u32 = signed/unsigned 32-bit integers.
-// * i64/u64 = signed/unsigned 64-bit integers.
-// * f32 = 32-bit floating-point number.
-// * f64 = 64-bit floating-point number.
-
-#ifndef IREE_BASE_BUFFER_STRING_UTIL_H_
-#define IREE_BASE_BUFFER_STRING_UTIL_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <ostream>
-#include <string>
-
-#include "absl/strings/string_view.h"
-#include "absl/types/span.h"
-#include "iree/base/shape.h"
-#include "iree/base/status.h"
-
-namespace iree {
-
-// Defines how the elements within a buffer representation are interpreted
-// during printing.
-enum class BufferDataPrintMode {
- // Interpret the data as if it were serialized bytes.
- // In this mode no conversion is performed and the bytes in memory are printed
- // as hex in groupings based on the element size. Shortened to 'b'.
- kBinary,
- // Interpret elements as signed integers; shortened to 'i'.
- kSignedInteger,
- // Interpret elements as unsigned integers; shortened to 'u'.
- kUnsignedInteger,
- // Interpret elements as floating-point values; shortened to 'f'.
- kFloatingPoint,
-};
-
-// Returns the BufferDataPrintMode based on the shortened char in |str|.
-StatusOr<BufferDataPrintMode> ParseBufferDataPrintMode(absl::string_view str);
-
-// Returns the size, in bytes, of the given type.
-StatusOr<int> ParseBufferTypeElementSize(absl::string_view type_str);
-
-// Returns the canonical representation of a type based on its size in bytes and
-// the specified printing mode. For example, with a size of 4 and a printing
-// mode of kFloatingPoint it returns "f32".
-StatusOr<std::string> MakeBufferTypeString(int element_size,
- BufferDataPrintMode print_mode);
-
-// Returns a Shape parsed from the given NxMx... string.
-StatusOr<Shape> ParseShape(absl::string_view shape_str);
-
-// Prints a shape and element type, e.g. 2x3xf32
-std::string PrintShapedTypeToString(const Shape& shape,
- absl::string_view type_str);
-void PrintShapedTypeToString(const Shape& shape, absl::string_view type_str,
- std::string* out_result);
-void PrintShapedTypeToStream(const Shape& shape, absl::string_view type_str,
- std::ostream* stream);
-
-// Prints the given bytes as binary hex data.
-// Bytes are grouped as elements according to the |element_size| in bytes. If
-// the size of |contents| exceeds |max_entries|, the output will be truncated to
-// that many entries followed by an ellipses.
-StatusOr<std::string> PrintBinaryDataToString(
- int element_size, absl::Span<const uint8_t> contents, size_t max_entries);
-Status PrintBinaryDataToString(int element_size,
- absl::Span<const uint8_t> contents,
- size_t max_entries, std::string* out_result);
-Status PrintBinaryDataToStream(int element_size,
- absl::Span<const uint8_t> contents,
- size_t max_entries, std::ostream* stream);
-
-// Prints a list of elements in a format indicated by the given shape.
-// For example: [1 2 3][4 5 6] for a shape of 2x3.
-// The bytes in contents will be interpreted as the type specified by
-// |type_str|. If the size of |contents| exceeds |max_entries|, the output will
-// be truncated to that many entries followed by an ellipses.
-StatusOr<std::string> PrintNumericalDataToString(
- const Shape& shape, absl::string_view type_str,
- absl::Span<const uint8_t> contents, size_t max_entries);
-Status PrintNumericalDataToString(const Shape& shape,
- absl::string_view type_str,
- absl::Span<const uint8_t> contents,
- size_t max_entries, std::string* out_result);
-Status PrintNumericalDataToStream(const Shape& shape,
- absl::string_view type_str,
- absl::Span<const uint8_t> contents,
- size_t max_entries, std::ostream* stream);
-
-// Parses |data_str| as elements of the type specified by |type_str| and writes
-// them into |output|.
-Status ParseBufferDataAsType(absl::string_view data_str,
- absl::string_view type_str,
- absl::Span<uint8_t> output);
-
-// A non-owning struct for referencing parts of a string that describes a shaped
-// buffer type, e.g. 1x2x3xf32=1 2 3 4 5 6
-struct BufferStringParts {
- // The part of the string corresponding to the shape, e.g. 1x2x3.
- absl::string_view shape_str;
- // The part of the string corresponding to the type, e.g. f32
- absl::string_view type_str;
- // The part of the string corresponding to the buffer data, e.g. 1 2 3 4 5 6
- absl::string_view data_str;
-
- // Extract the corresponding string parts from a string describing the entire
- // buffer.
- static BufferStringParts ExtractFrom(absl::string_view shaped_buf_str);
-};
-
-} // namespace iree
-
-#endif // IREE_BASE_BUFFER_STRING_UTIL_H_
diff --git a/iree/base/buffer_string_util_test.cc b/iree/base/buffer_string_util_test.cc
deleted file mode 100644
index 77d1fac..0000000
--- a/iree/base/buffer_string_util_test.cc
+++ /dev/null
@@ -1,221 +0,0 @@
-// Copyright 2019 Google LLC
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// https://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "iree/base/buffer_string_util.h"
-
-#include "absl/strings/string_view.h"
-#include "iree/base/memory.h"
-#include "iree/base/status.h"
-#include "iree/base/status_matchers.h"
-#include "iree/testing/gtest.h"
-
-namespace iree {
-namespace {
-
-using ::iree::testing::status::IsOkAndHolds;
-using ::iree::testing::status::StatusIs;
-using ::testing::ElementsAre;
-using ::testing::Eq;
-
-TEST(BufferStringUtilTest, ParseBufferDataPrintMode) {
- EXPECT_THAT(ParseBufferDataPrintMode("b"),
- IsOkAndHolds(Eq(BufferDataPrintMode::kBinary)));
- EXPECT_THAT(ParseBufferDataPrintMode("i"),
- IsOkAndHolds(Eq(BufferDataPrintMode::kSignedInteger)));
- EXPECT_THAT(ParseBufferDataPrintMode("u"),
- IsOkAndHolds(Eq(BufferDataPrintMode::kUnsignedInteger)));
- EXPECT_THAT(ParseBufferDataPrintMode("f"),
- IsOkAndHolds(Eq(BufferDataPrintMode::kFloatingPoint)));
-
- EXPECT_THAT(ParseBufferDataPrintMode("bb"),
- IsOkAndHolds(Eq(BufferDataPrintMode::kBinary)));
- EXPECT_THAT(ParseBufferDataPrintMode("ii"),
- IsOkAndHolds(Eq(BufferDataPrintMode::kSignedInteger)));
- EXPECT_THAT(ParseBufferDataPrintMode("uu"),
- IsOkAndHolds(Eq(BufferDataPrintMode::kUnsignedInteger)));
- EXPECT_THAT(ParseBufferDataPrintMode("ff"),
- IsOkAndHolds(Eq(BufferDataPrintMode::kFloatingPoint)));
-
- EXPECT_THAT(ParseBufferDataPrintMode(""),
- StatusIs(StatusCode::kInvalidArgument));
- EXPECT_THAT(ParseBufferDataPrintMode("s"),
- StatusIs(StatusCode::kInvalidArgument));
- EXPECT_THAT(ParseBufferDataPrintMode("asdfasdf"),
- StatusIs(StatusCode::kInvalidArgument));
-}
-
-TEST(BufferStringUtilTest, ParseBufferTypeElementSize) {
- EXPECT_THAT(ParseBufferTypeElementSize("1"), IsOkAndHolds(Eq(1)));
- EXPECT_THAT(ParseBufferTypeElementSize("2"), IsOkAndHolds(Eq(2)));
- EXPECT_THAT(ParseBufferTypeElementSize("4"), IsOkAndHolds(Eq(4)));
- EXPECT_THAT(ParseBufferTypeElementSize("8"), IsOkAndHolds(Eq(8)));
- EXPECT_THAT(ParseBufferTypeElementSize("i8"), IsOkAndHolds(Eq(1)));
- EXPECT_THAT(ParseBufferTypeElementSize("u8"), IsOkAndHolds(Eq(1)));
- EXPECT_THAT(ParseBufferTypeElementSize("i16"), IsOkAndHolds(Eq(2)));
- EXPECT_THAT(ParseBufferTypeElementSize("u16"), IsOkAndHolds(Eq(2)));
- EXPECT_THAT(ParseBufferTypeElementSize("i32"), IsOkAndHolds(Eq(4)));
- EXPECT_THAT(ParseBufferTypeElementSize("u32"), IsOkAndHolds(Eq(4)));
- EXPECT_THAT(ParseBufferTypeElementSize("i64"), IsOkAndHolds(Eq(8)));
- EXPECT_THAT(ParseBufferTypeElementSize("u64"), IsOkAndHolds(Eq(8)));
- EXPECT_THAT(ParseBufferTypeElementSize("f32"), IsOkAndHolds(Eq(4)));
- EXPECT_THAT(ParseBufferTypeElementSize("f64"), IsOkAndHolds(Eq(8)));
-
- EXPECT_THAT(ParseBufferTypeElementSize(""),
- StatusIs(StatusCode::kInvalidArgument));
- EXPECT_THAT(ParseBufferTypeElementSize(" "),
- StatusIs(StatusCode::kInvalidArgument));
- EXPECT_THAT(ParseBufferTypeElementSize("a"),
- StatusIs(StatusCode::kInvalidArgument));
- EXPECT_THAT(ParseBufferTypeElementSize("ib"),
- StatusIs(StatusCode::kInvalidArgument));
- EXPECT_THAT(ParseBufferTypeElementSize("i"),
- StatusIs(StatusCode::kInvalidArgument));
- EXPECT_THAT(ParseBufferTypeElementSize("i543ff"),
- StatusIs(StatusCode::kInvalidArgument));
- EXPECT_THAT(ParseBufferTypeElementSize("i33"),
- StatusIs(StatusCode::kInvalidArgument));
- EXPECT_THAT(ParseBufferTypeElementSize("x32"),
- StatusIs(StatusCode::kInvalidArgument));
- EXPECT_THAT(ParseBufferTypeElementSize("f16"),
- StatusIs(StatusCode::kInvalidArgument));
- EXPECT_THAT(ParseBufferTypeElementSize("i1"),
- StatusIs(StatusCode::kInvalidArgument));
- EXPECT_THAT(ParseBufferTypeElementSize("i24"),
- StatusIs(StatusCode::kInvalidArgument));
- EXPECT_THAT(ParseBufferTypeElementSize("i128"),
- StatusIs(StatusCode::kInvalidArgument));
-}
-
-TEST(BufferStringUtilTest, MakeBufferTypeString) {
- EXPECT_THAT(MakeBufferTypeString(1, BufferDataPrintMode::kBinary),
- IsOkAndHolds(Eq("1")));
- EXPECT_THAT(MakeBufferTypeString(1, BufferDataPrintMode::kSignedInteger),
- IsOkAndHolds(Eq("i8")));
- EXPECT_THAT(MakeBufferTypeString(2, BufferDataPrintMode::kUnsignedInteger),
- IsOkAndHolds(Eq("u16")));
- EXPECT_THAT(MakeBufferTypeString(4, BufferDataPrintMode::kFloatingPoint),
- IsOkAndHolds(Eq("f32")));
-
- EXPECT_THAT(MakeBufferTypeString(0, BufferDataPrintMode::kBinary),
- StatusIs(StatusCode::kInvalidArgument));
- EXPECT_THAT(MakeBufferTypeString(-1, BufferDataPrintMode::kBinary),
- StatusIs(StatusCode::kInvalidArgument));
- EXPECT_THAT(MakeBufferTypeString(-1, BufferDataPrintMode::kSignedInteger),
- StatusIs(StatusCode::kInvalidArgument));
- EXPECT_THAT(MakeBufferTypeString(-2, BufferDataPrintMode::kUnsignedInteger),
- StatusIs(StatusCode::kInvalidArgument));
- EXPECT_THAT(MakeBufferTypeString(-4, BufferDataPrintMode::kFloatingPoint),
- StatusIs(StatusCode::kInvalidArgument));
-}
-
-TEST(BufferStringUtilTest, ParseShape) {
- EXPECT_THAT(ParseShape(""), IsOkAndHolds(Eq(Shape{})));
- EXPECT_THAT(ParseShape("0"), IsOkAndHolds(Eq(Shape{0})));
- EXPECT_THAT(ParseShape("1"), IsOkAndHolds(Eq(Shape{1})));
- EXPECT_THAT(ParseShape("1x2"), IsOkAndHolds(Eq(Shape{1, 2})));
- EXPECT_THAT(ParseShape(" 1 x 2 "), IsOkAndHolds(Eq(Shape{1, 2})));
- EXPECT_THAT(ParseShape("1x2x3x4x5"), IsOkAndHolds(Eq(Shape{1, 2, 3, 4, 5})));
-
- EXPECT_THAT(ParseShape("abc"), StatusIs(StatusCode::kInvalidArgument));
- EXPECT_THAT(ParseShape("1xf"), StatusIs(StatusCode::kInvalidArgument));
- EXPECT_THAT(ParseShape("1xff23"), StatusIs(StatusCode::kInvalidArgument));
- EXPECT_THAT(ParseShape("1xf32"), StatusIs(StatusCode::kInvalidArgument));
- EXPECT_THAT(ParseShape("x"), StatusIs(StatusCode::kInvalidArgument));
- EXPECT_THAT(ParseShape("x1"), StatusIs(StatusCode::kInvalidArgument));
- EXPECT_THAT(ParseShape("1x"), StatusIs(StatusCode::kInvalidArgument));
- EXPECT_THAT(ParseShape("x1x2"), StatusIs(StatusCode::kInvalidArgument));
- EXPECT_THAT(ParseShape("1xx2"), StatusIs(StatusCode::kInvalidArgument));
- EXPECT_THAT(ParseShape("1x2x"), StatusIs(StatusCode::kInvalidArgument));
- EXPECT_THAT(ParseShape("0x-1"), StatusIs(StatusCode::kInvalidArgument));
- EXPECT_THAT(ParseShape("1x2x3x4x5x6"),
- StatusIs(StatusCode::kInvalidArgument));
-}
-
-TEST(BufferStringUtilTest, PrintShapedTypeToString) {
- EXPECT_EQ("f32", PrintShapedTypeToString(Shape{}, "f32"));
- EXPECT_EQ("0xi32", PrintShapedTypeToString(Shape{0}, "i32"));
- EXPECT_EQ("1xi32", PrintShapedTypeToString(Shape{1}, "i32"));
- EXPECT_EQ("1x2xi8", PrintShapedTypeToString(Shape{1, 2}, "i8"));
-}
-
-TEST(BufferStringUtilTest, PrintBinaryDataToString) {
- EXPECT_THAT(PrintBinaryDataToString(1, {0, 1, 2, 3}, 10),
- IsOkAndHolds(Eq("00 01 02 03")));
- EXPECT_THAT(PrintBinaryDataToString(
- 2, {0x01, 0x02, 0x03, 0x04, 0xcc, 0xdd, 0xee, 0xff}, 10),
- IsOkAndHolds(Eq("0102 0304 ccdd eeff")));
- EXPECT_THAT(PrintBinaryDataToString(4, {0xfa, 0xbc, 0xfa, 0xbc}, 10),
- IsOkAndHolds(Eq("fabcfabc")));
- EXPECT_THAT(PrintBinaryDataToString(
- 8, {0xfa, 0xbc, 0xfa, 0xbc, 0xfa, 0xbc, 0xfa, 0xbc}, 10),
- IsOkAndHolds(Eq("fabcfabcfabcfabc")));
-
- EXPECT_THAT(PrintBinaryDataToString(1, {0, 1, 2, 3}, 0),
- IsOkAndHolds(Eq("...")));
- EXPECT_THAT(PrintBinaryDataToString(1, {0, 1, 2, 3}, 1),
- IsOkAndHolds(Eq("00...")));
- EXPECT_THAT(PrintBinaryDataToString(1, {0, 1, 2, 3}, 2),
- IsOkAndHolds(Eq("00 01...")));
-
- EXPECT_THAT(PrintBinaryDataToString(-1, {0, 1, 2, 3}, 10),
- StatusIs(StatusCode::kInvalidArgument));
- EXPECT_THAT(
- PrintBinaryDataToString(
- 16, {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, 10),
- StatusIs(StatusCode::kInvalidArgument));
- EXPECT_THAT(PrintBinaryDataToString(3, {0, 1, 2, 3}, 10),
- StatusIs(StatusCode::kInvalidArgument));
-}
-
-TEST(BufferStringUtilTest, PrintNumericalDataToString) {
- EXPECT_EQ("0 1 2 3",
- PrintNumericalDataToString({4}, "u8", {0, 1, 2, 3}, 10).value());
- EXPECT_EQ("[0 1][2 3]",
- PrintNumericalDataToString({2, 2}, "u8", {0, 1, 2, 3}, 10).value());
- std::vector<int32_t> data = {0, -1, 2, 3};
- auto bytes = ReinterpretSpan<uint8_t>(absl::MakeSpan(data));
- EXPECT_EQ("0 -1 2 3",
- PrintNumericalDataToString({4}, "i32", bytes, 10).value());
-}
-
-TEST(BufferStringUtilTest, ParseBufferDatai8) {
- std::vector<uint8_t> data(4);
- auto data_span = absl::MakeSpan(data);
- ASSERT_OK(ParseBufferDataAsType("0 1 2 3", "i8", data_span));
- EXPECT_THAT(ReinterpretSpan<int8_t>(data_span), ElementsAre(0, 1, 2, 3));
-}
-
-TEST(BufferStringUtilTest, ParseBufferDatai32) {
- std::vector<uint8_t> data(4 * sizeof(int32_t));
- auto data_span = absl::MakeSpan(data);
- ASSERT_OK(ParseBufferDataAsType("0 1 2 3", "i32", data_span));
- EXPECT_THAT(ReinterpretSpan<int32_t>(data_span), ElementsAre(0, 1, 2, 3));
-}
-
-TEST(BufferStringUtilTest, ParseBufferDataf32) {
- std::vector<uint8_t> data(4 * sizeof(float));
- auto data_span = absl::MakeSpan(data);
- ASSERT_OK(ParseBufferDataAsType("0 1.1 2 3", "f32", data_span));
- EXPECT_THAT(ReinterpretSpan<float>(data_span), ElementsAre(0, 1.1, 2, 3));
-}
-
-TEST(BufferStringUtilTest, ParseBufferDataBinary) {
- std::vector<uint8_t> data(4);
- auto data_span = absl::MakeSpan(data);
- ASSERT_OK(ParseBufferDataAsType("00 01 02 03", "8", data_span));
- EXPECT_THAT(data_span, ElementsAre(0, 1, 2, 3));
-}
-
-} // namespace
-} // namespace iree
diff --git a/iree/base/shape.cc b/iree/base/shape.cc
deleted file mode 100644
index 875d119..0000000
--- a/iree/base/shape.cc
+++ /dev/null
@@ -1,100 +0,0 @@
-// Copyright 2019 Google LLC
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// https://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "iree/base/shape.h"
-
-#include <cstddef>
-
-#include "absl/strings/str_cat.h"
-#include "absl/strings/str_join.h"
-#include "iree/base/source_location.h"
-#include "iree/base/status.h"
-
-namespace iree {
-
-Shape::Shape(const int* values, int size) : rank_(size) {
- QCHECK_LE(size, kMaxRank)
- << "Max rank of " << kMaxRank << ", shape has " << size;
- std::memcpy(value_, values, size * sizeof(int));
-}
-
-std::string Shape::DebugString() const {
- return absl::StrCat("[", absl::StrJoin(subspan(), ","), "]");
-}
-
-absl::Span<const int> Shape::subspan(size_type pos, size_type len) const {
- if (len == npos) {
- len = rank_ - pos;
- }
- return absl::MakeConstSpan(&value_[pos], len);
-}
-
-void Shape::push_back(int dim) {
- DCHECK_LE(rank_ + 1, kMaxRank);
- value_[rank_++] = dim;
-}
-
-void Shape::insert(iterator pos, int dim) {
- int axis = static_cast<int>(pos - value_);
- DCHECK_GE(axis, 0);
- DCHECK_LE(axis, rank_);
- DCHECK_LE(rank_ + 1, kMaxRank);
- ++rank_;
- for (int i = rank_ - 1; i > axis; --i) {
- value_[i] = value_[i - 1];
- }
- value_[axis] = dim;
-}
-
-void Shape::erase(iterator pos) {
- int axis = static_cast<int>(pos - value_);
- DCHECK_GE(axis, 0);
- DCHECK_LE(axis, rank_);
- for (int i = axis; i < rank_ - 1; ++i) {
- value_[i] = value_[i + 1];
- }
- --rank_;
-}
-
-int Shape::element_count() const {
- size_t element_count = 1;
- for (int i = 0; i < rank_; ++i) {
- int dim = value_[i];
- if (dim == -1) {
- return 0;
- }
- element_count *= dim;
- }
- return element_count;
-}
-
-StatusOr<int> Shape::ResolveAxis(int axis) const {
- if (rank_ == 0 && (axis == -1 || axis == 0)) {
- // Scalar axes resolves to 0.
- return 0;
- }
-
- int new_axis = axis;
- if (new_axis < 0) {
- new_axis += rank_;
- }
- if (new_axis < 0 || new_axis >= rank_) {
- return InvalidArgumentErrorBuilder(IREE_LOC)
- << "Axis " << new_axis << " (orig " << axis
- << ") out of bounds of rank " << rank_;
- }
- return new_axis;
-}
-
-} // namespace iree
diff --git a/iree/base/shape.h b/iree/base/shape.h
deleted file mode 100644
index 758d66f..0000000
--- a/iree/base/shape.h
+++ /dev/null
@@ -1,156 +0,0 @@
-// Copyright 2019 Google LLC
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// https://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef IREE_BASE_SHAPE_H_
-#define IREE_BASE_SHAPE_H_
-
-#include <array>
-#include <cstring>
-#include <initializer_list>
-#include <iterator>
-#include <string>
-#include <type_traits>
-#include <vector>
-
-#include "absl/meta/type_traits.h"
-#include "absl/types/span.h"
-#include "iree/base/logging.h"
-#include "iree/base/status.h"
-
-namespace iree {
-
-// For simplicity we limit our shapes to a max of rank-N (shape.size() == N) as
-// this prevents dynamic allocations and rarely are there greater ranks.
-constexpr int kMaxRank = 5;
-
-// Represent indices and lengths of tensors.
-using Index = std::array<int, kMaxRank>;
-using Length = std::array<int, kMaxRank>;
-
-// Represents the number of elements in multiple dimensions.
-// Can be rank-0 (scalar) to rank-kMaxRank. Tries to match the API of
-// std::vector and can be converted to a Span via subspan().
-//
-// https://www.tensorflow.org/guide/tensors#shape
-class Shape {
- public:
- using size_type = int;
- static constexpr size_type npos = ~(size_type(0)); // NOLINT
- using iterator = int*;
- using const_iterator = const int*;
-
- Shape() = default;
- Shape(const int* values, int size);
- Shape(std::initializer_list<int> values)
- : Shape(values.begin(), values.size()) {}
- explicit Shape(absl::Span<const int> values)
- : Shape(values.data(), values.size()) {}
-
- template <typename Iterator>
- using EnableIfForwardIterator = absl::enable_if_t<std::is_convertible<
- typename std::iterator_traits<Iterator>::iterator_category,
- std::forward_iterator_tag>::value>;
- template <typename Iterator, EnableIfForwardIterator<Iterator>* = nullptr>
- Shape(Iterator first, Iterator last) {
- rank_ = std::distance(first, last);
- QCHECK_LE(rank_, kMaxRank);
- for (int i = 0; first != last; ++i, static_cast<void>(++first)) {
- value_[i] = *first;
- }
- }
-
- // Returns a string representation of the given shape.
- std::string DebugString() const;
-
- // Size (aka 'rank') of the shape, counting the number of dimensions.
- constexpr size_type size() const noexcept { return rank_; }
-
- // Whether the shape is rank-0 (scalar).
- constexpr bool empty() const noexcept { return rank_ == 0; }
-
- // Returns the total elements in the tensor shape.
- // Returns 0 if the tensor shape is not complete and 1 if the shape is a
- // scalar value.
- int element_count() const;
-
- // Resolves an axis in [-R,R) to the real axis value and verifies the range.
- StatusOr<int> ResolveAxis(int axis) const;
-
- // Compares two shapes for equality.
- inline static bool Equal(const Shape& a, const Shape& b) {
- return a.rank_ == b.rank_ &&
- std::memcmp(a.value_, b.value_, a.rank_ * sizeof(value_[0])) == 0;
- }
-
- int& operator[](size_type i) noexcept {
- DCHECK_GE(i, 0);
- DCHECK_LT(i, rank_);
- return value_[i];
- }
-
- const int& operator[](size_type i) const noexcept {
- DCHECK_GE(i, 0);
- DCHECK_LT(i, rank_);
- return value_[i];
- }
-
- int front() const noexcept {
- DCHECK_GE(rank_, 1);
- return value_[0];
- }
-
- int back() const noexcept {
- DCHECK_GE(rank_, 1);
- return value_[rank_ - 1];
- }
-
- constexpr iterator begin() const noexcept {
- return const_cast<iterator>(&value_[0]);
- }
- constexpr iterator end() const noexcept {
- return const_cast<iterator>(&value_[rank_]);
- }
- constexpr const_iterator cbegin() const noexcept { return &value_[0]; }
- constexpr const_iterator cend() const noexcept { return &value_[rank_]; }
-
- absl::Span<const int> subspan(size_type pos = 0, size_type len = npos) const;
- absl::Span<const int> data() const { return subspan(); }
-
- void push_back(int dim);
-
- void insert(iterator pos, int dim);
-
- void erase(iterator pos);
-
- void clear() { rank_ = 0; }
-
- private:
- size_type rank_ = 0;
- int value_[kMaxRank];
-};
-
-inline bool operator==(const Shape& a, const Shape& b) {
- return Shape::Equal(a, b);
-}
-
-inline bool operator!=(const Shape& a, const Shape& b) { return !(a == b); }
-
-inline std::ostream& operator<<(std::ostream& stream, const Shape& shape) {
- stream << shape.DebugString();
- return stream;
-}
-
-} // namespace iree
-
-#endif // IREE_BASE_SHAPE_H_
diff --git a/iree/base/shape_test.cc b/iree/base/shape_test.cc
deleted file mode 100644
index 0bd88d3..0000000
--- a/iree/base/shape_test.cc
+++ /dev/null
@@ -1,221 +0,0 @@
-// Copyright 2019 Google LLC
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// https://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "iree/base/shape.h"
-
-#include "iree/base/status.h"
-#include "iree/base/status_matchers.h"
-#include "iree/testing/gtest.h"
-
-namespace iree {
-namespace {
-
-using ::testing::ElementsAre;
-
-// Tests shapes that represent 0-D scalar values.
-TEST(ShapeTest, Scalar) {
- Shape shape;
- EXPECT_EQ(0, shape.size());
- EXPECT_TRUE(shape.empty());
- EXPECT_EQ(1, shape.element_count());
- EXPECT_EQ(shape, shape);
- EXPECT_EQ(0, shape.subspan().size());
- for (const int dim : shape) {
- FAIL() << "Should have no dimensions, have: " << dim;
- }
- EXPECT_EQ(shape.begin(), shape.end());
- EXPECT_EQ(shape.cbegin(), shape.cend());
- shape.clear();
- EXPECT_EQ(0, shape.size());
-}
-
-// Tests the various ways of constructing a 1+D shape.
-TEST(ShapeTest, NonScalarConstruction) {
- EXPECT_EQ(0, Shape().size());
- EXPECT_EQ(0, Shape({}).size());
- EXPECT_EQ(1, Shape({10}).size());
- EXPECT_EQ(4, Shape({10, 20, 30, 40}).size());
-
- std::vector<int> empty_data = {};
- EXPECT_EQ(0, Shape(empty_data.data(), empty_data.size()).size());
- EXPECT_EQ(0, Shape(empty_data.begin(), empty_data.end()).size());
- EXPECT_EQ(0, Shape(absl::MakeConstSpan(empty_data)).size());
-
- EXPECT_THAT(Shape({}).subspan(), ElementsAre());
- EXPECT_THAT(Shape({10}).subspan(), ElementsAre(10));
- EXPECT_THAT(Shape({10, 20, 30, 40}).subspan(), ElementsAre(10, 20, 30, 40));
-
- std::vector<int> valid_data = {10, 20, 30, 40};
- EXPECT_THAT(Shape(valid_data.begin(), valid_data.end()).subspan(),
- ElementsAre(10, 20, 30, 40));
- EXPECT_THAT(Shape(absl::MakeConstSpan(valid_data)).subspan(),
- ElementsAre(10, 20, 30, 40));
-}
-
-// Tests shapes that represent 1+D multidimensional values.
-TEST(ShapeTest, NonScalarAccess) {
- Shape shape = {1, 2, 3, 4};
- EXPECT_EQ(4, shape.size());
- EXPECT_FALSE(shape.empty());
- EXPECT_EQ(1 * 2 * 3 * 4, shape.element_count());
- EXPECT_EQ(shape, shape);
- EXPECT_NE(shape, Shape({4, 3, 2, 1}));
- EXPECT_THAT(shape.subspan(), ElementsAre(1, 2, 3, 4));
- std::vector<int> readout;
- for (const int dim : shape) {
- readout.push_back(dim);
- }
- EXPECT_THAT(readout, ElementsAre(1, 2, 3, 4));
- EXPECT_EQ(1, shape[0]);
- EXPECT_EQ(2, shape[1]);
- EXPECT_EQ(3, shape[2]);
- EXPECT_EQ(4, shape[3]);
- EXPECT_EQ(1, shape.front());
- EXPECT_EQ(4, shape.back());
-}
-
-TEST(ShapeTest, PushBack) {
- Shape shape;
- EXPECT_EQ(0, shape.size());
-
- shape.push_back(10);
- EXPECT_EQ(1, shape.size());
- EXPECT_EQ(10, shape.front());
- EXPECT_EQ(10, shape.back());
- EXPECT_EQ(10, shape[0]);
- EXPECT_THAT(shape.subspan(), ElementsAre(10));
-
- shape.push_back(20);
- EXPECT_EQ(2, shape.size());
- EXPECT_EQ(10, shape.front());
- EXPECT_EQ(20, shape.back());
- EXPECT_EQ(10, shape[0]);
- EXPECT_EQ(20, shape[1]);
- EXPECT_THAT(shape.subspan(), ElementsAre(10, 20));
-}
-
-TEST(ShapeTest, Insert) {
- Shape shape;
- EXPECT_EQ(0, shape.size());
-
- shape.insert(shape.begin(), 20);
- EXPECT_THAT(shape.subspan(), ElementsAre(20));
- shape.insert(shape.begin(), 10);
- EXPECT_THAT(shape.subspan(), ElementsAre(10, 20));
- shape.insert(shape.end(), 40);
- EXPECT_THAT(shape.subspan(), ElementsAre(10, 20, 40));
- shape.insert(shape.begin() + 2, 30);
- EXPECT_THAT(shape.subspan(), ElementsAre(10, 20, 30, 40));
-
- Shape ex_shape{72, 4};
- ex_shape.insert(ex_shape.begin(), 144);
- EXPECT_THAT(ex_shape.subspan(), ElementsAre(144, 72, 4));
-}
-
-TEST(ShapeTest, Erase) {
- Shape shape = {1, 2, 3, 4};
- EXPECT_THAT(shape.subspan(), ElementsAre(1, 2, 3, 4));
- shape.erase(shape.begin());
- EXPECT_THAT(shape.subspan(), ElementsAre(2, 3, 4));
- shape.erase(shape.end());
- EXPECT_THAT(shape.subspan(), ElementsAre(2, 3));
- shape.erase(shape.begin() + 1);
- EXPECT_THAT(shape.subspan(), ElementsAre(2));
- shape.erase(shape.end());
- EXPECT_THAT(shape.subspan(), ElementsAre());
-}
-
-TEST(ShapeTest, Clear) {
- Shape shape;
- EXPECT_EQ(0, shape.size());
- shape.clear();
- EXPECT_EQ(0, shape.size());
-
- shape = Shape({1});
- shape.clear();
- EXPECT_EQ(0, shape.size());
-
- shape = Shape({1, 2, 3, 4});
- shape.clear();
- EXPECT_EQ(0, shape.size());
-}
-
-TEST(ShapeTest, DebugString) {
- EXPECT_EQ("[]", Shape({}).DebugString());
- EXPECT_EQ("[1]", Shape({1}).DebugString());
- EXPECT_EQ("[1,2]", Shape({1, 2}).DebugString());
-}
-
-TEST(ShapeTest, ElementCount) {
- EXPECT_EQ(1, Shape({}).element_count());
- EXPECT_EQ(0, Shape({0}).element_count());
- EXPECT_EQ(1, Shape({1}).element_count());
- EXPECT_EQ(2, Shape({2, 1}).element_count());
- EXPECT_EQ(10, Shape({2, 5}).element_count());
- EXPECT_EQ(9216, Shape({72, 1, 128}).element_count());
- EXPECT_EQ(9216, Shape({1, 72, 128}).element_count());
-
- // Partial shaping should yield no elements.
- EXPECT_EQ(0, Shape({1, -1, 2, 3}).element_count());
-}
-
-TEST(ShapeTest, ResolveAxis) {
- int axis;
- ASSERT_OK_AND_ASSIGN(axis, Shape({0}).ResolveAxis(0));
- EXPECT_EQ(0, axis);
- ASSERT_OK_AND_ASSIGN(axis, Shape({0, 1, 2}).ResolveAxis(1));
- EXPECT_EQ(1, axis);
- ASSERT_OK_AND_ASSIGN(axis, Shape({0, 1, 2}).ResolveAxis(2));
- EXPECT_EQ(2, axis);
-
- EXPECT_TRUE(IsInvalidArgument(Shape({0, 1, 2}).ResolveAxis(3).status()));
-}
-
-TEST(ShapeTest, ResolveAxisNegative) {
- int axis;
- ASSERT_OK_AND_ASSIGN(axis, Shape({0, 1, 2}).ResolveAxis(-3));
- EXPECT_EQ(0, axis);
- ASSERT_OK_AND_ASSIGN(axis, Shape({0, 1, 2}).ResolveAxis(-2));
- EXPECT_EQ(1, axis);
- ASSERT_OK_AND_ASSIGN(axis, Shape({0, 1, 2}).ResolveAxis(-1));
- EXPECT_EQ(2, axis);
-
- EXPECT_TRUE(IsInvalidArgument(Shape({0, 1, 2}).ResolveAxis(-4).status()));
-}
-
-TEST(ShapeTest, ResolveAxisScalar) {
- int axis;
- ASSERT_OK_AND_ASSIGN(axis, Shape({}).ResolveAxis(0));
- EXPECT_EQ(0, axis);
- ASSERT_OK_AND_ASSIGN(axis, Shape({}).ResolveAxis(-1));
- EXPECT_EQ(0, axis);
-
- EXPECT_TRUE(IsInvalidArgument(Shape({}).ResolveAxis(1).status()));
-}
-
-TEST(ShapeTest, Equality) {
- EXPECT_EQ(Shape({}), Shape({}));
- EXPECT_EQ(Shape({0}), Shape({0}));
- EXPECT_EQ(Shape({1}), Shape({1}));
- EXPECT_EQ(Shape({1, 2}), Shape({1, 2}));
-
- EXPECT_NE(Shape({}), Shape({1}));
- EXPECT_NE(Shape({-1}), Shape({1}));
- EXPECT_NE(Shape({1}), Shape({}));
- EXPECT_NE(Shape({1}), Shape({2}));
- EXPECT_NE(Shape({1, 2}), Shape({3, 4}));
-}
-
-} // namespace
-} // namespace iree
diff --git a/iree/base/shaped_buffer.h b/iree/base/shaped_buffer.h
deleted file mode 100644
index 14f2df8..0000000
--- a/iree/base/shaped_buffer.h
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright 2019 Google LLC
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// https://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef IREE_IREE_BASE_SHAPED_BUFFER_H_
-#define IREE_IREE_BASE_SHAPED_BUFFER_H_
-
-#include <stdint.h>
-
-#include <vector>
-
-#include "absl/types/span.h"
-#include "iree/base/logging.h"
-#include "iree/base/memory.h"
-#include "iree/base/shape.h"
-
-namespace iree {
-
-// A struct representing a buffer of bytes that should be interpreted as being
-// of the specified shape with elements of the specified size.
-class ShapedBuffer {
- public:
- ShapedBuffer() = default;
- // move only
- ShapedBuffer(ShapedBuffer&& other) = default;
- ShapedBuffer& operator=(ShapedBuffer&& other) = default;
- ShapedBuffer(int8_t element_size, Shape shape, std::vector<uint8_t> contents)
- : element_size_(element_size),
- shape_(shape),
- contents_(std::move(contents)) {}
-
- template <typename T>
- static ShapedBuffer Create(Shape shape, absl::Span<const T> contents) {
- CHECK_EQ(contents.size(), shape.element_count());
- auto byte_span = ReinterpretSpan<uint8_t>(contents);
- return ShapedBuffer(
- sizeof(T), shape,
- std::vector<uint8_t>(byte_span.begin(), byte_span.end()));
- }
-
- static inline bool Equal(const ShapedBuffer& a, const ShapedBuffer& b) {
- return a.element_size_ == b.element_size_ && a.shape_ == b.shape_ &&
- a.contents_ == b.contents_;
- }
-
- int8_t element_size() const { return element_size_; }
- Shape shape() const { return shape_; }
- absl::Span<const uint8_t> contents() const { return contents_; }
-
- private:
- // Size of the buffer elements, in bytes.
- int8_t element_size_;
- Shape shape_;
- std::vector<uint8_t> contents_;
-};
-
-inline bool operator==(const ShapedBuffer& a, const ShapedBuffer& b) {
- return ShapedBuffer::Equal(a, b);
-}
-
-inline bool operator!=(const ShapedBuffer& a, const ShapedBuffer& b) {
- return !(a == b);
-}
-
-} // namespace iree
-
-#endif // IREE_IREE_BASE_SHAPED_BUFFER_H_
diff --git a/iree/base/shaped_buffer_string_util.cc b/iree/base/shaped_buffer_string_util.cc
deleted file mode 100644
index 3464e56..0000000
--- a/iree/base/shaped_buffer_string_util.cc
+++ /dev/null
@@ -1,112 +0,0 @@
-// Copyright 2019 Google LLC
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// https://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "iree/base/shaped_buffer_string_util.h"
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <sstream>
-#include <string>
-#include <vector>
-
-#include "absl/container/fixed_array.h"
-#include "absl/strings/ascii.h"
-#include "absl/strings/string_view.h"
-#include "absl/strings/strip.h"
-#include "absl/types/optional.h"
-#include "absl/types/span.h"
-#include "iree/base/buffer_string_util.h"
-#include "iree/base/memory.h"
-#include "iree/base/shape.h"
-#include "iree/base/shaped_buffer.h"
-#include "iree/base/source_location.h"
-#include "iree/base/status.h"
-
-namespace iree {
-
-StatusOr<ShapedBuffer> ParseShapedBufferFromString(
- absl::string_view shaped_buf_str) {
- // Strip whitespace that may come along (linefeeds/etc).
- shaped_buf_str = absl::StripAsciiWhitespace(shaped_buf_str);
- shaped_buf_str = absl::StripPrefix(shaped_buf_str, "\"");
- shaped_buf_str = absl::StripSuffix(shaped_buf_str, "\"");
- if (shaped_buf_str.empty()) {
- // Empty lines denote empty shaped_buffers.
- return ShapedBuffer{};
- }
-
- // Split into the components we can work with: shape, type, and data.
- auto str_parts = BufferStringParts::ExtractFrom(shaped_buf_str);
-
- ASSIGN_OR_RETURN(int element_size,
- ParseBufferTypeElementSize(str_parts.type_str));
- ASSIGN_OR_RETURN(Shape shape, ParseShape(str_parts.shape_str));
-
- int buffer_size = element_size * shape.element_count();
- std::vector<uint8_t> contents(buffer_size);
-
- if (!str_parts.data_str.empty()) {
- RETURN_IF_ERROR(ParseBufferDataAsType(
- str_parts.data_str, str_parts.type_str, absl::MakeSpan(contents)));
- }
- return ShapedBuffer(element_size, shape, std::move(contents));
-}
-
-StatusOr<std::string> PrintShapedBufferToString(const ShapedBuffer& shaped_buf,
- BufferDataPrintMode print_mode,
- size_t max_entries) {
- std::string result;
- RETURN_IF_ERROR(
- PrintShapedBufferToString(shaped_buf, print_mode, max_entries, &result));
- return result;
-}
-
-Status PrintShapedBufferToString(const ShapedBuffer& shaped_buf,
- BufferDataPrintMode print_mode,
- size_t max_entries, std::string* out_result) {
- std::ostringstream stream;
- RETURN_IF_ERROR(
- PrintShapedBufferToStream(shaped_buf, print_mode, max_entries, &stream));
- *out_result = stream.str();
- return OkStatus();
-}
-
-Status PrintShapedBufferToStream(const ShapedBuffer& shaped_buffer,
- BufferDataPrintMode print_mode,
- size_t max_entries, std::ostream* stream) {
- if (shaped_buffer.contents().empty()) {
- // No data means the shaped_buffer is empty. We use the empty string to
- // denote this (as we have no useful information).
- return OkStatus();
- }
-
- ASSIGN_OR_RETURN(
- std::string type_str,
- MakeBufferTypeString(shaped_buffer.element_size(), print_mode));
-
- PrintShapedTypeToStream(shaped_buffer.shape(), type_str, stream);
- *stream << "=";
-
- if (print_mode == BufferDataPrintMode::kBinary) {
- return PrintBinaryDataToStream(shaped_buffer.element_size(),
- shaped_buffer.contents(), max_entries,
- stream);
- }
- return PrintNumericalDataToStream(shaped_buffer.shape(), type_str,
- shaped_buffer.contents(), max_entries,
- stream);
-}
-
-} // namespace iree
diff --git a/iree/base/shaped_buffer_string_util.h b/iree/base/shaped_buffer_string_util.h
deleted file mode 100644
index a351750..0000000
--- a/iree/base/shaped_buffer_string_util.h
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright 2019 Google LLC
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// https://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Utilities for parsing and printing ShapedBuffer, mostly useful for
-// testing. The format is as described in
-// https://github.com/google/iree/tree/main/iree/base/buffer_string_util.h
-
-#ifndef IREE_BASE_SHAPED_BUFFER_STRING_UTIL_H_
-#define IREE_BASE_SHAPED_BUFFER_STRING_UTIL_H_
-
-#include <stddef.h>
-
-#include <ostream>
-#include <string>
-
-#include "absl/strings/string_view.h"
-#include "iree/base/buffer_string_util.h"
-#include "iree/base/shape.h"
-#include "iree/base/shaped_buffer.h"
-#include "iree/base/status.h"
-
-namespace iree {
-
-// Parses a ShapedBuffer encoded in a string.
-// The format accepted matches that produced by PrintShapedBufferToString.
-StatusOr<ShapedBuffer> ParseShapedBufferFromString(
- absl::string_view shaped_buf_str);
-
-// Prints a ShapedBuffer to a string encoded in the canonical format.
-StatusOr<std::string> PrintShapedBufferToString(const ShapedBuffer& shaped_buf,
- BufferDataPrintMode print_mode,
- size_t max_entries);
-Status PrintShapedBufferToString(const ShapedBuffer& shaped_buf,
- BufferDataPrintMode print_mode,
- size_t max_entries, std::string* out_result);
-
-// Prints a ShapedBuffer to a stream encoded in the canonical format.
-Status PrintShapedBufferToStream(const ShapedBuffer& shaped_buf,
- BufferDataPrintMode print_mode,
- size_t max_entries, std::ostream* stream);
-
-} // namespace iree
-
-#endif // IREE_BASE_SHAPED_BUFFER_STRING_UTIL_H_
diff --git a/iree/base/shaped_buffer_string_util_test.cc b/iree/base/shaped_buffer_string_util_test.cc
deleted file mode 100644
index 42077f7..0000000
--- a/iree/base/shaped_buffer_string_util_test.cc
+++ /dev/null
@@ -1,191 +0,0 @@
-// Copyright 2019 Google LLC
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// https://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "iree/base/shaped_buffer_string_util.h"
-
-#include "absl/strings/string_view.h"
-#include "iree/base/buffer_string_util.h"
-#include "iree/base/memory.h"
-#include "iree/base/shaped_buffer.h"
-#include "iree/base/status.h"
-#include "iree/base/status_matchers.h"
-#include "iree/testing/gtest.h"
-
-namespace iree {
-namespace {
-
-using ::iree::testing::status::StatusIs;
-using ::testing::ElementsAre;
-
-template <typename T>
-absl::Span<const T> ReadAs(absl::Span<const uint8_t> data) {
- return ReinterpretSpan<T>(data);
-}
-
-void RoundTripTest(absl::string_view buffer_string,
- BufferDataPrintMode print_mode) {
- ASSERT_OK_AND_ASSIGN(auto shaped_buf,
- ParseShapedBufferFromString(buffer_string));
- ASSERT_OK_AND_ASSIGN(auto new_string, PrintShapedBufferToString(
- shaped_buf, print_mode, SIZE_MAX));
- EXPECT_EQ(buffer_string, new_string);
-}
-
-void RoundTripTest(ShapedBuffer shaped_buf, BufferDataPrintMode print_mode) {
- ASSERT_OK_AND_ASSIGN(auto new_string, PrintShapedBufferToString(
- shaped_buf, print_mode, SIZE_MAX));
- ASSERT_OK_AND_ASSIGN(auto new_shaped_buf,
- ParseShapedBufferFromString(new_string));
- EXPECT_EQ(shaped_buf, new_shaped_buf);
-}
-
-TEST(ShapedBufferStringUtilTest, ParseShapedBufferFromStringEmpty) {
- // Empty string = empty buffer_view.
- ASSERT_OK_AND_ASSIGN(auto m0, ParseShapedBufferFromString(""));
- EXPECT_TRUE(m0.contents().empty());
- EXPECT_EQ(Shape{}, m0.shape());
- EXPECT_EQ(0, m0.element_size());
-
- // No = means no data.
- ASSERT_OK_AND_ASSIGN(auto m1, ParseShapedBufferFromString("4x2xf32"));
- EXPECT_EQ(4 * 2 * 4, m1.contents().size());
- EXPECT_EQ(Shape({4, 2}), m1.shape());
- EXPECT_EQ(4, m1.element_size());
- EXPECT_THAT(ReadAs<float>(m1.contents()),
- ElementsAre(0, 0, 0, 0, 0, 0, 0, 0));
-
- // No data after = means no data.
- ASSERT_OK_AND_ASSIGN(auto m2, ParseShapedBufferFromString("4x2xf32="));
- EXPECT_EQ(4 * 2 * 4, m2.contents().size());
- EXPECT_EQ(Shape({4, 2}), m2.shape());
- EXPECT_EQ(4, m2.element_size());
- EXPECT_THAT(ReadAs<float>(m2.contents()),
- ElementsAre(0, 0, 0, 0, 0, 0, 0, 0));
-}
-
-TEST(ShapedBufferStringUtilTest, ParseShapedBufferFromStringBinary) {
- ASSERT_OK_AND_ASSIGN(auto m0, ParseShapedBufferFromString("4x1=00 01 02 03"));
- EXPECT_EQ(Shape({4}), m0.shape());
- EXPECT_EQ(1, m0.element_size());
- EXPECT_THAT(ReadAs<uint8_t>(m0.contents()), ElementsAre(0, 1, 2, 3));
-
- // Whitespace shouldn't matter.
- ASSERT_OK_AND_ASSIGN(auto m1, ParseShapedBufferFromString("4x1=00,010203"));
- EXPECT_EQ(Shape({4}), m1.shape());
- EXPECT_EQ(1, m1.element_size());
- EXPECT_THAT(ReadAs<uint8_t>(m1.contents()), ElementsAre(0, 1, 2, 3));
-
- // Should fail on malformed hex bytes.
- EXPECT_THAT(ParseShapedBufferFromString("4x1=1"),
- StatusIs(StatusCode::kInvalidArgument));
- EXPECT_THAT(ParseShapedBufferFromString("4x1=00003"),
- StatusIs(StatusCode::kInvalidArgument));
- EXPECT_THAT(ParseShapedBufferFromString("4x1=%0123%\1"),
- StatusIs(StatusCode::kInvalidArgument));
- EXPECT_THAT(ParseShapedBufferFromString("4x1=00010203040506"),
- StatusIs(StatusCode::kInvalidArgument));
-}
-
-TEST(ShapedBufferStringUtilTest, ParseShapedBufferFromStringAllowBrackets) {
- ASSERT_OK_AND_ASSIGN(auto m0,
- ParseShapedBufferFromString("4xi16=[[0][ 1 ][2]][3]"));
- EXPECT_EQ(Shape({4}), m0.shape());
- EXPECT_EQ(2, m0.element_size());
- EXPECT_THAT(ReadAs<int16_t>(m0.contents()), ElementsAre(0, 1, 2, 3));
-}
-
-TEST(ShapedBufferStringUtilTest, ParseShapedBufferFromStringInteger) {
- // Signed int16.
- ASSERT_OK_AND_ASSIGN(auto m0,
- ParseShapedBufferFromString("4xi16=0 12345 65535 -2"));
- EXPECT_EQ(Shape({4}), m0.shape());
- EXPECT_EQ(2, m0.element_size());
- EXPECT_THAT(ReadAs<int16_t>(m0.contents()), ElementsAre(0, 12345, -1, -2));
-
- // Unsigned int16.
- ASSERT_OK_AND_ASSIGN(auto m1,
- ParseShapedBufferFromString("4xu16=0 12345 65535 -2"));
- EXPECT_EQ(Shape({4}), m1.shape());
- EXPECT_EQ(2, m1.element_size());
- EXPECT_THAT(ReadAs<uint16_t>(m1.contents()),
- ElementsAre(0, 12345, 65535, 65534));
-
- // Mixing separator types is ok.
- ASSERT_OK_AND_ASSIGN(
- auto m2, ParseShapedBufferFromString("4xu16=0, 12345, 65535, -2"));
- EXPECT_EQ(Shape({4}), m2.shape());
- EXPECT_EQ(2, m2.element_size());
- EXPECT_THAT(ReadAs<uint16_t>(m2.contents()),
- ElementsAre(0, 12345, 65535, 65534));
-
- // Should fail on malformed integers bytes and out of bounds values.
- EXPECT_FALSE(ParseShapedBufferFromString("4xi32=asodfj").ok());
- EXPECT_FALSE(ParseShapedBufferFromString("4xi32=0 1 2 3 4").ok());
-}
-
-TEST(ShapedBufferStringUtilTest, ParseShapedBufferFromStringFloat) {
- // Float.
- ASSERT_OK_AND_ASSIGN(auto m0,
- ParseShapedBufferFromString("4xf32=0 1.0 1234 -2.0e-5"));
- EXPECT_EQ(Shape({4}), m0.shape());
- EXPECT_EQ(4, m0.element_size());
- EXPECT_THAT(ReadAs<float>(m0.contents()),
- ElementsAre(0.0f, 1.0f, 1234.0f, -2.0e-5f));
-
- // Double.
- ASSERT_OK_AND_ASSIGN(auto m1, ParseShapedBufferFromString(
- "4xf64=0 1.0 123456789012345 -2.0e-5"));
- EXPECT_EQ(Shape({4}), m1.shape());
- EXPECT_EQ(8, m1.element_size());
- EXPECT_THAT(ReadAs<double>(m1.contents()),
- ElementsAre(0.0, 1.0, 123456789012345.0, -2.0e-5));
-
- // Splat (repeating single element value).
- ASSERT_OK_AND_ASSIGN(auto m2, ParseShapedBufferFromString("4xf32=2.2"));
- EXPECT_EQ(Shape({4}), m2.shape());
- EXPECT_EQ(4, m2.element_size());
- EXPECT_THAT(ReadAs<float>(m2.contents()),
- ElementsAre(2.2f, 2.2f, 2.2f, 2.2f));
-
- // Should fail on malformed floats and out of bounds values.
- EXPECT_FALSE(ParseShapedBufferFromString("4xf32=asodfj").ok());
- EXPECT_FALSE(ParseShapedBufferFromString("4xf32=0 1 2 3 4").ok());
-}
-
-TEST(ShapedBufferStringUtilTest, RoundTripParsePrint) {
- RoundTripTest("4xi8=0 -1 2 3", BufferDataPrintMode::kSignedInteger);
- RoundTripTest("4xi16=0 -1 2 3", BufferDataPrintMode::kSignedInteger);
- RoundTripTest("4xu16=0 1 2 3", BufferDataPrintMode::kUnsignedInteger);
- RoundTripTest("4xf32=0 1.1 2 3", BufferDataPrintMode::kFloatingPoint);
- RoundTripTest("1x2x3xi8=[[0 1 2][3 4 5]]",
- BufferDataPrintMode::kSignedInteger);
-}
-
-TEST(ShapedBufferStringUtilTest, RoundTripPrintParse) {
- RoundTripTest(ShapedBuffer::Create<int8_t>({4}, {0, 1, 2, 3}),
- BufferDataPrintMode::kSignedInteger);
- RoundTripTest(ShapedBuffer::Create<int16_t>({4}, {0, 1, 2, 3}),
- BufferDataPrintMode::kSignedInteger);
- RoundTripTest(ShapedBuffer::Create<uint16_t>({4}, {0, 1, 2, 3}),
- BufferDataPrintMode::kSignedInteger);
- RoundTripTest(ShapedBuffer::Create<float>({4}, {0, 1.1, 2, 3}),
- BufferDataPrintMode::kSignedInteger);
- RoundTripTest(ShapedBuffer::Create<int8_t>({1, 2, 3}, {0, 1, 2, 3, 4, 5}),
- BufferDataPrintMode::kSignedInteger);
- RoundTripTest(ShapedBuffer(1, {4}, {0, 1, 2, 3}),
- BufferDataPrintMode::kBinary);
-}
-
-} // namespace
-} // namespace iree
diff --git a/iree/build_defs.oss.bzl b/iree/build_defs.oss.bzl
index 6b1184d..a8586b2 100644
--- a/iree/build_defs.oss.bzl
+++ b/iree/build_defs.oss.bzl
@@ -54,8 +54,6 @@
# Driver modules that register themselves at link time.
IREE_DRIVER_MODULES = [
- # TODO(b/142004903): enable when Dawn HAL implementation is functional
- # "//iree/hal/dawn:dawn_driver_module",
"//iree/hal/dylib:dylib_driver_module",
"//iree/hal/vmla:vmla_driver_module",
"//iree/hal/vulkan:vulkan_driver_module",
diff --git a/iree/hal/api.cc b/iree/hal/api.cc
index 25681e0..088f055 100644
--- a/iree/hal/api.cc
+++ b/iree/hal/api.cc
@@ -391,11 +391,11 @@
LOG(ERROR) << "Unimplemented parser for element format FLOAT_16";
return IREE_STATUS_UNIMPLEMENTED;
case IREE_HAL_ELEMENT_TYPE_FLOAT_32:
- n = std::snprintf(buffer, buffer ? buffer_capacity : 0, "%F",
+ n = std::snprintf(buffer, buffer ? buffer_capacity : 0, "%G",
*reinterpret_cast<const float*>(data.data));
break;
case IREE_HAL_ELEMENT_TYPE_FLOAT_64:
- n = std::snprintf(buffer, buffer ? buffer_capacity : 0, "%E",
+ n = std::snprintf(buffer, buffer ? buffer_capacity : 0, "%G",
*reinterpret_cast<const double*>(data.data));
break;
default: {
diff --git a/iree/hal/api_string_util_test.cc b/iree/hal/api_string_util_test.cc
index 21aa960..8e9efc1 100644
--- a/iree/hal/api_string_util_test.cc
+++ b/iree/hal/api_string_util_test.cc
@@ -762,11 +762,10 @@
IsOkAndHolds(Eq("9223372036854775807")));
EXPECT_THAT(FormatElement<uint64_t>(UINT64_MAX),
IsOkAndHolds(Eq("18446744073709551615")));
- EXPECT_THAT(FormatElement<float>(1.5f), IsOkAndHolds(Eq("1.500000")));
+ EXPECT_THAT(FormatElement<float>(1.5f), IsOkAndHolds(Eq("1.5")));
EXPECT_THAT(FormatElement<double>(1123.56789456789),
- IsOkAndHolds(Eq("1.123568E+03")));
- EXPECT_THAT(FormatElement<double>(-1.5e-10),
- IsOkAndHolds(Eq("-1.500000E-10")));
+ IsOkAndHolds(Eq("1123.57")));
+ EXPECT_THAT(FormatElement<double>(-1.5e-10), IsOkAndHolds(Eq("-1.5E-10")));
}
TEST(ElementStringUtilTest, FormatOpaqueElement) {
@@ -1029,9 +1028,8 @@
expect_round_trip("4xi16=0 -1 2 3");
expect_round_trip("4xu16=0 1 2 3");
expect_round_trip("2x2xi32=[0 1][2 3]");
- expect_round_trip("4xf32=0.000000 1.100000 2.000000 3.000000");
- expect_round_trip(
- "4xf64=0.000000E+00 1.100000E+00 2.000000E+00 3.000000E+00");
+ expect_round_trip("4xf32=0 1.1 2 3");
+ expect_round_trip("4xf64=0 1.1 2 3");
expect_round_trip("1x2x3xi8=[[0 1 2][3 4 5]]");
expect_round_trip("2x*16=AABB CCDD");
expect_round_trip(
diff --git a/iree/hal/cts/BUILD b/iree/hal/cts/BUILD
index 9c14754..4fa423d 100644
--- a/iree/hal/cts/BUILD
+++ b/iree/hal/cts/BUILD
@@ -40,7 +40,6 @@
"//iree/hal/llvmjit:llvmjit_driver_module", # build-cleaner: keep
"//iree/hal/vmla:vmla_driver_module", # build-cleaner: keep
"//iree/hal/vulkan:vulkan_driver_module", # build-cleaner: keep
- # "//iree/hal/dawn:dawn_driver_module", # build-cleaner: keep
] + PLATFORM_VULKAN_TEST_DEPS,
)
diff --git a/iree/hal/dawn/BUILD b/iree/hal/dawn/BUILD
deleted file mode 100644
index 0b50c82..0000000
--- a/iree/hal/dawn/BUILD
+++ /dev/null
@@ -1,89 +0,0 @@
-# Copyright 2019 Google LLC
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# https://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# HAL implementation using Dawn and SPIR-V executables.
-# https://dawn.googlesource.com/dawn
-
-package(
- default_visibility = ["//visibility:public"],
- features = ["layering_check"],
- licenses = ["notice"], # Apache 2.0
-)
-
-cc_library(
- name = "dawn_device",
- srcs = ["dawn_device.cc"],
- hdrs = ["dawn_device.h"],
- deps = [
- "//iree/base:memory",
- "//iree/base:status",
- "//iree/base:tracing",
- "//iree/hal:command_queue",
- "//iree/hal:device",
- "//iree/hal:executable_cache",
- "//iree/hal:semaphore",
- "//iree/hal/host:host_local_allocator",
- "//third_party/dawn:dawn_native",
- "//third_party/dawn:dawncpp_headers",
- "//third_party/dawn:libdawn_proc", # build-cleaner: keep
- "@com_google_absl//absl/container:inlined_vector",
- "@com_google_absl//absl/memory",
- "@com_google_absl//absl/strings",
- "@com_google_absl//absl/types:span",
- ],
-)
-
-cc_library(
- name = "dawn_driver",
- srcs = ["dawn_driver.cc"],
- hdrs = ["dawn_driver.h"],
- deps = [
- ":dawn_device",
- "//iree/base:status",
- "//iree/base:tracing",
- "//iree/hal:device_info",
- "//iree/hal:driver",
- "//third_party/dawn:dawn_headers",
- "//third_party/dawn:dawn_native",
- "//third_party/dawn:dawncpp",
- "//third_party/dawn:dawncpp_headers",
- "//third_party/dawn:libdawn_proc", # build-cleaner: keep
- "@com_google_absl//absl/memory",
- "@com_google_absl//absl/strings",
- ],
-)
-
-# TODO(scotttodd): Use SwiftShader to test Vulkan backend
-cc_test(
- name = "dawn_driver_test",
- srcs = ["dawn_driver_test.cc"],
- deps = [
- ":dawn_driver",
- "//iree/base:status_matchers",
- "//iree/testing:gtest_main",
- ],
-)
-
-cc_library(
- name = "dawn_driver_module",
- srcs = ["dawn_driver_module.cc"],
- deps = [
- ":dawn_driver",
- "//iree/base:init",
- "//iree/base:status",
- "//iree/base:tracing",
- "//iree/hal:driver_registry",
- ],
- alwayslink = 1,
-)
diff --git a/iree/hal/dawn/dawn_device.cc b/iree/hal/dawn/dawn_device.cc
deleted file mode 100644
index 4aa3b53..0000000
--- a/iree/hal/dawn/dawn_device.cc
+++ /dev/null
@@ -1,153 +0,0 @@
-// Copyright 2019 Google LLC
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// https://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "iree/hal/dawn/dawn_device.h"
-
-#include "absl/memory/memory.h"
-#include "absl/strings/str_cat.h"
-#include "iree/base/status.h"
-#include "iree/base/tracing.h"
-#include "iree/hal/command_queue.h"
-#include "iree/hal/executable_cache.h"
-#include "iree/hal/semaphore.h"
-
-namespace iree {
-namespace hal {
-namespace dawn {
-
-namespace {
-
-// ExecutableCache implementation that compiles but does nothing.
-// This will be replaced with something functional soon.
-class NoopExecutableCache final : public ExecutableCache {
- public:
- explicit NoopExecutableCache() {}
- ~NoopExecutableCache() override = default;
-
- bool CanPrepareFormat(ExecutableFormat format) const override {
- return false;
- }
-
- StatusOr<ref_ptr<Executable>> PrepareExecutable(
- ExecutableLayout* executable_layout, ExecutableCachingModeBitfield mode,
- const ExecutableSpec& spec) override {
- return UnimplementedErrorBuilder(IREE_LOC) << "PrepareExecutable NYI";
- }
-};
-
-} // namespace
-
-DawnDevice::DawnDevice(const DeviceInfo& device_info,
- ::wgpu::Device backend_device)
- : Device(device_info), backend_device_(backend_device) {
- IREE_TRACE_SCOPE0("DawnDevice::ctor");
-
- // TODO(scotttodd): construct command queues, perform other initialization
-
- // Log some basic device info.
- std::string backend_type_str;
- auto* adapter =
- reinterpret_cast<dawn_native::Adapter*>(device_info.device_id());
- switch (adapter->GetBackendType()) {
- case dawn_native::BackendType::D3D12:
- backend_type_str = "D3D12";
- break;
- case dawn_native::BackendType::Metal:
- backend_type_str = "Metal";
- break;
- case dawn_native::BackendType::Null:
- backend_type_str = "Null";
- break;
- case dawn_native::BackendType::OpenGL:
- backend_type_str = "OpenGL";
- break;
- case dawn_native::BackendType::Vulkan:
- backend_type_str = "Vulkan";
- break;
- }
- LOG(INFO) << "Created DawnDevice '" << device_info.name() << "' ("
- << backend_type_str << ")";
-}
-
-DawnDevice::~DawnDevice() = default;
-
-std::string DawnDevice::DebugString() const {
- return absl::StrCat(Device::DebugString(), //
- "\n[DawnDevice]", //
- "\n Command Queues: ", command_queues_.size());
-}
-
-StatusOr<ref_ptr<DescriptorSetLayout>> DawnDevice::CreateDescriptorSetLayout(
- DescriptorSetLayout::UsageType usage_type,
- absl::Span<const DescriptorSetLayout::Binding> bindings) {
- IREE_TRACE_SCOPE0("DawnDevice::CreateDescriptorSetLayout");
- return UnimplementedErrorBuilder(IREE_LOC) << "CreateDescriptorSetLayout NYI";
-}
-
-StatusOr<ref_ptr<DescriptorSet>> DawnDevice::CreateDescriptorSet(
- DescriptorSetLayout* set_layout,
- absl::Span<const DescriptorSet::Binding> bindings) {
- IREE_TRACE_SCOPE0("DawnDevice::CreateDescriptorSet");
- return UnimplementedErrorBuilder(IREE_LOC) << "CreateDescriptorSet NYI";
-}
-
-ref_ptr<ExecutableCache> DawnDevice::CreateExecutableCache() {
- IREE_TRACE_SCOPE0("DawnDevice::CreateExecutableCache");
- return make_ref<NoopExecutableCache>();
-}
-
-StatusOr<ref_ptr<ExecutableLayout>> DawnDevice::CreateExecutableLayout(
- absl::Span<DescriptorSetLayout* const> set_layouts, size_t push_constants) {
- IREE_TRACE_SCOPE0("DawnDevice::CreateExecutableLayout");
- return UnimplementedErrorBuilder(IREE_LOC) << "CreateExecutableLayout NYI";
-}
-
-StatusOr<ref_ptr<CommandBuffer>> DawnDevice::CreateCommandBuffer(
- CommandBufferModeBitfield mode,
- CommandCategoryBitfield command_categories) {
- return UnimplementedErrorBuilder(IREE_LOC) << "CreateCommandBuffer NYI";
-}
-
-StatusOr<ref_ptr<Event>> DawnDevice::CreateEvent() {
- return UnimplementedErrorBuilder(IREE_LOC) << "CreateEvent NYI";
-}
-
-StatusOr<ref_ptr<Semaphore>> DawnDevice::CreateSemaphore(
- uint64_t initial_value) {
- IREE_TRACE_SCOPE0("DawnDevice::CreateSemaphore");
-
- return UnimplementedErrorBuilder(IREE_LOC) << "CreateSemaphore NYI";
-}
-
-Status DawnDevice::WaitAllSemaphores(
- absl::Span<const SemaphoreValue> semaphores, absl::Time deadline) {
- IREE_TRACE_SCOPE0("DawnDevice::WaitAllSemaphores");
-
- return UnimplementedErrorBuilder(IREE_LOC) << "WaitAllSemaphores NYI";
-}
-
-StatusOr<int> DawnDevice::WaitAnySemaphore(
- absl::Span<const SemaphoreValue> semaphores, absl::Time deadline) {
- IREE_TRACE_SCOPE0("DawnDevice::WaitAnySemaphore");
-
- return UnimplementedErrorBuilder(IREE_LOC) << "WaitAnySemaphore NYI";
-}
-
-Status DawnDevice::WaitIdle(absl::Time deadline) {
- return UnimplementedErrorBuilder(IREE_LOC) << "WaitIdle";
-}
-
-} // namespace dawn
-} // namespace hal
-} // namespace iree
diff --git a/iree/hal/dawn/dawn_device.h b/iree/hal/dawn/dawn_device.h
deleted file mode 100644
index a20da84..0000000
--- a/iree/hal/dawn/dawn_device.h
+++ /dev/null
@@ -1,88 +0,0 @@
-// Copyright 2019 Google LLC
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// https://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef IREE_HAL_DAWN_DAWN_DEVICE_H_
-#define IREE_HAL_DAWN_DAWN_DEVICE_H_
-
-#include "absl/container/inlined_vector.h"
-#include "absl/types/span.h"
-#include "iree/base/memory.h"
-#include "iree/hal/device.h"
-#include "iree/hal/host/host_local_allocator.h"
-#include "third_party/dawn/src/include/dawn/webgpu_cpp.h"
-#include "third_party/dawn/src/include/dawn_native/DawnNative.h"
-
-namespace iree {
-namespace hal {
-namespace dawn {
-
-class DawnDevice final : public Device {
- public:
- explicit DawnDevice(const DeviceInfo& device_info,
- ::wgpu::Device backend_device);
- ~DawnDevice() override;
-
- std::string DebugString() const override;
-
- Allocator* allocator() const override { return &allocator_; }
-
- absl::Span<CommandQueue*> dispatch_queues() const override {
- return RawPtrSpan(absl::MakeSpan(command_queues_));
- }
-
- absl::Span<CommandQueue*> transfer_queues() const override {
- return RawPtrSpan(absl::MakeSpan(command_queues_));
- }
-
- ref_ptr<ExecutableCache> CreateExecutableCache() override;
-
- StatusOr<ref_ptr<DescriptorSetLayout>> CreateDescriptorSetLayout(
- DescriptorSetLayout::UsageType usage_type,
- absl::Span<const DescriptorSetLayout::Binding> bindings) override;
-
- StatusOr<ref_ptr<ExecutableLayout>> CreateExecutableLayout(
- absl::Span<DescriptorSetLayout* const> set_layouts,
- size_t push_constants) override;
-
- StatusOr<ref_ptr<DescriptorSet>> CreateDescriptorSet(
- DescriptorSetLayout* set_layout,
- absl::Span<const DescriptorSet::Binding> bindings) override;
-
- StatusOr<ref_ptr<CommandBuffer>> CreateCommandBuffer(
- CommandBufferModeBitfield mode,
- CommandCategoryBitfield command_categories) override;
-
- StatusOr<ref_ptr<Event>> CreateEvent() override;
-
- StatusOr<ref_ptr<Semaphore>> CreateSemaphore(uint64_t initial_value) override;
-
- Status WaitAllSemaphores(absl::Span<const SemaphoreValue> semaphores,
- absl::Time deadline) override;
- StatusOr<int> WaitAnySemaphore(absl::Span<const SemaphoreValue> semaphores,
- absl::Time deadline) override;
-
- Status WaitIdle(absl::Time deadline) override;
-
- private:
- mutable host::HostLocalAllocator allocator_;
- mutable absl::InlinedVector<std::unique_ptr<CommandQueue>, 1> command_queues_;
-
- ::wgpu::Device backend_device_;
-};
-
-} // namespace dawn
-} // namespace hal
-} // namespace iree
-
-#endif // IREE_HAL_DAWN_DAWN_DEVICE_H_
diff --git a/iree/hal/dawn/dawn_driver.cc b/iree/hal/dawn/dawn_driver.cc
deleted file mode 100644
index 34dd792..0000000
--- a/iree/hal/dawn/dawn_driver.cc
+++ /dev/null
@@ -1,122 +0,0 @@
-// Copyright 2019 Google LLC
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// https://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "iree/hal/dawn/dawn_driver.h"
-
-#include "absl/memory/memory.h"
-#include "absl/strings/str_cat.h"
-#include "iree/base/status.h"
-#include "iree/base/tracing.h"
-#include "iree/hal/dawn/dawn_device.h"
-#include "iree/hal/device_info.h"
-#include "third_party/dawn/src/include/dawn/dawn_proc.h"
-
-namespace iree {
-namespace hal {
-namespace dawn {
-
-namespace {
-
-// Populates device information from the given dawn_native::Adapter.
-StatusOr<DeviceInfo> PopulateDeviceInfo(dawn_native::Adapter* adapter) {
- // TODO(scotttodd): Query these for each backend or implement?
- DeviceFeatureBitfield supported_features = DeviceFeature::kNone;
- // supported_features |= DeviceFeature::kDebugging;
- // supported_features |= DeviceFeature::kCoverage;
- // supported_features |= DeviceFeature::kProfiling;
-
- // TODO(scotttodd): more clever/sanitized device naming.
- std::string device_id = "dawn";
- std::string device_name = absl::StrCat("dawn-", adapter->GetPCIInfo().name);
-
- return DeviceInfo(device_id, device_name, supported_features,
- reinterpret_cast<DriverDeviceID>(adapter));
-}
-
-} // namespace
-
-DawnDriver::DawnDriver() : Driver("dawn") {
- dawn_instance_ = absl::make_unique<dawn_native::Instance>();
-}
-
-DawnDriver::~DawnDriver() = default;
-
-StatusOr<std::vector<DeviceInfo>> DawnDriver::EnumerateAvailableDevices() {
- IREE_TRACE_SCOPE0("DawnDriver::EnumerateAvailableDevices");
-
- if (dawn_backend_adapters_.empty()) {
- // Discover adapters (i.e. devices and their associated backend APIs).
- // Retain the list of adapters so pointers are valid for the lifetime of
- // this object.
- dawn_instance_->DiscoverDefaultAdapters();
- dawn_backend_adapters_ = dawn_instance_->GetAdapters();
- } else {
- // Assume that the list of adapters does not change. This is not guaranteed
- // to be true, but we also don't want to invalidate pointers by requesting
- // a new list each time. If the list of available devices would change,
- // tearing down and creating a new DawnDriver may be your best option.
- }
-
- // Convert to our HAL structure.
- std::vector<DeviceInfo> device_infos;
- device_infos.reserve(dawn_backend_adapters_.size());
- for (auto& adapter : dawn_backend_adapters_) {
- // TODO(scotttodd): if we fail should we just ignore the device in the list?
- ASSIGN_OR_RETURN(auto device_info, PopulateDeviceInfo(&adapter));
- device_infos.push_back(std::move(device_info));
- }
- return device_infos;
-}
-
-StatusOr<ref_ptr<Device>> DawnDriver::CreateDefaultDevice() {
- IREE_TRACE_SCOPE0("DawnDriver::CreateDefaultDevice");
-
- // Query available devices.
- ASSIGN_OR_RETURN(auto available_devices, EnumerateAvailableDevices());
- if (available_devices.empty()) {
- return NotFoundErrorBuilder(IREE_LOC) << "No devices are available";
- }
-
- // Create the first non-null device, if any.
- for (const auto& device : available_devices) {
- auto* adapter = reinterpret_cast<dawn_native::Adapter*>(device.device_id());
- if (adapter->GetBackendType() != dawn_native::BackendType::Null) {
- return CreateDevice(device.device_id());
- }
- }
-
- // Otherwise create the first null device.
- return CreateDevice(available_devices.front().device_id());
-}
-
-StatusOr<ref_ptr<Device>> DawnDriver::CreateDevice(DriverDeviceID device_id) {
- IREE_TRACE_SCOPE0("DawnDriver::CreateDevice");
-
- auto* adapter = reinterpret_cast<dawn_native::Adapter*>(device_id);
- ASSIGN_OR_RETURN(auto device_info, PopulateDeviceInfo(adapter));
-
- ::WGPUDevice c_backend_device = adapter->CreateDevice();
- if (!c_backend_device) {
- return InternalErrorBuilder(IREE_LOC) << "Failed to create a Dawn device";
- }
- DawnProcTable backend_procs = dawn_native::GetProcs();
- dawnProcSetProcs(&backend_procs);
- ::wgpu::Device backend_device = ::wgpu::Device::Acquire(c_backend_device);
-
- return make_ref<DawnDevice>(device_info, backend_device);
-}
-
-} // namespace dawn
-} // namespace hal
-} // namespace iree
diff --git a/iree/hal/dawn/dawn_driver.h b/iree/hal/dawn/dawn_driver.h
deleted file mode 100644
index 0d5ea07..0000000
--- a/iree/hal/dawn/dawn_driver.h
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2019 Google LLC
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// https://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef IREE_HAL_DAWN_DAWN_DRIVER_H_
-#define IREE_HAL_DAWN_DAWN_DRIVER_H_
-
-#include <memory>
-#include <vector>
-
-#include "iree/hal/driver.h"
-#include "third_party/dawn/src/include/dawn/webgpu_cpp.h"
-#include "third_party/dawn/src/include/dawn_native/DawnNative.h"
-
-namespace iree {
-namespace hal {
-namespace dawn {
-
-class DawnDriver final : public Driver {
- public:
- DawnDriver();
- ~DawnDriver() override;
-
- StatusOr<std::vector<DeviceInfo>> EnumerateAvailableDevices() override;
-
- StatusOr<ref_ptr<Device>> CreateDefaultDevice() override;
-
- StatusOr<ref_ptr<Device>> CreateDevice(DriverDeviceID device_id) override;
-
- private:
- std::unique_ptr<dawn_native::Instance> dawn_instance_;
- std::vector<dawn_native::Adapter> dawn_backend_adapters_;
-};
-
-} // namespace dawn
-} // namespace hal
-} // namespace iree
-
-#endif // IREE_HAL_DAWN_DAWN_DRIVER_H_
diff --git a/iree/hal/dawn/dawn_driver_module.cc b/iree/hal/dawn/dawn_driver_module.cc
deleted file mode 100644
index 6f62bbf..0000000
--- a/iree/hal/dawn/dawn_driver_module.cc
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2019 Google LLC
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// https://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include <memory>
-
-#include "iree/base/init.h"
-#include "iree/base/status.h"
-#include "iree/base/tracing.h"
-#include "iree/hal/dawn/dawn_driver.h"
-#include "iree/hal/driver_registry.h"
-
-namespace iree {
-namespace hal {
-namespace dawn {
-namespace {
-
-StatusOr<ref_ptr<Driver>> CreateDawnDriver() { return make_ref<DawnDriver>(); }
-
-} // namespace
-} // namespace dawn
-} // namespace hal
-} // namespace iree
-
-IREE_REGISTER_MODULE_INITIALIZER(iree_hal_dawn_driver, {
- QCHECK_OK(::iree::hal::DriverRegistry::shared_registry()->Register(
- "dawn", ::iree::hal::dawn::CreateDawnDriver));
-});
-IREE_REGISTER_MODULE_INITIALIZER_SEQUENCE(iree_hal, iree_hal_dawn_driver);
diff --git a/iree/hal/dawn/dawn_driver_test.cc b/iree/hal/dawn/dawn_driver_test.cc
deleted file mode 100644
index ccecbe4..0000000
--- a/iree/hal/dawn/dawn_driver_test.cc
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2019 Google LLC
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// https://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "iree/hal/dawn/dawn_driver.h"
-
-#include "iree/base/status_matchers.h"
-#include "iree/testing/gtest.h"
-
-namespace iree {
-namespace hal {
-namespace dawn {
-namespace {
-
-TEST(DawnDriverTest, CreateDefaultDevice) {
- DawnDriver dawn_driver;
- ASSERT_OK_AND_ASSIGN(auto default_device, dawn_driver.CreateDefaultDevice());
-}
-
-TEST(DawnDriverTest, EnumerateDevicesAndCreate) {
- DawnDriver dawn_driver;
-
- ASSERT_OK_AND_ASSIGN(auto available_devices,
- dawn_driver.EnumerateAvailableDevices());
- ASSERT_GT(available_devices.size(), 0);
-
- ASSERT_OK_AND_ASSIGN(
- auto first_device,
- dawn_driver.CreateDevice(available_devices[0].device_id()));
-}
-
-} // namespace
-} // namespace dawn
-} // namespace hal
-} // namespace iree
diff --git a/iree/modules/check/BUILD b/iree/modules/check/BUILD
index 87f83a0..863b189 100644
--- a/iree/modules/check/BUILD
+++ b/iree/modules/check/BUILD
@@ -80,7 +80,6 @@
deps = [
"//iree/base:api",
"//iree/base:api_util",
- "//iree/base:buffer_string_util",
"//iree/base:status",
"//iree/hal:api",
"//iree/modules/hal",
diff --git a/iree/modules/check/CMakeLists.txt b/iree/modules/check/CMakeLists.txt
index fb6d66e..804b844 100644
--- a/iree/modules/check/CMakeLists.txt
+++ b/iree/modules/check/CMakeLists.txt
@@ -80,7 +80,6 @@
absl::strings
iree::base::api
iree::base::api_util
- iree::base::buffer_string_util
iree::base::status
iree::hal::api
iree::modules::hal
diff --git a/iree/modules/check/native_module.cc b/iree/modules/check/native_module.cc
index d90d521..4647643 100644
--- a/iree/modules/check/native_module.cc
+++ b/iree/modules/check/native_module.cc
@@ -24,7 +24,6 @@
#include "absl/strings/str_cat.h"
#include "iree/base/api.h"
#include "iree/base/api_util.h"
-#include "iree/base/buffer_string_util.h"
#include "iree/base/status.h"
#include "iree/hal/api.h"
#include "iree/modules/hal/hal_module.h"
@@ -47,6 +46,22 @@
bytes.data_length / sizeof(T));
}
+StatusOr<std::string> BufferViewToString(iree_hal_buffer_view_t* buffer_view) {
+ std::string result_str(4096, '\0');
+ iree_status_t status;
+ do {
+ iree_host_size_t actual_length = 0;
+ status = iree_hal_buffer_view_format(
+ buffer_view, /*max_element_count=*/1024, result_str.size() + 1,
+ &result_str[0], &actual_length);
+ result_str.resize(actual_length);
+ } while (iree_status_is_out_of_range(status));
+ if (!iree_status_is_ok(status)) {
+ return FromApiStatus(status, IREE_LOC);
+ }
+ return std::move(result_str);
+}
+
template <typename T>
Status ExpectAllTrue(iree_byte_span_t bytes) {
EXPECT_THAT(AbslSpan<T>(bytes), Each(Not(0)));
@@ -225,6 +240,9 @@
bool shape_eq = lhs_shape == rhs_shape;
bool contents_eq =
EqByteSpan(lhs_mapped_memory.contents, rhs_mapped_memory.contents);
+ iree_hal_buffer_unmap(lhs_buf, &lhs_mapped_memory);
+ iree_hal_buffer_unmap(rhs_buf, &rhs_mapped_memory);
+
if (!element_types_eq || !shape_eq || !contents_eq) {
std::ostringstream os;
os << "Expected equality of these values.";
@@ -241,43 +259,18 @@
os << "\n"
" lhs:\n"
" ";
- char lhs_element_type_str[16];
- RETURN_IF_ERROR(FromApiStatus(
- iree_hal_format_element_type(iree_hal_buffer_view_element_type(lhs),
- sizeof(lhs_element_type_str),
- lhs_element_type_str, nullptr),
- IREE_LOC));
- // TODO(b/146898896): Remove dependence on Shape.
- PrintShapedTypeToStream(Shape{lhs_shape}, lhs_element_type_str, &os);
- os << "=";
- RETURN_IF_ERROR(
- PrintNumericalDataToStream(Shape{lhs_shape}, lhs_element_type_str,
- {lhs_mapped_memory.contents.data,
- lhs_mapped_memory.contents.data_length},
- /*max_entries=*/1024, &os));
+ ASSIGN_OR_RETURN(auto lhs_str, BufferViewToString(lhs));
+ os << lhs_str;
os << "\n"
" rhs:\n"
" ";
- char rhs_element_type_str[16];
- RETURN_IF_ERROR(FromApiStatus(
- iree_hal_format_element_type(iree_hal_buffer_view_element_type(rhs),
- sizeof(rhs_element_type_str),
- rhs_element_type_str, nullptr),
- IREE_LOC));
- PrintShapedTypeToStream(Shape{rhs_shape}, rhs_element_type_str, &os);
- os << "=";
- RETURN_IF_ERROR(
- PrintNumericalDataToStream(Shape{rhs_shape}, rhs_element_type_str,
- {rhs_mapped_memory.contents.data,
- rhs_mapped_memory.contents.data_length},
- /*max_entries=*/1024, &os));
+ ASSIGN_OR_RETURN(auto rhs_str, BufferViewToString(rhs));
+ os << rhs_str;
// TODO(b/146898896): Use ADD_FAILURE_AT to propagate source location.
ADD_FAILURE() << os.str();
}
- iree_hal_buffer_unmap(lhs_buf, &lhs_mapped_memory);
- iree_hal_buffer_unmap(rhs_buf, &rhs_mapped_memory);
return OkStatus();
}
@@ -328,6 +321,9 @@
AlmostEqByteSpan(lhs_mapped_memory.contents,
rhs_mapped_memory.contents, lhs_element_type));
}
+ iree_hal_buffer_unmap(lhs_buf, &lhs_mapped_memory);
+ iree_hal_buffer_unmap(rhs_buf, &rhs_mapped_memory);
+
if (!element_types_eq || !shape_eq || !contents_could_be_almost_eq) {
std::ostringstream os;
os << "Expected near equality of these values.";
@@ -344,43 +340,18 @@
os << "\n"
" lhs:\n"
" ";
- char lhs_element_type_str[16];
- RETURN_IF_ERROR(FromApiStatus(
- iree_hal_format_element_type(iree_hal_buffer_view_element_type(lhs),
- sizeof(lhs_element_type_str),
- lhs_element_type_str, nullptr),
- IREE_LOC));
- // TODO(b/146898896): Remove dependence on Shape.
- PrintShapedTypeToStream(Shape{lhs_shape}, lhs_element_type_str, &os);
- os << "=";
- RETURN_IF_ERROR(
- PrintNumericalDataToStream(Shape{lhs_shape}, lhs_element_type_str,
- {lhs_mapped_memory.contents.data,
- lhs_mapped_memory.contents.data_length},
- /*max_entries=*/1024, &os));
+ ASSIGN_OR_RETURN(auto lhs_str, BufferViewToString(lhs));
+ os << lhs_str;
os << "\n"
" rhs:\n"
" ";
- char rhs_element_type_str[16];
- RETURN_IF_ERROR(FromApiStatus(
- iree_hal_format_element_type(iree_hal_buffer_view_element_type(rhs),
- sizeof(rhs_element_type_str),
- rhs_element_type_str, nullptr),
- IREE_LOC));
- PrintShapedTypeToStream(Shape{rhs_shape}, rhs_element_type_str, &os);
- os << "=";
- RETURN_IF_ERROR(
- PrintNumericalDataToStream(Shape{rhs_shape}, rhs_element_type_str,
- {rhs_mapped_memory.contents.data,
- rhs_mapped_memory.contents.data_length},
- /*max_entries=*/1024, &os));
+ ASSIGN_OR_RETURN(auto rhs_str, BufferViewToString(rhs));
+ os << rhs_str;
// TODO(b/146898896): Use ADD_FAILURE_AT to propagate source location.
ADD_FAILURE() << os.str();
}
- iree_hal_buffer_unmap(lhs_buf, &lhs_mapped_memory);
- iree_hal_buffer_unmap(rhs_buf, &rhs_mapped_memory);
return OkStatus();
}
diff --git a/iree/samples/custom_modules/BUILD b/iree/samples/custom_modules/BUILD
index 411e69c..7a65e51 100644
--- a/iree/samples/custom_modules/BUILD
+++ b/iree/samples/custom_modules/BUILD
@@ -55,9 +55,6 @@
deps = [
"//iree/base:api",
"//iree/base:api_util",
- "//iree/base:buffer_string_util",
- "//iree/base:shape",
- "//iree/base:shaped_buffer_string_util",
"//iree/hal:api",
"//iree/modules/hal",
"//iree/vm",
diff --git a/iree/samples/custom_modules/CMakeLists.txt b/iree/samples/custom_modules/CMakeLists.txt
index 0998857..44224a4 100644
--- a/iree/samples/custom_modules/CMakeLists.txt
+++ b/iree/samples/custom_modules/CMakeLists.txt
@@ -59,9 +59,6 @@
DEPS
iree::base::api
iree::base::api_util
- iree::base::buffer_string_util
- iree::base::shape
- iree::base::shaped_buffer_string_util
iree::hal::api
iree::modules::hal
iree::vm
diff --git a/iree/samples/custom_modules/native_module.cc b/iree/samples/custom_modules/native_module.cc
index 93ffcf9..ade2f9c 100644
--- a/iree/samples/custom_modules/native_module.cc
+++ b/iree/samples/custom_modules/native_module.cc
@@ -19,9 +19,6 @@
#include "iree/base/api.h"
#include "iree/base/api_util.h"
-#include "iree/base/buffer_string_util.h"
-#include "iree/base/shape.h"
-#include "iree/base/shaped_buffer_string_util.h"
#include "iree/hal/api.h"
#include "iree/modules/hal/hal_module.h"
#include "iree/vm/module_abi_cc.h"
@@ -133,56 +130,36 @@
Status Initialize(int32_t unique_id) {
// Allocate a unique ID to demonstrate per-context state.
auto str_buffer = "ctx_" + std::to_string(unique_id);
- return FromApiStatus(
+ RETURN_IF_ERROR(FromApiStatus(
iree_custom_message_create(iree_make_cstring_view(str_buffer.c_str()),
allocator_, &unique_message_),
- IREE_LOC);
+ IREE_LOC));
+
+ // Setup a host-local allocator we can use because this sample doesn't have
+ // a real device allocator.
+ RETURN_IF_ERROR(FromApiStatus(iree_hal_allocator_create_host_local(
+ allocator_, &host_local_allocator_),
+ IREE_LOC));
+
+ return OkStatus();
}
// custom.buffer_to_message(%buffer_view) -> %result
StatusOr<vm::ref<iree_custom_message_t>> BufferToMessage(
vm::ref<iree_hal_buffer_view_t> buffer_view) {
- iree_hal_buffer_t* buffer = iree_hal_buffer_view_buffer(buffer_view.get());
-
- // Map the buffer memory so we can read it back.
- iree_hal_mapped_memory_t mapped_memory;
- RETURN_IF_ERROR(
- FromApiStatus(iree_hal_buffer_map(buffer, IREE_HAL_MEMORY_ACCESS_READ,
- 0, IREE_WHOLE_BUFFER, &mapped_memory),
- IREE_LOC));
-
- // NOTE: these string methods take the old Shape type and as such have a
- // rank limit. That limit is just an artifact of those APIs, not the
- // buffer view shape type.
- absl::InlinedVector<int32_t, kMaxRank> shape(kMaxRank);
- size_t rank = 0;
- RETURN_IF_ERROR(FromApiStatus(
- iree_hal_buffer_view_shape(buffer_view.get(), shape.capacity(),
- shape.data(), &rank),
- IREE_LOC));
- shape.resize(rank);
- char element_type_str[16];
- RETURN_IF_ERROR(
- FromApiStatus(iree_hal_format_element_type(
- iree_hal_buffer_view_element_type(buffer_view.get()),
- sizeof(element_type_str), element_type_str, nullptr),
- IREE_LOC));
-
- // Print the buffer contents using our helpers.
- std::string string_value;
- RETURN_IF_ERROR(PrintNumericalDataToString(
- Shape{shape}, element_type_str,
- {mapped_memory.contents.data, mapped_memory.contents.data_length},
- /*max_entries=*/1024, &string_value));
-
- // Prefix shape/type.
- string_value =
- absl::StrCat(PrintShapedTypeToString(Shape{shape}, element_type_str),
- "=", string_value);
-
- // Unmap the buffer when we are done with it.
- RETURN_IF_ERROR(
- FromApiStatus(iree_hal_buffer_unmap(buffer, &mapped_memory), IREE_LOC));
+ // Convert the buffer view to a [shape]x[type]=[contents] string.
+ std::string string_value(4096, '\0');
+ iree_status_t status;
+ do {
+ iree_host_size_t actual_length = 0;
+ status = iree_hal_buffer_view_format(
+ buffer_view.get(), /*max_element_count=*/1024,
+ string_value.size() + 1, &string_value[0], &actual_length);
+ string_value.resize(actual_length);
+ } while (iree_status_is_out_of_range(status));
+ if (!iree_status_is_ok(status)) {
+ return FromApiStatus(status, IREE_LOC);
+ }
// Pack the string contents into a message.
vm::ref<iree_custom_message_t> message;
@@ -197,57 +174,17 @@
// custom.message_to_buffer(%message) -> %buffer_view
StatusOr<vm::ref<iree_hal_buffer_view_t>> MessageToBuffer(
vm::ref<iree_custom_message_t> message) {
- // NOTE: these old-style parsing routines need to be updated for the new
- // type system. They use different types, different shapes, etc.
- auto str_parts = BufferStringParts::ExtractFrom(
- absl::string_view(message->value.data, message->value.size));
- iree_hal_element_type_t element_type = IREE_HAL_ELEMENT_TYPE_NONE;
- RETURN_IF_ERROR(FromApiStatus(
- iree_hal_parse_element_type(
- {str_parts.type_str.data(), str_parts.type_str.size()},
- &element_type),
- IREE_LOC));
- ASSIGN_OR_RETURN(auto shape, ParseShape(str_parts.shape_str));
-
- // TODO(benvanik): plumb through an allocator we can use.
- size_t allocation_size =
- shape.element_count() * iree_hal_element_byte_count(element_type);
- vm::ref<iree_hal_buffer_t> buffer;
- RETURN_IF_ERROR(FromApiStatus(
- iree_hal_heap_buffer_allocate(
- IREE_HAL_MEMORY_TYPE_HOST_LOCAL,
- static_cast<iree_hal_buffer_usage_t>(
- IREE_HAL_BUFFER_USAGE_ALL | IREE_HAL_BUFFER_USAGE_CONSTANT),
- allocation_size, IREE_ALLOCATOR_SYSTEM, IREE_ALLOCATOR_SYSTEM,
- &buffer),
- IREE_LOC));
- if (!str_parts.data_str.empty()) {
- // Map the buffer memory so we can write it with the data contents.
- iree_hal_mapped_memory_t mapped_memory;
- RETURN_IF_ERROR(FromApiStatus(
- iree_hal_buffer_map(buffer.get(),
- IREE_HAL_MEMORY_ACCESS_DISCARD_WRITE, 0,
- IREE_WHOLE_BUFFER, &mapped_memory),
- IREE_LOC));
-
- // Parse the data from the string right into the buffer.
- RETURN_IF_ERROR(ParseBufferDataAsType(
- str_parts.data_str, str_parts.type_str,
- absl::MakeSpan(mapped_memory.contents.data,
- mapped_memory.contents.data_length)));
-
- // Unmap the buffer when we are done with it.
- RETURN_IF_ERROR(FromApiStatus(
- iree_hal_buffer_unmap(buffer.get(), &mapped_memory), IREE_LOC));
- }
-
- // Wrap in a buffer view to pass back into the VM.
+ // Convert the [shape]x[type]=[contents] string to a buffer view.
+ auto input_string =
+ absl::string_view(message->value.data, message->value.size);
vm::ref<iree_hal_buffer_view_t> buffer_view;
- RETURN_IF_ERROR(FromApiStatus(
- iree_hal_buffer_view_create(buffer.get(), shape.data().data(),
- shape.size(), element_type,
- IREE_ALLOCATOR_SYSTEM, &buffer_view),
- IREE_LOC));
+ iree_status_t status = iree_hal_buffer_view_parse(
+ iree_string_view_t{input_string.data(), input_string.size()},
+ host_local_allocator_.get(), allocator_, &buffer_view);
+ if (!iree_status_is_ok(status)) {
+ return FromApiStatus(status, IREE_LOC)
+ << "Parsing value '" << input_string << "'";
+ }
return std::move(buffer_view);
}
@@ -289,6 +226,11 @@
// perform during operation.
iree_allocator_t allocator_ = IREE_ALLOCATOR_SYSTEM;
+ // HAL buffer allocator that uses host-local memory. This is just for this
+ // test as we don't actually use a HAL device and don't have a real device
+ // allocator to use.
+ vm::ref<iree_hal_allocator_t> host_local_allocator_;
+
// A unique message owned by the state and returned to the VM.
// This demonstrates any arbitrary per-context state one may want to store.
vm::ref<iree_custom_message_t> unique_message_;
diff --git a/iree/schemas/BUILD b/iree/schemas/BUILD
index b72d7a9..4d9d6d1 100644
--- a/iree/schemas/BUILD
+++ b/iree/schemas/BUILD
@@ -33,12 +33,6 @@
"--gen-object-api",
]
-iree_flatbuffer_cc_library(
- name = "buffer_data_def_cc_fbs",
- srcs = ["buffer_data_def.fbs"],
- flatc_args = FLATC_ARGS,
-)
-
# TODO(benvanik): also expose as C using flatcc.
iree_flatbuffer_cc_library(
name = "bytecode_module_def_cc_fbs",
@@ -53,12 +47,6 @@
)
iree_flatbuffer_cc_library(
- name = "interpreter_module_def_cc_fbs",
- srcs = ["interpreter_module_def.fbs"],
- flatc_args = FLATC_ARGS,
-)
-
-iree_flatbuffer_cc_library(
name = "llvmir_executable_def_cc_fbs",
srcs = ["llvmir_executable_def.fbs"],
flatc_args = FLATC_ARGS,
@@ -79,10 +67,8 @@
iree_build_test(
name = "schema_build_test",
targets = [
- ":buffer_data_def_cc_fbs",
":bytecode_module_def_cc_fbs",
":dylib_executable_def_cc_fbs",
- ":interpreter_module_def_cc_fbs",
":llvmir_executable_def_cc_fbs",
":spirv_executable_def_cc_fbs",
":vmla_executable_def_cc_fbs",
@@ -90,10 +76,8 @@
)
REFLECTION_SRCS = [] if not FLATBUFFER_SUPPORTS_REFLECTIONS else [
- "buffer_data_def.bfbs",
"bytecode_module_def.bfbs",
"dylib_executable_def.bfbs",
- "interpreter_module_def.bfbs",
"llvmir_executable_def.bfbs",
"spirv_executable_def.bfbs",
"vmla_executable_def.bfbs",
diff --git a/iree/schemas/CMakeLists.txt b/iree/schemas/CMakeLists.txt
index ebabfc0..751ed40 100644
--- a/iree/schemas/CMakeLists.txt
+++ b/iree/schemas/CMakeLists.txt
@@ -16,19 +16,6 @@
flatbuffer_cc_library(
NAME
- buffer_data_def_cc_fbs
- SRCS
- "buffer_data_def.fbs"
- FLATC_ARGS
- "--keep-prefix"
- "--scoped-enums"
- "--reflect-names"
- "--gen-object-api"
- PUBLIC
-)
-
-flatbuffer_cc_library(
- NAME
bytecode_module_def_cc_fbs
SRCS
"bytecode_module_def.fbs"
@@ -55,19 +42,6 @@
flatbuffer_cc_library(
NAME
- interpreter_module_def_cc_fbs
- SRCS
- "interpreter_module_def.fbs"
- FLATC_ARGS
- "--keep-prefix"
- "--scoped-enums"
- "--reflect-names"
- "--gen-object-api"
- PUBLIC
-)
-
-flatbuffer_cc_library(
- NAME
llvmir_executable_def_cc_fbs
SRCS
"llvmir_executable_def.fbs"
diff --git a/iree/schemas/buffer_data_def.fbs b/iree/schemas/buffer_data_def.fbs
deleted file mode 100644
index 546e2bf..0000000
--- a/iree/schemas/buffer_data_def.fbs
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2019 Google LLC
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// https://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-namespace iree;
-
-enum BufferConstantEncoding : uint8 {
- DENSE = 0,
- SPLAT,
-}
-
-table BufferDataDef {
- encoding:BufferConstantEncoding;
- element_width:int;
- shape:[int];
- contents:[byte];
-}
diff --git a/iree/schemas/interpreter_module_def.fbs b/iree/schemas/interpreter_module_def.fbs
deleted file mode 100644
index 189e424..0000000
--- a/iree/schemas/interpreter_module_def.fbs
+++ /dev/null
@@ -1,104 +0,0 @@
-// Copyright 2019 Google LLC
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// https://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-namespace iree;
-
-// 'Executable MODule'.
-file_identifier "EMOD";
-file_extension "emod";
-
-table FloatTypeDef {
- width:int;
-}
-
-table IntegerTypeDef {
- width:int;
-}
-
-table UnknownTypeDef {
- dialect:string;
- type_data:string;
-}
-
-union ElementTypeDefUnion {
- FloatTypeDef,
- IntegerTypeDef,
- UnknownTypeDef,
-}
-
-table ElementTypeDef {
- type_union:ElementTypeDefUnion;
-}
-
-table MemRefTypeDef {
- element_type:ElementTypeDef;
- shape:[int];
- memory_space:int;
-}
-
-table DeviceTypeDef {}
-table CommandBufferTypeDef {}
-table EventTypeDef {}
-table SemaphoreTypeDef {}
-table FenceTypeDef {}
-
-union TypeDefUnion {
- MemRefTypeDef,
- DeviceTypeDef,
- CommandBufferTypeDef,
- EventTypeDef,
- SemaphoreTypeDef,
- FenceTypeDef,
-}
-
-table TypeDef {
- type_union:TypeDefUnion;
-}
-
-table FunctionTypeDef {
- inputs:[TypeDef];
- results:[TypeDef];
-}
-
-table BytecodeDef {
- local_count:int;
- contents:[byte];
-}
-
-table FunctionAttributeDef {
- key:string;
- value:string;
-}
-
-table FunctionDef {
- name:string;
- type:FunctionTypeDef;
-
- attrs:[FunctionAttributeDef];
-
- bytecode:BytecodeDef;
-}
-
-table FunctionTableDef {
- functions:[FunctionDef];
- imports:[int];
- exports:[int];
-}
-
-table ModuleDef {
- name:string;
- function_table:FunctionTableDef;
-}
-
-root_type ModuleDef;
diff --git a/iree/tools/BUILD b/iree/tools/BUILD
index 3ee8120..6f3cd56 100644
--- a/iree/tools/BUILD
+++ b/iree/tools/BUILD
@@ -344,10 +344,6 @@
hdrs = ["vm_util.h"],
deps = [
"//iree/base:api_util",
- "//iree/base:buffer_string_util",
- "//iree/base:shape",
- "//iree/base:shaped_buffer",
- "//iree/base:shaped_buffer_string_util",
"//iree/base:signature_mangle",
"//iree/base:status",
"//iree/hal:api",
diff --git a/iree/tools/CMakeLists.txt b/iree/tools/CMakeLists.txt
index 4f1e8b4..9d57aff 100644
--- a/iree/tools/CMakeLists.txt
+++ b/iree/tools/CMakeLists.txt
@@ -362,10 +362,6 @@
absl::span
absl::strings
iree::base::api_util
- iree::base::buffer_string_util
- iree::base::shape
- iree::base::shaped_buffer
- iree::base::shaped_buffer_string_util
iree::base::signature_mangle
iree::base::status
iree::hal::api
diff --git a/iree/tools/vm_util.cc b/iree/tools/vm_util.cc
index 30877f9..f911a34 100644
--- a/iree/tools/vm_util.cc
+++ b/iree/tools/vm_util.cc
@@ -21,10 +21,6 @@
#include "absl/strings/strip.h"
#include "absl/types/span.h"
#include "iree/base/api_util.h"
-#include "iree/base/buffer_string_util.h"
-#include "iree/base/shape.h"
-#include "iree/base/shaped_buffer.h"
-#include "iree/base/shaped_buffer_string_util.h"
#include "iree/base/signature_mangle.h"
#include "iree/base/status.h"
#include "iree/hal/api.h"
@@ -130,51 +126,14 @@
break;
}
case RawSignatureParser::Type::kBuffer: {
- ASSIGN_OR_RETURN(auto shaped_buffer,
- ParseShapedBufferFromString(input_string),
- _ << "Parsing value '" << input_string << "'");
- // Allocate the buffer.
- iree_hal_buffer_t* buf = nullptr;
- // TODO(benvanik): combined function for linear to optimal upload.
- iree_device_size_t allocation_size =
- shaped_buffer.shape().element_count() *
- shaped_buffer.element_size();
- RETURN_IF_ERROR(FromApiStatus(
- iree_hal_allocator_allocate_buffer(
- allocator,
- static_cast<iree_hal_memory_type_t>(
- IREE_HAL_MEMORY_TYPE_HOST_LOCAL |
- IREE_HAL_MEMORY_TYPE_DEVICE_VISIBLE),
- static_cast<iree_hal_buffer_usage_t>(
- IREE_HAL_BUFFER_USAGE_ALL | IREE_HAL_BUFFER_USAGE_CONSTANT),
- allocation_size, &buf),
- IREE_LOC))
- << "Allocating buffer";
- RETURN_IF_ERROR(FromApiStatus(
- iree_hal_buffer_write_data(buf, 0, shaped_buffer.contents().data(),
- shaped_buffer.contents().size()),
- IREE_LOC))
- << "Populating buffer contents ";
-
- absl::InlinedVector<iree_hal_dim_t, 5> dims(
- shaped_buffer.shape().size());
- // TODO(laurenzo): The following should work but Shape iterators
- // cause access violations.
- // std::copy(shaped_buffer.shape().begin(), shaped_buffer.shape().end(),
- // dims.begin());
- for (size_t i = 0; i < dims.size(); ++i) {
- dims[i] = shaped_buffer.shape()[i];
- }
-
- // Wrap in buffer view.
iree_hal_buffer_view_t* buffer_view = nullptr;
- RETURN_IF_ERROR(FromApiStatus(
- iree_hal_buffer_view_create(buf, dims.data(), dims.size(),
- hal_element_type, IREE_ALLOCATOR_SYSTEM,
- &buffer_view),
- IREE_LOC))
- << "Creating buffer view";
- iree_hal_buffer_release(buf);
+ iree_status_t status = iree_hal_buffer_view_parse(
+ iree_string_view_t{input_string.data(), input_string.size()},
+ allocator, IREE_ALLOCATOR_SYSTEM, &buffer_view);
+ if (!iree_status_is_ok(status)) {
+ return FromApiStatus(status, IREE_LOC)
+ << "Parsing value '" << input_string << "'";
+ }
auto buffer_view_ref = iree_hal_buffer_view_move_ref(buffer_view);
RETURN_IF_ERROR(FromApiStatus(iree_vm_variant_list_append_ref_move(
variant_list, &buffer_view_ref),
@@ -231,63 +190,20 @@
return InvalidArgumentErrorBuilder(IREE_LOC)
<< "failed dereferencing variant " << i;
}
- auto* buffer = iree_hal_buffer_view_buffer(buffer_view);
- if (!buffer) {
- return InvalidArgumentErrorBuilder(IREE_LOC)
- << "failed to get buffer for variant " << i;
+
+ std::string result_str(4096, '\0');
+ iree_status_t status;
+ do {
+ iree_host_size_t actual_length = 0;
+ status = iree_hal_buffer_view_format(
+ buffer_view, /*max_element_count=*/1024, result_str.size() + 1,
+ &result_str[0], &actual_length);
+ result_str.resize(actual_length);
+ } while (iree_status_is_out_of_range(status));
+ if (!iree_status_is_ok(status)) {
+ return FromApiStatus(status, IREE_LOC);
}
- auto print_mode = BufferDataPrintMode::kFloatingPoint;
- int8_t element_size = 4;
-
- // Copy the dims out of the buffer view.
- absl::InlinedVector<iree_hal_dim_t, 5> dims32(
- iree_hal_buffer_view_shape_rank(buffer_view));
- iree_hal_buffer_view_shape(buffer_view, dims32.size(), dims32.data(),
- nullptr);
- absl::InlinedVector<int, 5> dims(dims32.size());
- std::copy(dims32.begin(), dims32.end(), dims.begin());
- Shape shape{dims};
-
- switch (desc.buffer.scalar_type) {
- case AbiConstants::ScalarType::kIeeeFloat16:
- case AbiConstants::ScalarType::kIeeeFloat32:
- case AbiConstants::ScalarType::kIeeeFloat64:
- print_mode = BufferDataPrintMode::kFloatingPoint;
- break;
- case AbiConstants::ScalarType::kSint8:
- case AbiConstants::ScalarType::kSint16:
- case AbiConstants::ScalarType::kSint32:
- case AbiConstants::ScalarType::kSint64:
- print_mode = BufferDataPrintMode::kSignedInteger;
- break;
- case AbiConstants::ScalarType::kUint8:
- case AbiConstants::ScalarType::kUint16:
- case AbiConstants::ScalarType::kUint32:
- case AbiConstants::ScalarType::kUint64:
- print_mode = BufferDataPrintMode::kUnsignedInteger;
- break;
- default:
- print_mode = BufferDataPrintMode::kBinary;
- break;
- }
- element_size = AbiConstants::kScalarTypeSize[static_cast<unsigned>(
- desc.buffer.scalar_type)];
-
- iree_hal_mapped_memory_t mapped_memory;
- RETURN_IF_ERROR(FromApiStatus(
- iree_hal_buffer_map(buffer, IREE_HAL_MEMORY_ACCESS_READ, 0,
- IREE_WHOLE_BUFFER, &mapped_memory),
- IREE_LOC))
- << "mapping hal buffer";
- auto contents = absl::MakeConstSpan(mapped_memory.contents.data,
- mapped_memory.contents.data_length);
- ShapedBuffer shaped_buffer(
- element_size, shape,
- std::vector<uint8_t>(contents.begin(), contents.end()));
- ASSIGN_OR_RETURN(auto result_str, PrintShapedBufferToString(
- shaped_buffer, print_mode, 1024));
- iree_hal_buffer_unmap(buffer, &mapped_memory);
*os << result_str << "\n";
break;
}
diff --git a/iree/tools/vm_util.h b/iree/tools/vm_util.h
index c039a1d..1a793c3 100644
--- a/iree/tools/vm_util.h
+++ b/iree/tools/vm_util.h
@@ -46,7 +46,7 @@
// Buffers should be in the IREE standard shaped buffer format:
// [shape]xtype=[value]
// described in
-// https://github.com/google/iree/tree/main/iree/base/buffer_string_util.h
+// https://github.com/google/iree/tree/main/iree/hal/api.h
// Uses |allocator| to allocate the buffers.
// Uses descriptors in |descs| for type information and validation.
// The returned variant list must be freed by the caller.
@@ -61,7 +61,7 @@
// Prints buffers in the IREE standard shaped buffer format:
// [shape]xtype=[value]
// described in
-// https://github.com/google/iree/tree/main/iree/base/buffer_string_util.h
+// https://github.com/google/iree/tree/main/iree/hal/api.h
// Uses descriptors in |descs| for type information and validation.
Status PrintVariantList(absl::Span<const RawSignatureParser::Description> descs,
iree_vm_variant_list_t* variant_list,