Adding the `--print_max_element_count=` flag to iree-run-module. (#8105)

This allows overriding the 1024 limit in cases where the user wants to
see the full tensor outputs (hopefully piping to a file).
diff --git a/iree/tools/iree-run-module-main.cc b/iree/tools/iree-run-module-main.cc
index ec24203..fe9b311 100644
--- a/iree/tools/iree-run-module-main.cc
+++ b/iree/tools/iree-run-module-main.cc
@@ -37,6 +37,10 @@
 
 IREE_FLAG(string, driver, "vmvx", "Backend driver to use.");
 
+IREE_FLAG(int32_t, print_max_element_count, 1024,
+          "Prints up to the maximum number of elements of output tensors, "
+          "eliding the remainder.");
+
 IREE_FLAG(bool, print_statistics, false,
           "Prints runtime statistics to stderr on exit.");
 
@@ -152,7 +156,9 @@
                      iree_allocator_system()),
       "invoking function '%s'", function_name.c_str());
 
-  IREE_RETURN_IF_ERROR(PrintVariantList(outputs.get()), "printing results");
+  IREE_RETURN_IF_ERROR(
+      PrintVariantList(outputs.get(), (size_t)FLAG_print_max_element_count),
+      "printing results");
 
   inputs.reset();
   outputs.reset();
diff --git a/iree/tools/utils/vm_util.cc b/iree/tools/utils/vm_util.cc
index 39e1331..c3db733 100644
--- a/iree/tools/utils/vm_util.cc
+++ b/iree/tools/utils/vm_util.cc
@@ -134,7 +134,8 @@
   return OkStatus();
 }
 
-Status PrintVariantList(iree_vm_list_t* variant_list, std::ostream* os) {
+Status PrintVariantList(iree_vm_list_t* variant_list, size_t max_element_count,
+                        std::ostream* os) {
   for (iree_host_size_t i = 0; i < iree_vm_list_size(variant_list); ++i) {
     iree_vm_variant_t variant = iree_vm_variant_empty();
     IREE_RETURN_IF_ERROR(iree_vm_list_get_variant(variant_list, i, &variant),
@@ -175,9 +176,9 @@
         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);
+          status = iree_hal_buffer_view_format(buffer_view, max_element_count,
+                                               result_str.size() + 1,
+                                               &result_str[0], &actual_length);
           result_str.resize(actual_length);
         } while (iree_status_is_out_of_range(status));
         IREE_RETURN_IF_ERROR(status);
diff --git a/iree/tools/utils/vm_util.h b/iree/tools/utils/vm_util.h
index 5da92e4..697e5a1 100644
--- a/iree/tools/utils/vm_util.h
+++ b/iree/tools/utils/vm_util.h
@@ -46,8 +46,15 @@
 // described in
 // https://github.com/google/iree/tree/main/iree/hal/api.h
 // Uses descriptors in |descs| for type information and validation.
-Status PrintVariantList(iree_vm_list_t* variant_list,
-                        std::ostream* os = &std::cout);
+Status PrintVariantList(iree_vm_list_t* variant_list, size_t max_element_count,
+                        std::ostream* os);
+inline Status PrintVariantList(iree_vm_list_t* variant_list, std::ostream* os) {
+  return PrintVariantList(variant_list, 1024, os);
+}
+inline Status PrintVariantList(iree_vm_list_t* variant_list,
+                               size_t max_element_count = 1024) {
+  return PrintVariantList(variant_list, max_element_count, &std::cout);
+}
 
 // Creates the default device for |driver| in |out_device|.
 // The returned |out_device| must be released by the caller.