Adding an in-place iree_tooling_parse_into_variant_list.
diff --git a/runtime/src/iree/tooling/vm_util.c b/runtime/src/iree/tooling/vm_util.c
index 0f488c9..c3b6fa3 100644
--- a/runtime/src/iree/tooling/vm_util.c
+++ b/runtime/src/iree/tooling/vm_util.c
@@ -159,6 +159,31 @@
       z0,
       iree_vm_list_create(
           /*element_type=*/NULL, input_strings_count, host_allocator, &list));
+
+  iree_status_t status = iree_tooling_parse_into_variant_list(
+      device_allocator, input_strings, input_strings_count, host_allocator,
+      list);
+  if (iree_status_is_ok(status)) {
+    *out_list = list;
+  } else {
+    iree_vm_list_release(list);
+  }
+  IREE_TRACE_ZONE_END(z0);
+  return status;
+}
+
+iree_status_t iree_tooling_parse_into_variant_list(
+    iree_hal_allocator_t* device_allocator,
+    const iree_string_view_t* input_strings,
+    iree_host_size_t input_strings_count, iree_allocator_t host_allocator,
+    iree_vm_list_t* list) {
+  IREE_TRACE_ZONE_BEGIN(z0);
+
+  // Reset the list and prepare for pushing items.
+  iree_vm_list_clear(list);
+  IREE_RETURN_AND_END_ZONE_IF_ERROR(
+      z0, iree_vm_list_reserve(list, input_strings_count));
+
   iree_status_t status = iree_ok_status();
   for (size_t i = 0; i < input_strings_count; ++i) {
     if (!iree_status_is_ok(status)) break;
@@ -250,11 +275,7 @@
       if (!iree_status_is_ok(status)) break;
     }
   }
-  if (iree_status_is_ok(status)) {
-    *out_list = list;
-  } else {
-    iree_vm_list_release(list);
-  }
+
   IREE_TRACE_ZONE_END(z0);
   return status;
 }
diff --git a/runtime/src/iree/tooling/vm_util.h b/runtime/src/iree/tooling/vm_util.h
index 3eae007..0375099 100644
--- a/runtime/src/iree/tooling/vm_util.h
+++ b/runtime/src/iree/tooling/vm_util.h
@@ -32,6 +32,19 @@
     iree_host_size_t input_strings_count, iree_allocator_t host_allocator,
     iree_vm_list_t** out_list);
 
+// Parses |input_strings| into a variant list of VM scalars and buffers.
+// Scalars should be in the format:
+//   type=value
+// Buffers should be in the IREE standard shaped buffer format:
+//   [shape]xtype=[value]
+// described in iree/hal/api.h
+// Uses |device_allocator| to allocate the buffers.
+iree_status_t iree_tooling_parse_into_variant_list(
+    iree_hal_allocator_t* device_allocator,
+    const iree_string_view_t* input_strings,
+    iree_host_size_t input_strings_count, iree_allocator_t host_allocator,
+    iree_vm_list_t* list);
+
 // Appends fences to |list| if the invocation model of |function| requires them.
 // If no |wait_fence| is provided then the invocation will begin immediately.
 // The caller must wait on the returned |out_signal_fence| before accessing the