blob: b352fb02b42a946e4ab5eef19b0f0c113074a710 [file] [edit]
// Copyright 2026 The IREE Authors
//
// Licensed under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
#include "iree/hal/replay/dump.h"
#include <inttypes.h>
#include <stddef.h>
#include <string.h>
#include "iree/hal/replay/digest.h"
#include "iree/hal/replay/file_reader.h"
typedef struct iree_hal_replay_dump_context_t {
// Caller-provided streaming sink.
iree_hal_replay_dump_write_callback_t write_callback;
// Host allocator used for temporary line construction.
iree_allocator_t host_allocator;
} iree_hal_replay_dump_context_t;
typedef struct iree_hal_replay_dump_file_summary_t {
// Total top-level records in the replay file.
uint64_t record_count;
// Number of HAL object records.
uint64_t object_count;
// Number of replayable HAL operation records.
uint64_t operation_count;
// Number of replay scope begin records.
uint64_t scope_begin_count;
// Number of replay scope end records.
uint64_t scope_end_count;
// Number of explicitly unsupported HAL operation records.
uint64_t unsupported_count;
// Number of HAL file object records.
uint64_t file_object_count;
// Number of file objects referencing environment files by path.
uint64_t external_file_count;
// Number of file objects embedded inline in the replay file.
uint64_t inline_file_count;
// Number of file objects represented by captured queue_read ranges.
uint64_t range_file_count;
// Number of file objects using unknown future reference types.
uint64_t unknown_file_reference_count;
// Number of external file references validated by platform identity.
uint64_t identity_file_validation_count;
// Number of external file references validated by content digest.
uint64_t digest_file_validation_count;
// Number of file references with no validation beyond length.
uint64_t no_file_validation_count;
// Number of file references using unknown future validation modes.
uint64_t unknown_file_validation_count;
// Total captured length of externally referenced files.
uint64_t external_file_total_length;
// Total embedded inline file bytes.
uint64_t inline_file_total_length;
// Total length of files represented by captured queue_read ranges.
uint64_t range_file_total_length;
// Total bytes embedded on captured queue_read operation records.
uint64_t captured_read_total_length;
} iree_hal_replay_dump_file_summary_t;
static iree_status_t iree_hal_replay_dump_emit(
iree_hal_replay_dump_context_t* context, iree_string_builder_t* builder) {
if (iree_string_builder_size(builder) == 0) return iree_ok_status();
iree_status_t status = context->write_callback.fn(
context->write_callback.user_data, iree_string_builder_view(builder));
iree_string_builder_reset(builder);
return status;
}
static iree_status_t iree_hal_replay_dump_payload_length_check(
const iree_hal_replay_file_record_t* record,
iree_host_size_t expected_payload_length) {
if (IREE_LIKELY(record->payload.data_length == expected_payload_length)) {
return iree_ok_status();
}
return iree_make_status(IREE_STATUS_DATA_LOSS,
"replay payload type %u has %" PRIhsz
" bytes; expected %" PRIhsz,
record->header.payload_type,
record->payload.data_length, expected_payload_length);
}
static iree_hal_replay_file_range_t iree_hal_replay_dump_record_payload_range(
const iree_hal_replay_file_record_t* record,
iree_host_size_t record_offset) {
iree_hal_replay_file_range_t range = iree_hal_replay_file_range_empty();
range.offset = (uint64_t)record_offset + record->header.header_length;
range.length = record->header.payload_length;
range.uncompressed_length = record->header.payload_length;
range.compression_type = IREE_HAL_REPLAY_COMPRESSION_TYPE_NONE;
range.digest_type = IREE_HAL_REPLAY_DIGEST_TYPE_NONE;
return range;
}
static iree_status_t iree_hal_replay_dump_append_json_string_view(
iree_string_builder_t* builder, iree_string_view_t value) {
IREE_RETURN_IF_ERROR(iree_string_builder_append_cstring(builder, "\""));
for (iree_host_size_t i = 0; i < value.size; ++i) {
const char c = value.data[i];
switch (c) {
case '\\':
case '"': {
IREE_RETURN_IF_ERROR(
iree_string_builder_append_format(builder, "\\%c", c));
break;
}
case '\b': {
IREE_RETURN_IF_ERROR(
iree_string_builder_append_cstring(builder, "\\b"));
break;
}
case '\f': {
IREE_RETURN_IF_ERROR(
iree_string_builder_append_cstring(builder, "\\f"));
break;
}
case '\n': {
IREE_RETURN_IF_ERROR(
iree_string_builder_append_cstring(builder, "\\n"));
break;
}
case '\r': {
IREE_RETURN_IF_ERROR(
iree_string_builder_append_cstring(builder, "\\r"));
break;
}
case '\t': {
IREE_RETURN_IF_ERROR(
iree_string_builder_append_cstring(builder, "\\t"));
break;
}
default: {
if ((uint8_t)c < 0x20) {
IREE_RETURN_IF_ERROR(iree_string_builder_append_format(
builder, "\\u%04x", (uint32_t)(uint8_t)c));
} else {
IREE_RETURN_IF_ERROR(
iree_string_builder_append_format(builder, "%c", c));
}
break;
}
}
}
return iree_string_builder_append_cstring(builder, "\"");
}
static iree_status_t iree_hal_replay_dump_append_json_string(
iree_string_builder_t* builder, const char* value) {
return iree_hal_replay_dump_append_json_string_view(
builder, iree_make_cstring_view(value));
}
static iree_status_t iree_hal_replay_dump_append_json_file_range(
iree_string_builder_t* builder, const char* field_name,
const iree_hal_replay_file_range_t* range) {
return iree_string_builder_append_format(
builder,
",\"%s\":{\"offset\":%" PRIu64 ",\"length\":%" PRIu64
",\"uncompressed_length\":%" PRIu64
",\"compression_type\":%u"
",\"digest_type\":%u}",
field_name, range->offset, range->length, range->uncompressed_length,
(uint32_t)range->compression_type, (uint32_t)range->digest_type);
}
static iree_status_t iree_hal_replay_dump_summary_scan_file_object(
const iree_hal_replay_file_record_t* record,
iree_hal_replay_dump_file_summary_t* summary) {
if (record->payload.data_length <
sizeof(iree_hal_replay_file_object_payload_t)) {
return iree_make_status(IREE_STATUS_DATA_LOSS,
"replay file object payload is short");
}
iree_hal_replay_file_object_payload_t payload;
memcpy(&payload, record->payload.data, sizeof(payload));
if (payload.reference_length > IREE_HOST_SIZE_MAX ||
sizeof(payload) + (iree_host_size_t)payload.reference_length !=
record->payload.data_length) {
return iree_make_status(IREE_STATUS_DATA_LOSS,
"replay file object payload length mismatch");
}
++summary->file_object_count;
switch (payload.reference_type) {
case IREE_HAL_REPLAY_FILE_REFERENCE_TYPE_EXTERNAL_PATH:
++summary->external_file_count;
summary->external_file_total_length += payload.file_length;
break;
case IREE_HAL_REPLAY_FILE_REFERENCE_TYPE_INLINE_BYTES:
++summary->inline_file_count;
summary->inline_file_total_length += payload.reference_length;
break;
case IREE_HAL_REPLAY_FILE_REFERENCE_TYPE_CAPTURED_RANGES:
++summary->range_file_count;
summary->range_file_total_length += payload.file_length;
break;
default:
++summary->unknown_file_reference_count;
break;
}
switch (payload.validation_type) {
case IREE_HAL_REPLAY_FILE_VALIDATION_TYPE_NONE:
++summary->no_file_validation_count;
break;
case IREE_HAL_REPLAY_FILE_VALIDATION_TYPE_IDENTITY:
++summary->identity_file_validation_count;
break;
case IREE_HAL_REPLAY_FILE_VALIDATION_TYPE_CONTENT_DIGEST:
++summary->digest_file_validation_count;
break;
default:
++summary->unknown_file_validation_count;
break;
}
return iree_ok_status();
}
static iree_status_t iree_hal_replay_dump_summary_scan_operation(
const iree_hal_replay_file_record_t* record,
iree_hal_replay_dump_file_summary_t* summary) {
switch (record->header.operation_code) {
case IREE_HAL_REPLAY_OPERATION_CODE_REPLAY_SCOPE_BEGIN:
++summary->scope_begin_count;
break;
case IREE_HAL_REPLAY_OPERATION_CODE_REPLAY_SCOPE_END:
++summary->scope_end_count;
break;
default:
break;
}
switch (record->header.payload_type) {
case IREE_HAL_REPLAY_PAYLOAD_TYPE_DEVICE_QUEUE_READ: {
if (record->payload.data_length <
sizeof(iree_hal_replay_device_queue_read_payload_t)) {
return iree_make_status(IREE_STATUS_DATA_LOSS,
"replay queue read payload is short");
}
iree_hal_replay_device_queue_read_payload_t payload;
memcpy(&payload, record->payload.data, sizeof(payload));
summary->captured_read_total_length += payload.captured_data_length;
break;
}
default:
break;
}
return iree_ok_status();
}
static iree_status_t iree_hal_replay_dump_scan_summary(
iree_const_byte_span_t valid_contents, iree_host_size_t record_offset,
iree_hal_replay_dump_file_summary_t* out_summary) {
memset(out_summary, 0, sizeof(*out_summary));
uint64_t expected_sequence_ordinal = 0;
while (record_offset < valid_contents.data_length) {
iree_hal_replay_file_record_t record;
IREE_RETURN_IF_ERROR(iree_hal_replay_file_parse_record(
valid_contents, record_offset, &record, &record_offset));
if (record.header.sequence_ordinal != expected_sequence_ordinal++) {
return iree_make_status(IREE_STATUS_DATA_LOSS,
"replay record sequence ordinal mismatch");
}
++out_summary->record_count;
switch (record.header.record_type) {
case IREE_HAL_REPLAY_FILE_RECORD_TYPE_OBJECT:
++out_summary->object_count;
if (record.header.payload_type ==
IREE_HAL_REPLAY_PAYLOAD_TYPE_FILE_OBJECT) {
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_summary_scan_file_object(
&record, out_summary));
}
break;
case IREE_HAL_REPLAY_FILE_RECORD_TYPE_OPERATION:
++out_summary->operation_count;
IREE_RETURN_IF_ERROR(
iree_hal_replay_dump_summary_scan_operation(&record, out_summary));
break;
case IREE_HAL_REPLAY_FILE_RECORD_TYPE_UNSUPPORTED:
++out_summary->unsupported_count;
break;
default:
break;
}
}
return iree_ok_status();
}
static const char* iree_hal_replay_dump_file_reference_type_string(
iree_hal_replay_file_reference_type_t reference_type) {
switch (reference_type) {
case IREE_HAL_REPLAY_FILE_REFERENCE_TYPE_NONE:
return "none";
case IREE_HAL_REPLAY_FILE_REFERENCE_TYPE_EXTERNAL_PATH:
return "external_path";
case IREE_HAL_REPLAY_FILE_REFERENCE_TYPE_INLINE_BYTES:
return "inline_bytes";
case IREE_HAL_REPLAY_FILE_REFERENCE_TYPE_CAPTURED_RANGES:
return "captured_ranges";
default:
return "unknown";
}
}
static const char* iree_hal_replay_dump_file_validation_type_string(
iree_hal_replay_file_validation_type_t validation_type) {
switch (validation_type) {
case IREE_HAL_REPLAY_FILE_VALIDATION_TYPE_NONE:
return "none";
case IREE_HAL_REPLAY_FILE_VALIDATION_TYPE_IDENTITY:
return "identity";
case IREE_HAL_REPLAY_FILE_VALIDATION_TYPE_CONTENT_DIGEST:
return "digest";
default:
return "unknown";
}
}
static iree_hal_replay_file_range_t iree_hal_replay_dump_payload_subrange(
const iree_hal_replay_file_range_t* payload_range,
iree_host_size_t payload_offset, iree_host_size_t payload_length) {
iree_hal_replay_file_range_t range = iree_hal_replay_file_range_empty();
range.offset = payload_range->offset + payload_offset;
range.length = payload_length;
range.uncompressed_length = payload_length;
range.compression_type = IREE_HAL_REPLAY_COMPRESSION_TYPE_NONE;
range.digest_type = IREE_HAL_REPLAY_DIGEST_TYPE_NONE;
return range;
}
typedef struct iree_hal_replay_dump_executable_prepare_ranges_t {
// Byte offset of the executable format string within the record payload.
iree_host_size_t format_offset;
// Byte offset of the executable data blob within the record payload.
iree_host_size_t data_offset;
// Byte offset of the specialization constants within the record payload.
iree_host_size_t constants_offset;
// Byte offset of the executable ABI metadata within the record payload.
iree_host_size_t metadata_offset;
// Byte length of the specialization constants.
iree_host_size_t constant_bytes;
} iree_hal_replay_dump_executable_prepare_ranges_t;
static iree_status_t iree_hal_replay_dump_compute_executable_prepare_ranges(
const iree_hal_replay_file_record_t* record,
const iree_hal_replay_executable_prepare_payload_t* payload,
iree_hal_replay_dump_executable_prepare_ranges_t* out_ranges) {
memset(out_ranges, 0, sizeof(*out_ranges));
if (payload->executable_data_length > IREE_HOST_SIZE_MAX ||
payload->constant_count > IREE_HOST_SIZE_MAX ||
!iree_host_size_checked_mul((iree_host_size_t)payload->constant_count,
sizeof(uint32_t),
&out_ranges->constant_bytes)) {
return iree_make_status(IREE_STATUS_OUT_OF_RANGE,
"replay executable prepare payload overflow");
}
out_ranges->format_offset = sizeof(*payload);
iree_host_size_t expected_length = 0;
if (!iree_host_size_checked_add(
out_ranges->format_offset,
(iree_host_size_t)payload->executable_format_length,
&out_ranges->data_offset) ||
!iree_host_size_checked_add(
out_ranges->data_offset,
(iree_host_size_t)payload->executable_data_length,
&out_ranges->constants_offset) ||
!iree_host_size_checked_add(out_ranges->constants_offset,
out_ranges->constant_bytes,
&out_ranges->metadata_offset) ||
!iree_host_size_checked_add(
out_ranges->metadata_offset,
(iree_host_size_t)payload->executable_metadata_length,
&expected_length) ||
expected_length != record->payload.data_length) {
return iree_make_status(IREE_STATUS_DATA_LOSS,
"replay executable prepare payload length "
"mismatch");
}
return iree_ok_status();
}
static iree_status_t iree_hal_replay_dump_read_executable_metadata_header(
const iree_hal_replay_file_record_t* record,
const iree_hal_replay_executable_prepare_payload_t* payload,
const iree_hal_replay_dump_executable_prepare_ranges_t* ranges,
bool* out_has_metadata,
iree_hal_replay_executable_metadata_header_t* out_header) {
*out_has_metadata = false;
if (payload->executable_metadata_length <
sizeof(iree_hal_replay_executable_metadata_header_t)) {
if (payload->executable_metadata_length == 0) return iree_ok_status();
return iree_make_status(IREE_STATUS_DATA_LOSS,
"replay executable metadata is too short");
}
memcpy(out_header, record->payload.data + ranges->metadata_offset,
sizeof(*out_header));
if (out_header->reserved0 != 0 || out_header->reserved1 != 0) {
return iree_make_status(IREE_STATUS_DATA_LOSS,
"replay executable metadata reserved fields must "
"be zero");
}
if (out_header->export_count > IREE_HOST_SIZE_MAX ||
out_header->parameter_count > IREE_HOST_SIZE_MAX) {
return iree_make_status(IREE_STATUS_OUT_OF_RANGE,
"replay executable metadata count overflow");
}
iree_host_size_t export_metadata_size = 0;
iree_host_size_t parameter_metadata_size = 0;
iree_host_size_t expected_length = 0;
if (!iree_host_size_checked_mul(
(iree_host_size_t)out_header->export_count,
sizeof(iree_hal_replay_executable_export_metadata_t),
&export_metadata_size) ||
!iree_host_size_checked_mul(
(iree_host_size_t)out_header->parameter_count,
sizeof(iree_hal_replay_executable_parameter_metadata_t),
&parameter_metadata_size) ||
!iree_host_size_checked_add(
sizeof(iree_hal_replay_executable_metadata_header_t),
export_metadata_size, &expected_length) ||
!iree_host_size_checked_add(expected_length, parameter_metadata_size,
&expected_length) ||
expected_length != payload->executable_metadata_length) {
return iree_make_status(IREE_STATUS_DATA_LOSS,
"replay executable metadata length mismatch");
}
*out_has_metadata = true;
return iree_ok_status();
}
static iree_status_t iree_hal_replay_dump_append_text_buffer_ref(
iree_string_builder_t* builder, const char* label,
const iree_hal_replay_buffer_ref_payload_t* buffer_ref) {
return iree_string_builder_append_format(
builder,
" %s={buffer_id=%" PRIu64 " offset=%" PRIu64 " length=%" PRIu64
" slot=%" PRIu32 "}",
label, buffer_ref->buffer_id, buffer_ref->offset, buffer_ref->length,
buffer_ref->buffer_slot);
}
static iree_status_t iree_hal_replay_dump_append_json_buffer_ref(
iree_string_builder_t* builder, const char* field_name,
const iree_hal_replay_buffer_ref_payload_t* buffer_ref) {
return iree_string_builder_append_format(
builder,
",\"%s\":{\"buffer_id\":%" PRIu64 ",\"offset\":%" PRIu64
",\"length\":%" PRIu64 ",\"buffer_slot\":%" PRIu32 "}",
field_name, buffer_ref->buffer_id, buffer_ref->offset, buffer_ref->length,
buffer_ref->buffer_slot);
}
static iree_status_t iree_hal_replay_dump_append_text_semaphores(
iree_string_builder_t* builder, const char* label,
const iree_hal_replay_semaphore_timepoint_payload_t* semaphores,
iree_host_size_t semaphore_count) {
IREE_RETURN_IF_ERROR(
iree_string_builder_append_format(builder, " %s=[", label));
for (iree_host_size_t i = 0; i < semaphore_count; ++i) {
if (i > 0) {
IREE_RETURN_IF_ERROR(iree_string_builder_append_cstring(builder, ","));
}
IREE_RETURN_IF_ERROR(iree_string_builder_append_format(
builder, "{semaphore_id=%" PRIu64 " value=%" PRIu64 "}",
semaphores[i].semaphore_id, semaphores[i].value));
}
return iree_string_builder_append_cstring(builder, "]");
}
static iree_status_t iree_hal_replay_dump_append_json_semaphores(
iree_string_builder_t* builder, const char* field_name,
const iree_hal_replay_semaphore_timepoint_payload_t* semaphores,
iree_host_size_t semaphore_count) {
IREE_RETURN_IF_ERROR(
iree_string_builder_append_format(builder, ",\"%s\":[", field_name));
for (iree_host_size_t i = 0; i < semaphore_count; ++i) {
if (i > 0) {
IREE_RETURN_IF_ERROR(iree_string_builder_append_cstring(builder, ","));
}
IREE_RETURN_IF_ERROR(iree_string_builder_append_format(
builder, "{\"semaphore_id\":%" PRIu64 ",\"value\":%" PRIu64 "}",
semaphores[i].semaphore_id, semaphores[i].value));
}
return iree_string_builder_append_cstring(builder, "]");
}
static iree_status_t iree_hal_replay_dump_append_text_buffer_refs(
iree_string_builder_t* builder, const char* label,
const iree_hal_replay_buffer_ref_payload_t* buffer_refs,
iree_host_size_t buffer_ref_count) {
IREE_RETURN_IF_ERROR(
iree_string_builder_append_format(builder, " %s=[", label));
for (iree_host_size_t i = 0; i < buffer_ref_count; ++i) {
if (i > 0) {
IREE_RETURN_IF_ERROR(iree_string_builder_append_cstring(builder, ","));
}
IREE_RETURN_IF_ERROR(iree_string_builder_append_format(
builder,
"{buffer_id=%" PRIu64 " offset=%" PRIu64 " length=%" PRIu64
" slot=%" PRIu32 "}",
buffer_refs[i].buffer_id, buffer_refs[i].offset, buffer_refs[i].length,
buffer_refs[i].buffer_slot));
}
return iree_string_builder_append_cstring(builder, "]");
}
static iree_status_t iree_hal_replay_dump_append_json_buffer_refs(
iree_string_builder_t* builder, const char* field_name,
const iree_hal_replay_buffer_ref_payload_t* buffer_refs,
iree_host_size_t buffer_ref_count) {
IREE_RETURN_IF_ERROR(
iree_string_builder_append_format(builder, ",\"%s\":[", field_name));
for (iree_host_size_t i = 0; i < buffer_ref_count; ++i) {
if (i > 0) {
IREE_RETURN_IF_ERROR(iree_string_builder_append_cstring(builder, ","));
}
IREE_RETURN_IF_ERROR(iree_string_builder_append_format(
builder,
"{\"buffer_id\":%" PRIu64 ",\"offset\":%" PRIu64 ",\"length\":%" PRIu64
",\"buffer_slot\":%" PRIu32 "}",
buffer_refs[i].buffer_id, buffer_refs[i].offset, buffer_refs[i].length,
buffer_refs[i].buffer_slot));
}
return iree_string_builder_append_cstring(builder, "]");
}
static iree_status_t iree_hal_replay_dump_dispatch_layout(
const iree_hal_replay_file_record_t* record,
const iree_hal_replay_dispatch_payload_t* payload,
iree_host_size_t* out_wait_payloads_offset,
iree_host_size_t* out_wait_payloads_size,
iree_host_size_t* out_signal_payloads_offset,
iree_host_size_t* out_signal_payloads_size,
iree_host_size_t* out_constants_offset,
iree_host_size_t* out_binding_payloads_offset,
iree_host_size_t* out_binding_payloads_size) {
iree_host_size_t wait_payloads_size = 0;
iree_host_size_t signal_payloads_size = 0;
iree_host_size_t binding_payloads_size = 0;
if (payload->wait_semaphore_count > IREE_HOST_SIZE_MAX ||
payload->signal_semaphore_count > IREE_HOST_SIZE_MAX ||
payload->binding_count > IREE_HOST_SIZE_MAX ||
payload->constants_length > IREE_HOST_SIZE_MAX ||
!iree_host_size_checked_mul(
(iree_host_size_t)payload->wait_semaphore_count,
sizeof(iree_hal_replay_semaphore_timepoint_payload_t),
&wait_payloads_size) ||
!iree_host_size_checked_mul(
(iree_host_size_t)payload->signal_semaphore_count,
sizeof(iree_hal_replay_semaphore_timepoint_payload_t),
&signal_payloads_size) ||
!iree_host_size_checked_mul((iree_host_size_t)payload->binding_count,
sizeof(iree_hal_replay_buffer_ref_payload_t),
&binding_payloads_size)) {
return iree_make_status(IREE_STATUS_OUT_OF_RANGE,
"replay dispatch payload count overflow");
}
iree_host_size_t offset = sizeof(*payload);
*out_wait_payloads_offset = offset;
*out_wait_payloads_size = wait_payloads_size;
if (!iree_host_size_checked_add(offset, wait_payloads_size, &offset)) {
return iree_make_status(IREE_STATUS_OUT_OF_RANGE,
"replay dispatch payload length overflow");
}
*out_signal_payloads_offset = offset;
*out_signal_payloads_size = signal_payloads_size;
if (!iree_host_size_checked_add(offset, signal_payloads_size, &offset)) {
return iree_make_status(IREE_STATUS_OUT_OF_RANGE,
"replay dispatch payload length overflow");
}
*out_constants_offset = offset;
if (!iree_host_size_checked_add(
offset, (iree_host_size_t)payload->constants_length, &offset)) {
return iree_make_status(IREE_STATUS_OUT_OF_RANGE,
"replay dispatch payload length overflow");
}
*out_binding_payloads_offset = offset;
*out_binding_payloads_size = binding_payloads_size;
if (!iree_host_size_checked_add(offset, binding_payloads_size, &offset) ||
offset != record->payload.data_length) {
return iree_make_status(IREE_STATUS_DATA_LOSS,
"replay dispatch payload length mismatch");
}
return iree_ok_status();
}
static iree_status_t iree_hal_replay_dump_queue_execute_layout(
const iree_hal_replay_file_record_t* record,
const iree_hal_replay_device_queue_execute_payload_t* payload,
iree_host_size_t* out_wait_payloads_offset,
iree_host_size_t* out_wait_payloads_size,
iree_host_size_t* out_signal_payloads_offset,
iree_host_size_t* out_signal_payloads_size,
iree_host_size_t* out_binding_payloads_offset,
iree_host_size_t* out_binding_payloads_size) {
iree_host_size_t wait_payloads_size = 0;
iree_host_size_t signal_payloads_size = 0;
iree_host_size_t binding_payloads_size = 0;
if (payload->wait_semaphore_count > IREE_HOST_SIZE_MAX ||
payload->signal_semaphore_count > IREE_HOST_SIZE_MAX ||
payload->binding_count > IREE_HOST_SIZE_MAX ||
!iree_host_size_checked_mul(
(iree_host_size_t)payload->wait_semaphore_count,
sizeof(iree_hal_replay_semaphore_timepoint_payload_t),
&wait_payloads_size) ||
!iree_host_size_checked_mul(
(iree_host_size_t)payload->signal_semaphore_count,
sizeof(iree_hal_replay_semaphore_timepoint_payload_t),
&signal_payloads_size) ||
!iree_host_size_checked_mul((iree_host_size_t)payload->binding_count,
sizeof(iree_hal_replay_buffer_ref_payload_t),
&binding_payloads_size)) {
return iree_make_status(IREE_STATUS_OUT_OF_RANGE,
"replay queue execute payload count overflow");
}
iree_host_size_t offset = sizeof(*payload);
*out_wait_payloads_offset = offset;
*out_wait_payloads_size = wait_payloads_size;
if (!iree_host_size_checked_add(offset, wait_payloads_size, &offset)) {
return iree_make_status(IREE_STATUS_OUT_OF_RANGE,
"replay queue execute payload length overflow");
}
*out_signal_payloads_offset = offset;
*out_signal_payloads_size = signal_payloads_size;
if (!iree_host_size_checked_add(offset, signal_payloads_size, &offset)) {
return iree_make_status(IREE_STATUS_OUT_OF_RANGE,
"replay queue execute payload length overflow");
}
*out_binding_payloads_offset = offset;
*out_binding_payloads_size = binding_payloads_size;
if (!iree_host_size_checked_add(offset, binding_payloads_size, &offset) ||
offset != record->payload.data_length) {
return iree_make_status(IREE_STATUS_DATA_LOSS,
"replay queue execute payload length mismatch");
}
return iree_ok_status();
}
static iree_status_t iree_hal_replay_dump_queue_alloca_layout(
const iree_hal_replay_file_record_t* record,
const iree_hal_replay_device_queue_alloca_payload_t* payload,
iree_host_size_t* out_wait_payloads_offset,
iree_host_size_t* out_wait_payloads_size,
iree_host_size_t* out_signal_payloads_offset,
iree_host_size_t* out_signal_payloads_size) {
iree_host_size_t wait_payloads_size = 0;
iree_host_size_t signal_payloads_size = 0;
if (payload->wait_semaphore_count > IREE_HOST_SIZE_MAX ||
payload->signal_semaphore_count > IREE_HOST_SIZE_MAX ||
!iree_host_size_checked_mul(
(iree_host_size_t)payload->wait_semaphore_count,
sizeof(iree_hal_replay_semaphore_timepoint_payload_t),
&wait_payloads_size) ||
!iree_host_size_checked_mul(
(iree_host_size_t)payload->signal_semaphore_count,
sizeof(iree_hal_replay_semaphore_timepoint_payload_t),
&signal_payloads_size)) {
return iree_make_status(IREE_STATUS_OUT_OF_RANGE,
"replay queue alloca payload count overflow");
}
iree_host_size_t offset = sizeof(*payload);
*out_wait_payloads_offset = offset;
*out_wait_payloads_size = wait_payloads_size;
if (!iree_host_size_checked_add(offset, wait_payloads_size, &offset)) {
return iree_make_status(IREE_STATUS_OUT_OF_RANGE,
"replay queue alloca payload length overflow");
}
*out_signal_payloads_offset = offset;
*out_signal_payloads_size = signal_payloads_size;
if (!iree_host_size_checked_add(offset, signal_payloads_size, &offset) ||
offset != record->payload.data_length) {
return iree_make_status(IREE_STATUS_DATA_LOSS,
"replay queue alloca payload length mismatch");
}
return iree_ok_status();
}
static iree_status_t iree_hal_replay_dump_queue_payload_layout(
const iree_hal_replay_file_record_t* record, iree_host_size_t header_size,
uint64_t wait_semaphore_count, uint64_t signal_semaphore_count,
uint64_t trailing_payload_length,
iree_host_size_t* out_wait_payloads_offset,
iree_host_size_t* out_wait_payloads_size,
iree_host_size_t* out_signal_payloads_offset,
iree_host_size_t* out_signal_payloads_size,
iree_host_size_t* out_trailing_payload_offset,
iree_host_size_t* out_trailing_payload_size) {
iree_host_size_t wait_payloads_size = 0;
iree_host_size_t signal_payloads_size = 0;
if (wait_semaphore_count > IREE_HOST_SIZE_MAX ||
signal_semaphore_count > IREE_HOST_SIZE_MAX ||
trailing_payload_length > IREE_HOST_SIZE_MAX ||
!iree_host_size_checked_mul(
(iree_host_size_t)wait_semaphore_count,
sizeof(iree_hal_replay_semaphore_timepoint_payload_t),
&wait_payloads_size) ||
!iree_host_size_checked_mul(
(iree_host_size_t)signal_semaphore_count,
sizeof(iree_hal_replay_semaphore_timepoint_payload_t),
&signal_payloads_size)) {
return iree_make_status(IREE_STATUS_OUT_OF_RANGE,
"replay queue payload count overflow");
}
iree_host_size_t offset = header_size;
*out_wait_payloads_offset = offset;
*out_wait_payloads_size = wait_payloads_size;
if (!iree_host_size_checked_add(offset, wait_payloads_size, &offset)) {
return iree_make_status(IREE_STATUS_OUT_OF_RANGE,
"replay queue payload length overflow");
}
*out_signal_payloads_offset = offset;
*out_signal_payloads_size = signal_payloads_size;
if (!iree_host_size_checked_add(offset, signal_payloads_size, &offset)) {
return iree_make_status(IREE_STATUS_OUT_OF_RANGE,
"replay queue payload length overflow");
}
*out_trailing_payload_offset = offset;
*out_trailing_payload_size = (iree_host_size_t)trailing_payload_length;
if (!iree_host_size_checked_add(
offset, (iree_host_size_t)trailing_payload_length, &offset) ||
offset != record->payload.data_length) {
return iree_make_status(IREE_STATUS_DATA_LOSS,
"replay queue payload length mismatch");
}
return iree_ok_status();
}
static iree_status_t iree_hal_replay_dump_execution_barrier_layout(
const iree_hal_replay_file_record_t* record,
const iree_hal_replay_command_buffer_execution_barrier_payload_t* payload,
iree_host_size_t* out_memory_barriers_offset,
iree_host_size_t* out_memory_barriers_size,
iree_host_size_t* out_buffer_barriers_offset,
iree_host_size_t* out_buffer_barriers_size) {
iree_host_size_t memory_barriers_size = 0;
iree_host_size_t buffer_barriers_size = 0;
if (payload->memory_barrier_count > IREE_HOST_SIZE_MAX ||
payload->buffer_barrier_count > IREE_HOST_SIZE_MAX ||
!iree_host_size_checked_mul(
(iree_host_size_t)payload->memory_barrier_count,
sizeof(iree_hal_replay_memory_barrier_payload_t),
&memory_barriers_size) ||
!iree_host_size_checked_mul(
(iree_host_size_t)payload->buffer_barrier_count,
sizeof(iree_hal_replay_buffer_barrier_payload_t),
&buffer_barriers_size)) {
return iree_make_status(IREE_STATUS_OUT_OF_RANGE,
"replay execution barrier payload count overflow");
}
iree_host_size_t offset = sizeof(*payload);
*out_memory_barriers_offset = offset;
*out_memory_barriers_size = memory_barriers_size;
if (!iree_host_size_checked_add(offset, memory_barriers_size, &offset)) {
return iree_make_status(IREE_STATUS_OUT_OF_RANGE,
"replay execution barrier payload length overflow");
}
*out_buffer_barriers_offset = offset;
*out_buffer_barriers_size = buffer_barriers_size;
if (!iree_host_size_checked_add(offset, buffer_barriers_size, &offset) ||
offset != record->payload.data_length) {
return iree_make_status(IREE_STATUS_DATA_LOSS,
"replay execution barrier payload length mismatch");
}
return iree_ok_status();
}
static iree_status_t iree_hal_replay_dump_wait_events_layout(
const iree_hal_replay_file_record_t* record,
const iree_hal_replay_command_buffer_wait_events_payload_t* payload,
iree_host_size_t* out_events_offset, iree_host_size_t* out_events_size,
iree_host_size_t* out_memory_barriers_offset,
iree_host_size_t* out_memory_barriers_size,
iree_host_size_t* out_buffer_barriers_offset,
iree_host_size_t* out_buffer_barriers_size) {
iree_host_size_t events_size = 0;
iree_host_size_t memory_barriers_size = 0;
iree_host_size_t buffer_barriers_size = 0;
if (IREE_UNLIKELY(payload->event_count > IREE_HOST_SIZE_MAX ||
payload->memory_barrier_count > IREE_HOST_SIZE_MAX ||
payload->buffer_barrier_count > IREE_HOST_SIZE_MAX ||
!iree_host_size_checked_mul(
(iree_host_size_t)payload->event_count,
sizeof(iree_hal_replay_object_id_t), &events_size) ||
!iree_host_size_checked_mul(
(iree_host_size_t)payload->memory_barrier_count,
sizeof(iree_hal_replay_memory_barrier_payload_t),
&memory_barriers_size) ||
!iree_host_size_checked_mul(
(iree_host_size_t)payload->buffer_barrier_count,
sizeof(iree_hal_replay_buffer_barrier_payload_t),
&buffer_barriers_size))) {
return iree_make_status(IREE_STATUS_OUT_OF_RANGE,
"replay wait events payload count overflow");
}
iree_host_size_t offset = sizeof(*payload);
*out_events_offset = offset;
*out_events_size = events_size;
if (!iree_host_size_checked_add(offset, events_size, &offset)) {
return iree_make_status(IREE_STATUS_OUT_OF_RANGE,
"replay wait events payload length overflow");
}
*out_memory_barriers_offset = offset;
*out_memory_barriers_size = memory_barriers_size;
if (!iree_host_size_checked_add(offset, memory_barriers_size, &offset)) {
return iree_make_status(IREE_STATUS_OUT_OF_RANGE,
"replay wait events payload length overflow");
}
*out_buffer_barriers_offset = offset;
*out_buffer_barriers_size = buffer_barriers_size;
if (!iree_host_size_checked_add(offset, buffer_barriers_size, &offset) ||
offset != record->payload.data_length) {
return iree_make_status(IREE_STATUS_DATA_LOSS,
"replay wait events payload length mismatch");
}
return iree_ok_status();
}
static iree_status_t iree_hal_replay_dump_scope_name(
const iree_hal_replay_file_record_t* record,
iree_string_view_t* out_scope_name) {
*out_scope_name = iree_string_view_empty();
if (record->payload.data_length < sizeof(iree_hal_replay_scope_payload_t)) {
return iree_make_status(IREE_STATUS_DATA_LOSS,
"replay scope payload is short");
}
iree_hal_replay_scope_payload_t payload;
memcpy(&payload, record->payload.data, sizeof(payload));
if (payload.flags != IREE_HAL_REPLAY_SCOPE_FLAG_NONE ||
payload.reserved0 != 0 || payload.reserved1 != 0) {
return iree_make_status(IREE_STATUS_DATA_LOSS,
"replay scope payload reserved fields must be "
"zero");
}
if (payload.name_length > IREE_HOST_SIZE_MAX ||
sizeof(payload) + (iree_host_size_t)payload.name_length !=
record->payload.data_length ||
payload.name_length == 0) {
return iree_make_status(IREE_STATUS_DATA_LOSS,
"replay scope payload name length mismatch");
}
*out_scope_name =
iree_make_string_view((const char*)record->payload.data + sizeof(payload),
(iree_host_size_t)payload.name_length);
return iree_ok_status();
}
static iree_status_t iree_hal_replay_dump_append_text_payload(
iree_string_builder_t* builder, const iree_hal_replay_file_record_t* record,
const iree_hal_replay_file_range_t* payload_range) {
switch (record->header.payload_type) {
case IREE_HAL_REPLAY_PAYLOAD_TYPE_NONE:
return iree_ok_status();
case IREE_HAL_REPLAY_PAYLOAD_TYPE_REPLAY_SCOPE: {
iree_string_view_t scope_name;
IREE_RETURN_IF_ERROR(
iree_hal_replay_dump_scope_name(record, &scope_name));
IREE_RETURN_IF_ERROR(
iree_string_builder_append_cstring(builder, " name=\""));
IREE_RETURN_IF_ERROR(
iree_string_builder_append_string(builder, scope_name));
return iree_string_builder_append_cstring(builder, "\"");
}
case IREE_HAL_REPLAY_PAYLOAD_TYPE_BUFFER_OBJECT: {
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_payload_length_check(
record, sizeof(iree_hal_replay_buffer_object_payload_t)));
iree_hal_replay_buffer_object_payload_t payload;
memcpy(&payload, record->payload.data, sizeof(payload));
return iree_string_builder_append_format(
builder,
" allocation_size=%" PRIu64 " byte_offset=%" PRIu64
" byte_length=%" PRIu64 " queue_affinity=%" PRIu64
" placement_flags=0x%08" PRIx32 " memory_type=0x%08" PRIx32
" allowed_usage=0x%08" PRIx32 " allowed_access=0x%04" PRIx16,
payload.allocation_size, payload.byte_offset, payload.byte_length,
payload.queue_affinity, payload.placement_flags, payload.memory_type,
payload.allowed_usage, payload.allowed_access);
}
case IREE_HAL_REPLAY_PAYLOAD_TYPE_ALLOCATOR_ALLOCATE_BUFFER: {
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_payload_length_check(
record, sizeof(iree_hal_replay_allocator_allocate_buffer_payload_t)));
iree_hal_replay_allocator_allocate_buffer_payload_t payload;
memcpy(&payload, record->payload.data, sizeof(payload));
return iree_string_builder_append_format(
builder,
" allocation_size=%" PRIu64 " queue_affinity=%" PRIu64
" min_alignment=%" PRIu64 " usage=0x%08" PRIx32 " type=0x%08" PRIx32
" access=0x%04" PRIx16,
payload.allocation_size, payload.queue_affinity,
payload.min_alignment, payload.usage, payload.type, payload.access);
}
case IREE_HAL_REPLAY_PAYLOAD_TYPE_ALLOCATOR_IMPORT_BUFFER: {
if (record->payload.data_length <
sizeof(iree_hal_replay_allocator_import_buffer_payload_t)) {
return iree_make_status(IREE_STATUS_DATA_LOSS,
"replay import buffer payload is short");
}
iree_hal_replay_allocator_import_buffer_payload_t payload;
memcpy(&payload, record->payload.data, sizeof(payload));
if (payload.data_length >
record->payload.data_length -
sizeof(iree_hal_replay_allocator_import_buffer_payload_t)) {
return iree_make_status(
IREE_STATUS_DATA_LOSS,
"replay import buffer data extends past record");
}
const uint64_t data_offset =
payload_range->offset +
(uint64_t)sizeof(iree_hal_replay_allocator_import_buffer_payload_t);
return iree_string_builder_append_format(
builder,
" allocation_size=%" PRIu64 " queue_affinity=%" PRIu64
" min_alignment=%" PRIu64 " usage=0x%08" PRIx32 " type=0x%08" PRIx32
" access=0x%04" PRIx16 " external_type=%" PRIu32
" external_flags=0x%08" PRIx32 " data_range=[%" PRIu64 ", +%" PRIu64
"]",
payload.allocation.allocation_size, payload.allocation.queue_affinity,
payload.allocation.min_alignment, payload.allocation.usage,
payload.allocation.type, payload.allocation.access,
payload.external_type, payload.external_flags, data_offset,
payload.data_length);
}
case IREE_HAL_REPLAY_PAYLOAD_TYPE_BUFFER_RANGE: {
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_payload_length_check(
record, sizeof(iree_hal_replay_buffer_range_payload_t)));
iree_hal_replay_buffer_range_payload_t payload;
memcpy(&payload, record->payload.data, sizeof(payload));
return iree_string_builder_append_format(
builder,
" byte_offset=%" PRIu64 " byte_length=%" PRIu64
" mapping_mode=0x%08" PRIx32 " memory_access=0x%04" PRIx16,
payload.byte_offset, payload.byte_length, payload.mapping_mode,
payload.memory_access);
}
case IREE_HAL_REPLAY_PAYLOAD_TYPE_BUFFER_RANGE_DATA: {
if (record->payload.data_length <
sizeof(iree_hal_replay_buffer_range_data_payload_t)) {
return iree_make_status(IREE_STATUS_DATA_LOSS,
"replay buffer range data payload is short");
}
iree_hal_replay_buffer_range_data_payload_t payload;
memcpy(&payload, record->payload.data, sizeof(payload));
if (payload.data_length >
record->payload.data_length -
sizeof(iree_hal_replay_buffer_range_data_payload_t)) {
return iree_make_status(IREE_STATUS_DATA_LOSS,
"replay buffer range data extends past record");
}
const uint64_t data_offset =
payload_range->offset +
(uint64_t)sizeof(iree_hal_replay_buffer_range_data_payload_t);
return iree_string_builder_append_format(
builder,
" byte_offset=%" PRIu64 " byte_length=%" PRIu64
" data_range=[%" PRIu64 ", +%" PRIu64
"]"
" memory_access=0x%04" PRIx16,
payload.byte_offset, payload.byte_length, data_offset,
payload.data_length, payload.memory_access);
}
case IREE_HAL_REPLAY_PAYLOAD_TYPE_COMMAND_BUFFER_OBJECT: {
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_payload_length_check(
record, sizeof(iree_hal_replay_command_buffer_object_payload_t)));
iree_hal_replay_command_buffer_object_payload_t payload;
memcpy(&payload, record->payload.data, sizeof(payload));
return iree_string_builder_append_format(
builder,
" mode=0x%08" PRIx32 " categories=0x%08" PRIx32
" queue_affinity=%" PRIu64 " binding_capacity=%" PRIu64,
payload.mode, payload.command_categories, payload.queue_affinity,
payload.binding_capacity);
}
case IREE_HAL_REPLAY_PAYLOAD_TYPE_EXECUTABLE_CACHE_OBJECT: {
if (record->payload.data_length <
sizeof(iree_hal_replay_executable_cache_object_payload_t)) {
return iree_make_status(IREE_STATUS_DATA_LOSS,
"replay executable cache payload is short");
}
iree_hal_replay_executable_cache_object_payload_t payload;
memcpy(&payload, record->payload.data, sizeof(payload));
if (payload.identifier_length >
record->payload.data_length -
sizeof(iree_hal_replay_executable_cache_object_payload_t)) {
return iree_make_status(IREE_STATUS_DATA_LOSS,
"replay executable cache identifier extends "
"past record");
}
const uint64_t identifier_offset =
payload_range->offset +
(uint64_t)sizeof(iree_hal_replay_executable_cache_object_payload_t);
return iree_string_builder_append_format(
builder, " identifier_range=[%" PRIu64 ", +%" PRIu64 "]",
identifier_offset, payload.identifier_length);
}
case IREE_HAL_REPLAY_PAYLOAD_TYPE_EXECUTABLE_PREPARE: {
if (record->payload.data_length <
sizeof(iree_hal_replay_executable_prepare_payload_t)) {
return iree_make_status(IREE_STATUS_DATA_LOSS,
"replay executable prepare payload is short");
}
iree_hal_replay_executable_prepare_payload_t payload;
memcpy(&payload, record->payload.data, sizeof(payload));
iree_hal_replay_dump_executable_prepare_ranges_t ranges;
IREE_RETURN_IF_ERROR(
iree_hal_replay_dump_compute_executable_prepare_ranges(
record, &payload, &ranges));
IREE_RETURN_IF_ERROR(iree_string_builder_append_format(
builder,
" queue_affinity=%" PRIu64 " caching_mode=0x%08" PRIx32
" format_range=[%" PRIu64 ", +%" PRIu32 "] data_range=[%" PRIu64
", +%" PRIu64 "] constants_range=[%" PRIu64 ", +%" PRIhsz
"] metadata_range=[%" PRIu64 ", +%" PRIu32 "]",
payload.queue_affinity, payload.caching_mode,
payload_range->offset + ranges.format_offset,
payload.executable_format_length,
payload_range->offset + ranges.data_offset,
payload.executable_data_length,
payload_range->offset + ranges.constants_offset,
ranges.constant_bytes, payload_range->offset + ranges.metadata_offset,
payload.executable_metadata_length));
iree_hal_replay_executable_metadata_header_t metadata_header;
bool has_metadata = false;
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_read_executable_metadata_header(
record, &payload, &ranges, &has_metadata, &metadata_header));
if (has_metadata) {
IREE_RETURN_IF_ERROR(iree_string_builder_append_format(
builder,
" metadata_exports=%" PRIu64 " metadata_parameters=%" PRIu64,
metadata_header.export_count, metadata_header.parameter_count));
}
return iree_ok_status();
}
case IREE_HAL_REPLAY_PAYLOAD_TYPE_SEMAPHORE_OBJECT: {
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_payload_length_check(
record, sizeof(iree_hal_replay_semaphore_object_payload_t)));
iree_hal_replay_semaphore_object_payload_t payload;
memcpy(&payload, record->payload.data, sizeof(payload));
return iree_string_builder_append_format(
builder,
" queue_affinity=%" PRIu64 " initial_value=%" PRIu64
" flags=0x%016" PRIx64,
payload.queue_affinity, payload.initial_value, payload.flags);
}
case IREE_HAL_REPLAY_PAYLOAD_TYPE_EVENT_OBJECT: {
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_payload_length_check(
record, sizeof(iree_hal_replay_event_object_payload_t)));
iree_hal_replay_event_object_payload_t payload;
memcpy(&payload, record->payload.data, sizeof(payload));
return iree_string_builder_append_format(
builder, " queue_affinity=%" PRIu64 " flags=0x%08" PRIx32,
payload.queue_affinity, payload.flags);
}
case IREE_HAL_REPLAY_PAYLOAD_TYPE_FILE_OBJECT: {
if (record->payload.data_length <
sizeof(iree_hal_replay_file_object_payload_t)) {
return iree_make_status(IREE_STATUS_DATA_LOSS,
"replay file object payload is short");
}
iree_hal_replay_file_object_payload_t payload;
memcpy(&payload, record->payload.data, sizeof(payload));
if (payload.reference_length > IREE_HOST_SIZE_MAX ||
sizeof(payload) + (iree_host_size_t)payload.reference_length !=
record->payload.data_length) {
return iree_make_status(IREE_STATUS_DATA_LOSS,
"replay file object payload length mismatch");
}
return iree_string_builder_append_format(
builder,
" queue_affinity=%" PRIu64 " file_length=%" PRIu64
" access=0x%08" PRIx32 " flags=0x%08" PRIx32 " handle_type=%" PRIu32
" reference_type=%s(%" PRIu32 ") file_device=%" PRIu64
" file_inode=%" PRIu64 " file_mtime_ns=%" PRIu64
" validation_type=%s(%" PRIu32 ") digest_type=%" PRIu32
" digest_fnv1a64=0x%016" PRIx64 " reference_range=[%" PRIu64
", +%" PRIu64 "]",
payload.queue_affinity, payload.file_length, payload.access,
payload.flags, payload.handle_type,
iree_hal_replay_dump_file_reference_type_string(
payload.reference_type),
payload.reference_type, payload.file_device, payload.file_inode,
payload.file_mtime_ns,
iree_hal_replay_dump_file_validation_type_string(
payload.validation_type),
payload.validation_type, (uint32_t)payload.digest_type,
iree_hal_replay_digest_load_fnv1a64(payload.digest),
payload_range->offset + sizeof(payload), payload.reference_length);
}
case IREE_HAL_REPLAY_PAYLOAD_TYPE_DISPATCH: {
if (record->payload.data_length <
sizeof(iree_hal_replay_dispatch_payload_t)) {
return iree_make_status(IREE_STATUS_DATA_LOSS,
"replay dispatch payload is short");
}
iree_hal_replay_dispatch_payload_t payload;
memcpy(&payload, record->payload.data, sizeof(payload));
iree_host_size_t wait_offset = 0;
iree_host_size_t wait_size = 0;
iree_host_size_t signal_offset = 0;
iree_host_size_t signal_size = 0;
iree_host_size_t constants_offset = 0;
iree_host_size_t bindings_offset = 0;
iree_host_size_t bindings_size = 0;
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_dispatch_layout(
record, &payload, &wait_offset, &wait_size, &signal_offset,
&signal_size, &constants_offset, &bindings_offset, &bindings_size));
IREE_RETURN_IF_ERROR(iree_string_builder_append_format(
builder,
" executable_id=%" PRIu64 " queue_affinity=%" PRIu64
" export_ordinal=%" PRIu32 " flags=0x%08" PRIx32
" workgroup_count=[%" PRIu32 ",%" PRIu32 ",%" PRIu32
"] workgroup_size=[%" PRIu32 ",%" PRIu32 ",%" PRIu32
"] wait_count=%" PRIu64 " signal_count=%" PRIu64
" constants_range=[%" PRIu64 ", +%" PRIu64
"] bindings_range=[%" PRIu64 ", +%" PRIhsz "]",
payload.executable_id, payload.queue_affinity, payload.export_ordinal,
payload.flags, payload.workgroup_count[0], payload.workgroup_count[1],
payload.workgroup_count[2], payload.workgroup_size[0],
payload.workgroup_size[1], payload.workgroup_size[2],
payload.wait_semaphore_count, payload.signal_semaphore_count,
payload_range->offset + constants_offset, payload.constants_length,
payload_range->offset + bindings_offset, bindings_size));
return iree_hal_replay_dump_append_text_buffer_ref(
builder, "workgroup_count_ref", &payload.workgroup_count_ref);
}
case IREE_HAL_REPLAY_PAYLOAD_TYPE_DEVICE_QUEUE_EXECUTE: {
if (record->payload.data_length <
sizeof(iree_hal_replay_device_queue_execute_payload_t)) {
return iree_make_status(IREE_STATUS_DATA_LOSS,
"replay queue execute payload is short");
}
iree_hal_replay_device_queue_execute_payload_t payload;
memcpy(&payload, record->payload.data, sizeof(payload));
iree_host_size_t wait_offset = 0;
iree_host_size_t wait_size = 0;
iree_host_size_t signal_offset = 0;
iree_host_size_t signal_size = 0;
iree_host_size_t bindings_offset = 0;
iree_host_size_t bindings_size = 0;
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_queue_execute_layout(
record, &payload, &wait_offset, &wait_size, &signal_offset,
&signal_size, &bindings_offset, &bindings_size));
IREE_RETURN_IF_ERROR(iree_string_builder_append_format(
builder,
" command_buffer_id=%" PRIu64 " queue_affinity=%" PRIu64
" flags=0x%016" PRIx64 " wait_count=%" PRIu64 " signal_count=%" PRIu64
" wait_range=[%" PRIu64 ", +%" PRIhsz "] signal_range=[%" PRIu64
", +%" PRIhsz "] bindings_range=[%" PRIu64 ", +%" PRIhsz "]",
payload.command_buffer_id, payload.queue_affinity, payload.flags,
payload.wait_semaphore_count, payload.signal_semaphore_count,
payload_range->offset + wait_offset, wait_size,
payload_range->offset + signal_offset, signal_size,
payload_range->offset + bindings_offset, bindings_size));
const iree_hal_replay_semaphore_timepoint_payload_t* wait_payloads =
(const iree_hal_replay_semaphore_timepoint_payload_t*)(record->payload
.data +
wait_offset);
const iree_hal_replay_semaphore_timepoint_payload_t* signal_payloads =
(const iree_hal_replay_semaphore_timepoint_payload_t*)(record->payload
.data +
signal_offset);
const iree_hal_replay_buffer_ref_payload_t* binding_payloads =
(const iree_hal_replay_buffer_ref_payload_t*)(record->payload.data +
bindings_offset);
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_text_semaphores(
builder, "wait_semaphores", wait_payloads,
(iree_host_size_t)payload.wait_semaphore_count));
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_text_semaphores(
builder, "signal_semaphores", signal_payloads,
(iree_host_size_t)payload.signal_semaphore_count));
return iree_hal_replay_dump_append_text_buffer_refs(
builder, "bindings", binding_payloads,
(iree_host_size_t)payload.binding_count);
}
case IREE_HAL_REPLAY_PAYLOAD_TYPE_DEVICE_QUEUE_ALLOCA: {
if (record->payload.data_length <
sizeof(iree_hal_replay_device_queue_alloca_payload_t)) {
return iree_make_status(IREE_STATUS_DATA_LOSS,
"replay queue alloca payload is short");
}
iree_hal_replay_device_queue_alloca_payload_t payload;
memcpy(&payload, record->payload.data, sizeof(payload));
iree_host_size_t wait_offset = 0;
iree_host_size_t wait_size = 0;
iree_host_size_t signal_offset = 0;
iree_host_size_t signal_size = 0;
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_queue_alloca_layout(
record, &payload, &wait_offset, &wait_size, &signal_offset,
&signal_size));
return iree_string_builder_append_format(
builder,
" allocation_size=%" PRIu64 " queue_affinity=%" PRIu64
" min_alignment=%" PRIu64 " usage=0x%08" PRIx32 " type=0x%08" PRIx32
" access=0x%04" PRIx16 " submit_queue_affinity=%" PRIu64
" flags=0x%016" PRIx64 " wait_count=%" PRIu64 " signal_count=%" PRIu64
" wait_range=[%" PRIu64 ", +%" PRIhsz "] signal_range=[%" PRIu64
", +%" PRIhsz "]",
payload.allocation.allocation_size, payload.allocation.queue_affinity,
payload.allocation.min_alignment, payload.allocation.usage,
payload.allocation.type, payload.allocation.access,
payload.queue_affinity, payload.flags, payload.wait_semaphore_count,
payload.signal_semaphore_count, payload_range->offset + wait_offset,
wait_size, payload_range->offset + signal_offset, signal_size);
}
case IREE_HAL_REPLAY_PAYLOAD_TYPE_DEVICE_QUEUE_DEALLOCA: {
if (record->payload.data_length <
sizeof(iree_hal_replay_device_queue_dealloca_payload_t)) {
return iree_make_status(IREE_STATUS_DATA_LOSS,
"replay queue dealloca payload is short");
}
iree_hal_replay_device_queue_dealloca_payload_t payload;
memcpy(&payload, record->payload.data, sizeof(payload));
iree_host_size_t wait_offset = 0;
iree_host_size_t wait_size = 0;
iree_host_size_t signal_offset = 0;
iree_host_size_t signal_size = 0;
iree_host_size_t trailing_offset = 0;
iree_host_size_t trailing_size = 0;
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_queue_payload_layout(
record, sizeof(payload), payload.wait_semaphore_count,
payload.signal_semaphore_count, /*trailing_payload_length=*/0,
&wait_offset, &wait_size, &signal_offset, &signal_size,
&trailing_offset, &trailing_size));
IREE_RETURN_IF_ERROR(iree_string_builder_append_format(
builder,
" queue_affinity=%" PRIu64 " flags=0x%016" PRIx64
" wait_count=%" PRIu64 " signal_count=%" PRIu64
" wait_range=[%" PRIu64 ", +%" PRIhsz "] signal_range=[%" PRIu64
", +%" PRIhsz "]",
payload.queue_affinity, payload.flags, payload.wait_semaphore_count,
payload.signal_semaphore_count, payload_range->offset + wait_offset,
wait_size, payload_range->offset + signal_offset, signal_size));
return iree_hal_replay_dump_append_text_buffer_ref(builder, "buffer_ref",
&payload.buffer_ref);
}
case IREE_HAL_REPLAY_PAYLOAD_TYPE_DEVICE_QUEUE_FILL: {
if (record->payload.data_length <
sizeof(iree_hal_replay_device_queue_fill_payload_t)) {
return iree_make_status(IREE_STATUS_DATA_LOSS,
"replay queue fill payload is short");
}
iree_hal_replay_device_queue_fill_payload_t payload;
memcpy(&payload, record->payload.data, sizeof(payload));
iree_host_size_t wait_offset = 0;
iree_host_size_t wait_size = 0;
iree_host_size_t signal_offset = 0;
iree_host_size_t signal_size = 0;
iree_host_size_t pattern_offset = 0;
iree_host_size_t pattern_size = 0;
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_queue_payload_layout(
record, sizeof(payload), payload.wait_semaphore_count,
payload.signal_semaphore_count, payload.pattern_length, &wait_offset,
&wait_size, &signal_offset, &signal_size, &pattern_offset,
&pattern_size));
IREE_RETURN_IF_ERROR(iree_string_builder_append_format(
builder,
" queue_affinity=%" PRIu64 " flags=0x%016" PRIx64
" wait_count=%" PRIu64 " signal_count=%" PRIu64
" wait_range=[%" PRIu64 ", +%" PRIhsz "] signal_range=[%" PRIu64
", +%" PRIhsz "] pattern_range=[%" PRIu64 ", +%" PRIhsz "]",
payload.queue_affinity, payload.flags, payload.wait_semaphore_count,
payload.signal_semaphore_count, payload_range->offset + wait_offset,
wait_size, payload_range->offset + signal_offset, signal_size,
payload_range->offset + pattern_offset, pattern_size));
return iree_hal_replay_dump_append_text_buffer_ref(builder, "target_ref",
&payload.target_ref);
}
case IREE_HAL_REPLAY_PAYLOAD_TYPE_DEVICE_QUEUE_UPDATE: {
if (record->payload.data_length <
sizeof(iree_hal_replay_device_queue_update_payload_t)) {
return iree_make_status(IREE_STATUS_DATA_LOSS,
"replay queue update payload is short");
}
iree_hal_replay_device_queue_update_payload_t payload;
memcpy(&payload, record->payload.data, sizeof(payload));
iree_host_size_t wait_offset = 0;
iree_host_size_t wait_size = 0;
iree_host_size_t signal_offset = 0;
iree_host_size_t signal_size = 0;
iree_host_size_t data_offset = 0;
iree_host_size_t data_size = 0;
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_queue_payload_layout(
record, sizeof(payload), payload.wait_semaphore_count,
payload.signal_semaphore_count, payload.data_length, &wait_offset,
&wait_size, &signal_offset, &signal_size, &data_offset, &data_size));
IREE_RETURN_IF_ERROR(iree_string_builder_append_format(
builder,
" queue_affinity=%" PRIu64 " flags=0x%016" PRIx64
" source_offset=%" PRIu64 " wait_count=%" PRIu64
" signal_count=%" PRIu64 " wait_range=[%" PRIu64 ", +%" PRIhsz
"] signal_range=[%" PRIu64 ", +%" PRIhsz "] data_range=[%" PRIu64
", +%" PRIhsz "]",
payload.queue_affinity, payload.flags, payload.source_offset,
payload.wait_semaphore_count, payload.signal_semaphore_count,
payload_range->offset + wait_offset, wait_size,
payload_range->offset + signal_offset, signal_size,
payload_range->offset + data_offset, data_size));
return iree_hal_replay_dump_append_text_buffer_ref(builder, "target_ref",
&payload.target_ref);
}
case IREE_HAL_REPLAY_PAYLOAD_TYPE_DEVICE_QUEUE_COPY: {
if (record->payload.data_length <
sizeof(iree_hal_replay_device_queue_copy_payload_t)) {
return iree_make_status(IREE_STATUS_DATA_LOSS,
"replay queue copy payload is short");
}
iree_hal_replay_device_queue_copy_payload_t payload;
memcpy(&payload, record->payload.data, sizeof(payload));
iree_host_size_t wait_offset = 0;
iree_host_size_t wait_size = 0;
iree_host_size_t signal_offset = 0;
iree_host_size_t signal_size = 0;
iree_host_size_t trailing_offset = 0;
iree_host_size_t trailing_size = 0;
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_queue_payload_layout(
record, sizeof(payload), payload.wait_semaphore_count,
payload.signal_semaphore_count, /*trailing_payload_length=*/0,
&wait_offset, &wait_size, &signal_offset, &signal_size,
&trailing_offset, &trailing_size));
IREE_RETURN_IF_ERROR(iree_string_builder_append_format(
builder,
" queue_affinity=%" PRIu64 " flags=0x%016" PRIx64
" wait_count=%" PRIu64 " signal_count=%" PRIu64
" wait_range=[%" PRIu64 ", +%" PRIhsz "] signal_range=[%" PRIu64
", +%" PRIhsz "]",
payload.queue_affinity, payload.flags, payload.wait_semaphore_count,
payload.signal_semaphore_count, payload_range->offset + wait_offset,
wait_size, payload_range->offset + signal_offset, signal_size));
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_text_buffer_ref(
builder, "source_ref", &payload.source_ref));
return iree_hal_replay_dump_append_text_buffer_ref(builder, "target_ref",
&payload.target_ref);
}
case IREE_HAL_REPLAY_PAYLOAD_TYPE_DEVICE_QUEUE_READ: {
if (record->payload.data_length <
sizeof(iree_hal_replay_device_queue_read_payload_t)) {
return iree_make_status(IREE_STATUS_DATA_LOSS,
"replay queue read payload is short");
}
iree_hal_replay_device_queue_read_payload_t payload;
memcpy(&payload, record->payload.data, sizeof(payload));
iree_host_size_t wait_offset = 0;
iree_host_size_t wait_size = 0;
iree_host_size_t signal_offset = 0;
iree_host_size_t signal_size = 0;
iree_host_size_t trailing_offset = 0;
iree_host_size_t trailing_size = 0;
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_queue_payload_layout(
record, sizeof(payload), payload.wait_semaphore_count,
payload.signal_semaphore_count, payload.captured_data_length,
&wait_offset, &wait_size, &signal_offset, &signal_size,
&trailing_offset, &trailing_size));
IREE_RETURN_IF_ERROR(iree_string_builder_append_format(
builder,
" source_file_id=%" PRIu64 " source_offset=%" PRIu64
" queue_affinity=%" PRIu64 " flags=0x%016" PRIx64
" captured_data_length=%" PRIu64 " wait_count=%" PRIu64
" signal_count=%" PRIu64 " wait_range=[%" PRIu64 ", +%" PRIhsz
"] signal_range=[%" PRIu64 ", +%" PRIhsz
"] captured_data_range=[%" PRIu64 ", +%" PRIhsz "]",
payload.source_file_id, payload.source_offset, payload.queue_affinity,
payload.flags, payload.captured_data_length,
payload.wait_semaphore_count, payload.signal_semaphore_count,
payload_range->offset + wait_offset, wait_size,
payload_range->offset + signal_offset, signal_size,
payload_range->offset + trailing_offset, trailing_size));
return iree_hal_replay_dump_append_text_buffer_ref(builder, "target_ref",
&payload.target_ref);
}
case IREE_HAL_REPLAY_PAYLOAD_TYPE_DEVICE_QUEUE_WRITE: {
if (record->payload.data_length <
sizeof(iree_hal_replay_device_queue_write_payload_t)) {
return iree_make_status(IREE_STATUS_DATA_LOSS,
"replay queue write payload is short");
}
iree_hal_replay_device_queue_write_payload_t payload;
memcpy(&payload, record->payload.data, sizeof(payload));
iree_host_size_t wait_offset = 0;
iree_host_size_t wait_size = 0;
iree_host_size_t signal_offset = 0;
iree_host_size_t signal_size = 0;
iree_host_size_t trailing_offset = 0;
iree_host_size_t trailing_size = 0;
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_queue_payload_layout(
record, sizeof(payload), payload.wait_semaphore_count,
payload.signal_semaphore_count, /*trailing_payload_length=*/0,
&wait_offset, &wait_size, &signal_offset, &signal_size,
&trailing_offset, &trailing_size));
IREE_RETURN_IF_ERROR(iree_string_builder_append_format(
builder,
" target_file_id=%" PRIu64 " target_offset=%" PRIu64
" queue_affinity=%" PRIu64 " flags=0x%016" PRIx64
" wait_count=%" PRIu64 " signal_count=%" PRIu64
" wait_range=[%" PRIu64 ", +%" PRIhsz "] signal_range=[%" PRIu64
", +%" PRIhsz "]",
payload.target_file_id, payload.target_offset, payload.queue_affinity,
payload.flags, payload.wait_semaphore_count,
payload.signal_semaphore_count, payload_range->offset + wait_offset,
wait_size, payload_range->offset + signal_offset, signal_size));
return iree_hal_replay_dump_append_text_buffer_ref(builder, "source_ref",
&payload.source_ref);
}
case IREE_HAL_REPLAY_PAYLOAD_TYPE_COMMAND_BUFFER_EXECUTION_BARRIER: {
if (record->payload.data_length <
sizeof(iree_hal_replay_command_buffer_execution_barrier_payload_t)) {
return iree_make_status(IREE_STATUS_DATA_LOSS,
"replay execution barrier payload is short");
}
iree_hal_replay_command_buffer_execution_barrier_payload_t payload;
memcpy(&payload, record->payload.data, sizeof(payload));
iree_host_size_t memory_offset = 0;
iree_host_size_t memory_size = 0;
iree_host_size_t buffer_offset = 0;
iree_host_size_t buffer_size = 0;
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_execution_barrier_layout(
record, &payload, &memory_offset, &memory_size, &buffer_offset,
&buffer_size));
return iree_string_builder_append_format(
builder,
" source_stage_mask=0x%016" PRIx64 " target_stage_mask=0x%016" PRIx64
" flags=0x%016" PRIx64 " memory_count=%" PRIu64
" buffer_count=%" PRIu64 " memory_barriers_range=[%" PRIu64
", +%" PRIhsz "] buffer_barriers_range=[%" PRIu64 ", +%" PRIhsz "]",
payload.source_stage_mask, payload.target_stage_mask, payload.flags,
payload.memory_barrier_count, payload.buffer_barrier_count,
payload_range->offset + memory_offset, memory_size,
payload_range->offset + buffer_offset, buffer_size);
}
case IREE_HAL_REPLAY_PAYLOAD_TYPE_COMMAND_BUFFER_EVENT: {
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_payload_length_check(
record, sizeof(iree_hal_replay_command_buffer_event_payload_t)));
iree_hal_replay_command_buffer_event_payload_t payload;
memcpy(&payload, record->payload.data, sizeof(payload));
return iree_string_builder_append_format(
builder, " event_id=%" PRIu64 " source_stage_mask=0x%016" PRIx64,
payload.event_id, payload.source_stage_mask);
}
case IREE_HAL_REPLAY_PAYLOAD_TYPE_COMMAND_BUFFER_WAIT_EVENTS: {
if (record->payload.data_length <
sizeof(iree_hal_replay_command_buffer_wait_events_payload_t)) {
return iree_make_status(IREE_STATUS_DATA_LOSS,
"replay wait events payload is short");
}
iree_hal_replay_command_buffer_wait_events_payload_t payload;
memcpy(&payload, record->payload.data, sizeof(payload));
iree_host_size_t events_offset = 0;
iree_host_size_t events_size = 0;
iree_host_size_t memory_offset = 0;
iree_host_size_t memory_size = 0;
iree_host_size_t buffer_offset = 0;
iree_host_size_t buffer_size = 0;
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_wait_events_layout(
record, &payload, &events_offset, &events_size, &memory_offset,
&memory_size, &buffer_offset, &buffer_size));
return iree_string_builder_append_format(
builder,
" source_stage_mask=0x%016" PRIx64 " target_stage_mask=0x%016" PRIx64
" event_count=%" PRIu64 " memory_count=%" PRIu64
" buffer_count=%" PRIu64 " events_range=[%" PRIu64 ", +%" PRIhsz
"] memory_barriers_range=[%" PRIu64 ", +%" PRIhsz
"] buffer_barriers_range=[%" PRIu64 ", +%" PRIhsz "]",
payload.source_stage_mask, payload.target_stage_mask,
payload.event_count, payload.memory_barrier_count,
payload.buffer_barrier_count, payload_range->offset + events_offset,
events_size, payload_range->offset + memory_offset, memory_size,
payload_range->offset + buffer_offset, buffer_size);
}
case IREE_HAL_REPLAY_PAYLOAD_TYPE_COMMAND_BUFFER_FILL_BUFFER: {
if (record->payload.data_length <
sizeof(iree_hal_replay_command_buffer_fill_buffer_payload_t)) {
return iree_make_status(IREE_STATUS_DATA_LOSS,
"replay command buffer fill payload is short");
}
iree_hal_replay_command_buffer_fill_buffer_payload_t payload;
memcpy(&payload, record->payload.data, sizeof(payload));
if (payload.pattern_length > IREE_HOST_SIZE_MAX ||
sizeof(payload) + (iree_host_size_t)payload.pattern_length !=
record->payload.data_length) {
return iree_make_status(
IREE_STATUS_DATA_LOSS,
"replay command buffer fill payload length mismatch");
}
IREE_RETURN_IF_ERROR(iree_string_builder_append_format(
builder,
" flags=0x%08" PRIx32 " pattern_range=[%" PRIu64 ", +%" PRIu64 "]",
payload.flags, payload_range->offset + sizeof(payload),
payload.pattern_length));
return iree_hal_replay_dump_append_text_buffer_ref(builder, "target",
&payload.target_ref);
}
case IREE_HAL_REPLAY_PAYLOAD_TYPE_COMMAND_BUFFER_UPDATE_BUFFER: {
if (record->payload.data_length <
sizeof(iree_hal_replay_command_buffer_update_buffer_payload_t)) {
return iree_make_status(
IREE_STATUS_DATA_LOSS,
"replay command buffer update payload is short");
}
iree_hal_replay_command_buffer_update_buffer_payload_t payload;
memcpy(&payload, record->payload.data, sizeof(payload));
if (payload.data_length > IREE_HOST_SIZE_MAX ||
sizeof(payload) + (iree_host_size_t)payload.data_length !=
record->payload.data_length) {
return iree_make_status(
IREE_STATUS_DATA_LOSS,
"replay command buffer update payload length mismatch");
}
IREE_RETURN_IF_ERROR(iree_string_builder_append_format(
builder,
" flags=0x%08" PRIx32 " source_offset=%" PRIu64
" data_range=[%" PRIu64 ", +%" PRIu64 "]",
payload.flags, payload.source_offset,
payload_range->offset + sizeof(payload), payload.data_length));
return iree_hal_replay_dump_append_text_buffer_ref(builder, "target",
&payload.target_ref);
}
case IREE_HAL_REPLAY_PAYLOAD_TYPE_COMMAND_BUFFER_COPY_BUFFER: {
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_payload_length_check(
record,
sizeof(iree_hal_replay_command_buffer_copy_buffer_payload_t)));
iree_hal_replay_command_buffer_copy_buffer_payload_t payload;
memcpy(&payload, record->payload.data, sizeof(payload));
IREE_RETURN_IF_ERROR(iree_string_builder_append_format(
builder, " flags=0x%08" PRIx32, payload.flags));
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_text_buffer_ref(
builder, "source", &payload.source_ref));
return iree_hal_replay_dump_append_text_buffer_ref(builder, "target",
&payload.target_ref);
}
default:
return iree_ok_status();
}
}
static iree_status_t iree_hal_replay_dump_append_json_payload(
iree_string_builder_t* builder, const iree_hal_replay_file_record_t* record,
const iree_hal_replay_file_range_t* payload_range) {
switch (record->header.payload_type) {
case IREE_HAL_REPLAY_PAYLOAD_TYPE_NONE:
return iree_ok_status();
case IREE_HAL_REPLAY_PAYLOAD_TYPE_REPLAY_SCOPE: {
iree_string_view_t scope_name;
IREE_RETURN_IF_ERROR(
iree_hal_replay_dump_scope_name(record, &scope_name));
IREE_RETURN_IF_ERROR(iree_string_builder_append_cstring(
builder, ",\"payload\":{\"name\":"));
IREE_RETURN_IF_ERROR(
iree_hal_replay_dump_append_json_string_view(builder, scope_name));
return iree_string_builder_append_cstring(builder, "}");
}
case IREE_HAL_REPLAY_PAYLOAD_TYPE_BUFFER_OBJECT: {
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_payload_length_check(
record, sizeof(iree_hal_replay_buffer_object_payload_t)));
iree_hal_replay_buffer_object_payload_t payload;
memcpy(&payload, record->payload.data, sizeof(payload));
return iree_string_builder_append_format(
builder,
",\"payload\":{\"allocation_size\":%" PRIu64
",\"byte_offset\":%" PRIu64 ",\"byte_length\":%" PRIu64
",\"queue_affinity\":%" PRIu64 ",\"placement_flags\":%" PRIu32
",\"memory_type\":%" PRIu32 ",\"allowed_usage\":%" PRIu32
",\"allowed_access\":%" PRIu16 "}",
payload.allocation_size, payload.byte_offset, payload.byte_length,
payload.queue_affinity, payload.placement_flags, payload.memory_type,
payload.allowed_usage, payload.allowed_access);
}
case IREE_HAL_REPLAY_PAYLOAD_TYPE_ALLOCATOR_ALLOCATE_BUFFER: {
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_payload_length_check(
record, sizeof(iree_hal_replay_allocator_allocate_buffer_payload_t)));
iree_hal_replay_allocator_allocate_buffer_payload_t payload;
memcpy(&payload, record->payload.data, sizeof(payload));
return iree_string_builder_append_format(
builder,
",\"payload\":{\"allocation_size\":%" PRIu64
",\"queue_affinity\":%" PRIu64 ",\"min_alignment\":%" PRIu64
",\"usage\":%" PRIu32 ",\"type\":%" PRIu32 ",\"access\":%" PRIu16 "}",
payload.allocation_size, payload.queue_affinity,
payload.min_alignment, payload.usage, payload.type, payload.access);
}
case IREE_HAL_REPLAY_PAYLOAD_TYPE_ALLOCATOR_IMPORT_BUFFER: {
if (record->payload.data_length <
sizeof(iree_hal_replay_allocator_import_buffer_payload_t)) {
return iree_make_status(IREE_STATUS_DATA_LOSS,
"replay import buffer payload is short");
}
iree_hal_replay_allocator_import_buffer_payload_t payload;
memcpy(&payload, record->payload.data, sizeof(payload));
if (payload.data_length >
record->payload.data_length -
sizeof(iree_hal_replay_allocator_import_buffer_payload_t)) {
return iree_make_status(
IREE_STATUS_DATA_LOSS,
"replay import buffer data extends past record");
}
IREE_RETURN_IF_ERROR(iree_string_builder_append_format(
builder,
",\"payload\":{\"allocation_size\":%" PRIu64
",\"queue_affinity\":%" PRIu64 ",\"min_alignment\":%" PRIu64
",\"usage\":%" PRIu32 ",\"type\":%" PRIu32 ",\"access\":%" PRIu16
",\"external_type\":%" PRIu32 ",\"external_flags\":%" PRIu32,
payload.allocation.allocation_size, payload.allocation.queue_affinity,
payload.allocation.min_alignment, payload.allocation.usage,
payload.allocation.type, payload.allocation.access,
payload.external_type, payload.external_flags));
iree_hal_replay_file_range_t data_range =
iree_hal_replay_file_range_empty();
data_range.offset =
payload_range->offset +
(uint64_t)sizeof(iree_hal_replay_allocator_import_buffer_payload_t);
data_range.length = payload.data_length;
data_range.uncompressed_length = payload.data_length;
data_range.compression_type = IREE_HAL_REPLAY_COMPRESSION_TYPE_NONE;
data_range.digest_type = IREE_HAL_REPLAY_DIGEST_TYPE_NONE;
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_json_file_range(
builder, "data_range", &data_range));
return iree_string_builder_append_cstring(builder, "}");
}
case IREE_HAL_REPLAY_PAYLOAD_TYPE_BUFFER_RANGE: {
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_payload_length_check(
record, sizeof(iree_hal_replay_buffer_range_payload_t)));
iree_hal_replay_buffer_range_payload_t payload;
memcpy(&payload, record->payload.data, sizeof(payload));
return iree_string_builder_append_format(
builder,
",\"payload\":{\"byte_offset\":%" PRIu64 ",\"byte_length\":%" PRIu64
",\"mapping_mode\":%" PRIu32 ",\"memory_access\":%" PRIu16 "}",
payload.byte_offset, payload.byte_length, payload.mapping_mode,
payload.memory_access);
}
case IREE_HAL_REPLAY_PAYLOAD_TYPE_BUFFER_RANGE_DATA: {
if (record->payload.data_length <
sizeof(iree_hal_replay_buffer_range_data_payload_t)) {
return iree_make_status(IREE_STATUS_DATA_LOSS,
"replay buffer range data payload is short");
}
iree_hal_replay_buffer_range_data_payload_t payload;
memcpy(&payload, record->payload.data, sizeof(payload));
if (payload.data_length >
record->payload.data_length -
sizeof(iree_hal_replay_buffer_range_data_payload_t)) {
return iree_make_status(IREE_STATUS_DATA_LOSS,
"replay buffer range data extends past record");
}
IREE_RETURN_IF_ERROR(iree_string_builder_append_format(
builder,
",\"payload\":{\"byte_offset\":%" PRIu64 ",\"byte_length\":%" PRIu64
",\"mapping_mode\":%" PRIu32 ",\"memory_access\":%" PRIu16,
payload.byte_offset, payload.byte_length, payload.mapping_mode,
payload.memory_access));
iree_hal_replay_file_range_t data_range =
iree_hal_replay_file_range_empty();
data_range.offset =
payload_range->offset +
(uint64_t)sizeof(iree_hal_replay_buffer_range_data_payload_t);
data_range.length = payload.data_length;
data_range.uncompressed_length = payload.data_length;
data_range.compression_type = IREE_HAL_REPLAY_COMPRESSION_TYPE_NONE;
data_range.digest_type = IREE_HAL_REPLAY_DIGEST_TYPE_NONE;
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_json_file_range(
builder, "data_range", &data_range));
return iree_string_builder_append_cstring(builder, "}");
}
case IREE_HAL_REPLAY_PAYLOAD_TYPE_COMMAND_BUFFER_OBJECT: {
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_payload_length_check(
record, sizeof(iree_hal_replay_command_buffer_object_payload_t)));
iree_hal_replay_command_buffer_object_payload_t payload;
memcpy(&payload, record->payload.data, sizeof(payload));
return iree_string_builder_append_format(
builder,
",\"payload\":{\"mode\":%" PRIu32 ",\"command_categories\":%" PRIu32
",\"queue_affinity\":%" PRIu64 ",\"binding_capacity\":%" PRIu64 "}",
payload.mode, payload.command_categories, payload.queue_affinity,
payload.binding_capacity);
}
case IREE_HAL_REPLAY_PAYLOAD_TYPE_EXECUTABLE_CACHE_OBJECT: {
if (record->payload.data_length <
sizeof(iree_hal_replay_executable_cache_object_payload_t)) {
return iree_make_status(IREE_STATUS_DATA_LOSS,
"replay executable cache payload is short");
}
iree_hal_replay_executable_cache_object_payload_t payload;
memcpy(&payload, record->payload.data, sizeof(payload));
if (payload.identifier_length >
record->payload.data_length -
sizeof(iree_hal_replay_executable_cache_object_payload_t)) {
return iree_make_status(IREE_STATUS_DATA_LOSS,
"replay executable cache identifier extends "
"past record");
}
IREE_RETURN_IF_ERROR(iree_string_builder_append_cstring(
builder, ",\"payload\":{\"identifier_length\":"));
IREE_RETURN_IF_ERROR(iree_string_builder_append_format(
builder, "%" PRIu64, payload.identifier_length));
iree_hal_replay_file_range_t identifier_range =
iree_hal_replay_dump_payload_subrange(
payload_range,
sizeof(iree_hal_replay_executable_cache_object_payload_t),
(iree_host_size_t)payload.identifier_length);
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_json_file_range(
builder, "identifier_range", &identifier_range));
return iree_string_builder_append_cstring(builder, "}");
}
case IREE_HAL_REPLAY_PAYLOAD_TYPE_EXECUTABLE_PREPARE: {
if (record->payload.data_length <
sizeof(iree_hal_replay_executable_prepare_payload_t)) {
return iree_make_status(IREE_STATUS_DATA_LOSS,
"replay executable prepare payload is short");
}
iree_hal_replay_executable_prepare_payload_t payload;
memcpy(&payload, record->payload.data, sizeof(payload));
iree_hal_replay_dump_executable_prepare_ranges_t ranges;
IREE_RETURN_IF_ERROR(
iree_hal_replay_dump_compute_executable_prepare_ranges(
record, &payload, &ranges));
IREE_RETURN_IF_ERROR(iree_string_builder_append_format(
builder,
",\"payload\":{\"queue_affinity\":%" PRIu64
",\"caching_mode\":%" PRIu32 ",\"executable_format_length\":%" PRIu32
",\"executable_data_length\":%" PRIu64 ",\"constant_count\":%" PRIu64
",\"executable_metadata_length\":%" PRIu32,
payload.queue_affinity, payload.caching_mode,
payload.executable_format_length, payload.executable_data_length,
payload.constant_count, payload.executable_metadata_length));
iree_hal_replay_file_range_t format_range =
iree_hal_replay_dump_payload_subrange(
payload_range, ranges.format_offset,
(iree_host_size_t)payload.executable_format_length);
iree_hal_replay_file_range_t data_range =
iree_hal_replay_dump_payload_subrange(
payload_range, ranges.data_offset,
(iree_host_size_t)payload.executable_data_length);
iree_hal_replay_file_range_t constants_range =
iree_hal_replay_dump_payload_subrange(
payload_range, ranges.constants_offset, ranges.constant_bytes);
iree_hal_replay_file_range_t metadata_range =
iree_hal_replay_dump_payload_subrange(
payload_range, ranges.metadata_offset,
(iree_host_size_t)payload.executable_metadata_length);
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_json_file_range(
builder, "format_range", &format_range));
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_json_file_range(
builder, "data_range", &data_range));
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_json_file_range(
builder, "constants_range", &constants_range));
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_json_file_range(
builder, "metadata_range", &metadata_range));
iree_hal_replay_executable_metadata_header_t metadata_header;
bool has_metadata = false;
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_read_executable_metadata_header(
record, &payload, &ranges, &has_metadata, &metadata_header));
if (has_metadata) {
IREE_RETURN_IF_ERROR(iree_string_builder_append_format(
builder,
",\"metadata_export_count\":%" PRIu64
",\"metadata_parameter_count\":%" PRIu64,
metadata_header.export_count, metadata_header.parameter_count));
}
return iree_string_builder_append_cstring(builder, "}");
}
case IREE_HAL_REPLAY_PAYLOAD_TYPE_SEMAPHORE_OBJECT: {
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_payload_length_check(
record, sizeof(iree_hal_replay_semaphore_object_payload_t)));
iree_hal_replay_semaphore_object_payload_t payload;
memcpy(&payload, record->payload.data, sizeof(payload));
return iree_string_builder_append_format(
builder,
",\"payload\":{\"queue_affinity\":%" PRIu64
",\"initial_value\":%" PRIu64 ",\"flags\":%" PRIu64 "}",
payload.queue_affinity, payload.initial_value, payload.flags);
}
case IREE_HAL_REPLAY_PAYLOAD_TYPE_EVENT_OBJECT: {
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_payload_length_check(
record, sizeof(iree_hal_replay_event_object_payload_t)));
iree_hal_replay_event_object_payload_t payload;
memcpy(&payload, record->payload.data, sizeof(payload));
return iree_string_builder_append_format(
builder,
",\"payload\":{\"queue_affinity\":%" PRIu64 ",\"flags\":%" PRIu32 "}",
payload.queue_affinity, payload.flags);
}
case IREE_HAL_REPLAY_PAYLOAD_TYPE_FILE_OBJECT: {
if (record->payload.data_length <
sizeof(iree_hal_replay_file_object_payload_t)) {
return iree_make_status(IREE_STATUS_DATA_LOSS,
"replay file object payload is short");
}
iree_hal_replay_file_object_payload_t payload;
memcpy(&payload, record->payload.data, sizeof(payload));
if (payload.reference_length > IREE_HOST_SIZE_MAX ||
sizeof(payload) + (iree_host_size_t)payload.reference_length !=
record->payload.data_length) {
return iree_make_status(IREE_STATUS_DATA_LOSS,
"replay file object payload length mismatch");
}
IREE_RETURN_IF_ERROR(
iree_string_builder_append_format(
builder,
",\"payload\":{\"queue_affinity\":%" PRIu64
",\"file_length\":%" PRIu64 ",\"file_device\":%" PRIu64
",\"file_inode\":%" PRIu64 ",\"file_mtime_ns\":%" PRIu64
",\"reference_length\":%" PRIu64 ",\"access\":%" PRIu32
",\"flags\":%" PRIu32 ",\"handle_type\":%" PRIu32
",\"reference_type\":%" PRIu32 ",\"reference_type_name\":\"%s\""
",\"validation_type\":%" PRIu32 ",\"validation_type_name\":\"%s\""
",\"digest_type\":%" PRIu32 ",\"digest_fnv1a64\":\"0x%016" PRIx64
"\"",
payload.queue_affinity, payload.file_length, payload.file_device,
payload.file_inode, payload.file_mtime_ns,
payload.reference_length, payload.access, payload.flags,
payload.handle_type, payload.reference_type,
iree_hal_replay_dump_file_reference_type_string(
payload.reference_type),
payload.validation_type,
iree_hal_replay_dump_file_validation_type_string(
payload.validation_type),
(uint32_t)payload.digest_type,
iree_hal_replay_digest_load_fnv1a64(payload.digest)));
iree_hal_replay_file_range_t reference_range =
iree_hal_replay_dump_payload_subrange(
payload_range, sizeof(payload),
(iree_host_size_t)payload.reference_length);
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_json_file_range(
builder, "reference_range", &reference_range));
return iree_string_builder_append_cstring(builder, "}");
}
case IREE_HAL_REPLAY_PAYLOAD_TYPE_DISPATCH: {
if (record->payload.data_length <
sizeof(iree_hal_replay_dispatch_payload_t)) {
return iree_make_status(IREE_STATUS_DATA_LOSS,
"replay dispatch payload is short");
}
iree_hal_replay_dispatch_payload_t payload;
memcpy(&payload, record->payload.data, sizeof(payload));
iree_host_size_t wait_offset = 0;
iree_host_size_t wait_size = 0;
iree_host_size_t signal_offset = 0;
iree_host_size_t signal_size = 0;
iree_host_size_t constants_offset = 0;
iree_host_size_t bindings_offset = 0;
iree_host_size_t bindings_size = 0;
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_dispatch_layout(
record, &payload, &wait_offset, &wait_size, &signal_offset,
&signal_size, &constants_offset, &bindings_offset, &bindings_size));
IREE_RETURN_IF_ERROR(iree_string_builder_append_format(
builder,
",\"payload\":{\"executable_id\":%" PRIu64
",\"queue_affinity\":%" PRIu64 ",\"export_ordinal\":%" PRIu32
",\"flags\":%" PRIu32 ",\"workgroup_count\":[%" PRIu32 ",%" PRIu32
",%" PRIu32 "],\"workgroup_size\":[%" PRIu32 ",%" PRIu32 ",%" PRIu32
"],\"dynamic_workgroup_local_memory\":%" PRIu32
",\"wait_semaphore_count\":%" PRIu64
",\"signal_semaphore_count\":%" PRIu64
",\"constants_length\":%" PRIu64 ",\"binding_count\":%" PRIu64,
payload.executable_id, payload.queue_affinity, payload.export_ordinal,
payload.flags, payload.workgroup_count[0], payload.workgroup_count[1],
payload.workgroup_count[2], payload.workgroup_size[0],
payload.workgroup_size[1], payload.workgroup_size[2],
payload.dynamic_workgroup_local_memory, payload.wait_semaphore_count,
payload.signal_semaphore_count, payload.constants_length,
payload.binding_count));
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_json_buffer_ref(
builder, "workgroup_count_ref", &payload.workgroup_count_ref));
iree_hal_replay_file_range_t wait_range =
iree_hal_replay_dump_payload_subrange(payload_range, wait_offset,
wait_size);
iree_hal_replay_file_range_t signal_range =
iree_hal_replay_dump_payload_subrange(payload_range, signal_offset,
signal_size);
iree_hal_replay_file_range_t constants_range =
iree_hal_replay_dump_payload_subrange(
payload_range, constants_offset,
(iree_host_size_t)payload.constants_length);
iree_hal_replay_file_range_t bindings_range =
iree_hal_replay_dump_payload_subrange(payload_range, bindings_offset,
bindings_size);
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_json_file_range(
builder, "wait_semaphores_range", &wait_range));
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_json_file_range(
builder, "signal_semaphores_range", &signal_range));
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_json_file_range(
builder, "constants_range", &constants_range));
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_json_file_range(
builder, "bindings_range", &bindings_range));
return iree_string_builder_append_cstring(builder, "}");
}
case IREE_HAL_REPLAY_PAYLOAD_TYPE_DEVICE_QUEUE_EXECUTE: {
if (record->payload.data_length <
sizeof(iree_hal_replay_device_queue_execute_payload_t)) {
return iree_make_status(IREE_STATUS_DATA_LOSS,
"replay queue execute payload is short");
}
iree_hal_replay_device_queue_execute_payload_t payload;
memcpy(&payload, record->payload.data, sizeof(payload));
iree_host_size_t wait_offset = 0;
iree_host_size_t wait_size = 0;
iree_host_size_t signal_offset = 0;
iree_host_size_t signal_size = 0;
iree_host_size_t bindings_offset = 0;
iree_host_size_t bindings_size = 0;
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_queue_execute_layout(
record, &payload, &wait_offset, &wait_size, &signal_offset,
&signal_size, &bindings_offset, &bindings_size));
IREE_RETURN_IF_ERROR(iree_string_builder_append_format(
builder,
",\"payload\":{\"command_buffer_id\":%" PRIu64
",\"queue_affinity\":%" PRIu64 ",\"flags\":%" PRIu64
",\"wait_semaphore_count\":%" PRIu64
",\"signal_semaphore_count\":%" PRIu64 ",\"binding_count\":%" PRIu64,
payload.command_buffer_id, payload.queue_affinity, payload.flags,
payload.wait_semaphore_count, payload.signal_semaphore_count,
payload.binding_count));
iree_hal_replay_file_range_t wait_range =
iree_hal_replay_dump_payload_subrange(payload_range, wait_offset,
wait_size);
iree_hal_replay_file_range_t signal_range =
iree_hal_replay_dump_payload_subrange(payload_range, signal_offset,
signal_size);
iree_hal_replay_file_range_t bindings_range =
iree_hal_replay_dump_payload_subrange(payload_range, bindings_offset,
bindings_size);
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_json_file_range(
builder, "wait_semaphores_range", &wait_range));
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_json_file_range(
builder, "signal_semaphores_range", &signal_range));
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_json_file_range(
builder, "bindings_range", &bindings_range));
const iree_hal_replay_semaphore_timepoint_payload_t* wait_payloads =
(const iree_hal_replay_semaphore_timepoint_payload_t*)(record->payload
.data +
wait_offset);
const iree_hal_replay_semaphore_timepoint_payload_t* signal_payloads =
(const iree_hal_replay_semaphore_timepoint_payload_t*)(record->payload
.data +
signal_offset);
const iree_hal_replay_buffer_ref_payload_t* binding_payloads =
(const iree_hal_replay_buffer_ref_payload_t*)(record->payload.data +
bindings_offset);
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_json_semaphores(
builder, "wait_semaphores", wait_payloads,
(iree_host_size_t)payload.wait_semaphore_count));
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_json_semaphores(
builder, "signal_semaphores", signal_payloads,
(iree_host_size_t)payload.signal_semaphore_count));
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_json_buffer_refs(
builder, "bindings", binding_payloads,
(iree_host_size_t)payload.binding_count));
return iree_string_builder_append_cstring(builder, "}");
}
case IREE_HAL_REPLAY_PAYLOAD_TYPE_DEVICE_QUEUE_ALLOCA: {
if (record->payload.data_length <
sizeof(iree_hal_replay_device_queue_alloca_payload_t)) {
return iree_make_status(IREE_STATUS_DATA_LOSS,
"replay queue alloca payload is short");
}
iree_hal_replay_device_queue_alloca_payload_t payload;
memcpy(&payload, record->payload.data, sizeof(payload));
iree_host_size_t wait_offset = 0;
iree_host_size_t wait_size = 0;
iree_host_size_t signal_offset = 0;
iree_host_size_t signal_size = 0;
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_queue_alloca_layout(
record, &payload, &wait_offset, &wait_size, &signal_offset,
&signal_size));
IREE_RETURN_IF_ERROR(iree_string_builder_append_format(
builder,
",\"payload\":{\"allocation_size\":%" PRIu64
",\"allocation_queue_affinity\":%" PRIu64
",\"min_alignment\":%" PRIu64 ",\"usage\":%" PRIu32
",\"type\":%" PRIu32 ",\"access\":%" PRIu16
",\"queue_affinity\":%" PRIu64 ",\"flags\":%" PRIu64
",\"wait_semaphore_count\":%" PRIu64
",\"signal_semaphore_count\":%" PRIu64,
payload.allocation.allocation_size, payload.allocation.queue_affinity,
payload.allocation.min_alignment, payload.allocation.usage,
payload.allocation.type, payload.allocation.access,
payload.queue_affinity, payload.flags, payload.wait_semaphore_count,
payload.signal_semaphore_count));
iree_hal_replay_file_range_t wait_range =
iree_hal_replay_dump_payload_subrange(payload_range, wait_offset,
wait_size);
iree_hal_replay_file_range_t signal_range =
iree_hal_replay_dump_payload_subrange(payload_range, signal_offset,
signal_size);
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_json_file_range(
builder, "wait_semaphores_range", &wait_range));
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_json_file_range(
builder, "signal_semaphores_range", &signal_range));
return iree_string_builder_append_cstring(builder, "}");
}
case IREE_HAL_REPLAY_PAYLOAD_TYPE_DEVICE_QUEUE_DEALLOCA: {
if (record->payload.data_length <
sizeof(iree_hal_replay_device_queue_dealloca_payload_t)) {
return iree_make_status(IREE_STATUS_DATA_LOSS,
"replay queue dealloca payload is short");
}
iree_hal_replay_device_queue_dealloca_payload_t payload;
memcpy(&payload, record->payload.data, sizeof(payload));
iree_host_size_t wait_offset = 0;
iree_host_size_t wait_size = 0;
iree_host_size_t signal_offset = 0;
iree_host_size_t signal_size = 0;
iree_host_size_t trailing_offset = 0;
iree_host_size_t trailing_size = 0;
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_queue_payload_layout(
record, sizeof(payload), payload.wait_semaphore_count,
payload.signal_semaphore_count, /*trailing_payload_length=*/0,
&wait_offset, &wait_size, &signal_offset, &signal_size,
&trailing_offset, &trailing_size));
IREE_RETURN_IF_ERROR(iree_string_builder_append_format(
builder,
",\"payload\":{\"queue_affinity\":%" PRIu64 ",\"flags\":%" PRIu64
",\"wait_semaphore_count\":%" PRIu64
",\"signal_semaphore_count\":%" PRIu64,
payload.queue_affinity, payload.flags, payload.wait_semaphore_count,
payload.signal_semaphore_count));
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_json_buffer_ref(
builder, "buffer_ref", &payload.buffer_ref));
iree_hal_replay_file_range_t wait_range =
iree_hal_replay_dump_payload_subrange(payload_range, wait_offset,
wait_size);
iree_hal_replay_file_range_t signal_range =
iree_hal_replay_dump_payload_subrange(payload_range, signal_offset,
signal_size);
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_json_file_range(
builder, "wait_semaphores_range", &wait_range));
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_json_file_range(
builder, "signal_semaphores_range", &signal_range));
return iree_string_builder_append_cstring(builder, "}");
}
case IREE_HAL_REPLAY_PAYLOAD_TYPE_DEVICE_QUEUE_FILL: {
if (record->payload.data_length <
sizeof(iree_hal_replay_device_queue_fill_payload_t)) {
return iree_make_status(IREE_STATUS_DATA_LOSS,
"replay queue fill payload is short");
}
iree_hal_replay_device_queue_fill_payload_t payload;
memcpy(&payload, record->payload.data, sizeof(payload));
iree_host_size_t wait_offset = 0;
iree_host_size_t wait_size = 0;
iree_host_size_t signal_offset = 0;
iree_host_size_t signal_size = 0;
iree_host_size_t pattern_offset = 0;
iree_host_size_t pattern_size = 0;
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_queue_payload_layout(
record, sizeof(payload), payload.wait_semaphore_count,
payload.signal_semaphore_count, payload.pattern_length, &wait_offset,
&wait_size, &signal_offset, &signal_size, &pattern_offset,
&pattern_size));
IREE_RETURN_IF_ERROR(iree_string_builder_append_format(
builder,
",\"payload\":{\"queue_affinity\":%" PRIu64 ",\"flags\":%" PRIu64
",\"wait_semaphore_count\":%" PRIu64
",\"signal_semaphore_count\":%" PRIu64 ",\"pattern_length\":%" PRIu64,
payload.queue_affinity, payload.flags, payload.wait_semaphore_count,
payload.signal_semaphore_count, payload.pattern_length));
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_json_buffer_ref(
builder, "target_ref", &payload.target_ref));
iree_hal_replay_file_range_t wait_range =
iree_hal_replay_dump_payload_subrange(payload_range, wait_offset,
wait_size);
iree_hal_replay_file_range_t signal_range =
iree_hal_replay_dump_payload_subrange(payload_range, signal_offset,
signal_size);
iree_hal_replay_file_range_t pattern_range =
iree_hal_replay_dump_payload_subrange(payload_range, pattern_offset,
pattern_size);
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_json_file_range(
builder, "wait_semaphores_range", &wait_range));
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_json_file_range(
builder, "signal_semaphores_range", &signal_range));
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_json_file_range(
builder, "pattern_range", &pattern_range));
return iree_string_builder_append_cstring(builder, "}");
}
case IREE_HAL_REPLAY_PAYLOAD_TYPE_DEVICE_QUEUE_UPDATE: {
if (record->payload.data_length <
sizeof(iree_hal_replay_device_queue_update_payload_t)) {
return iree_make_status(IREE_STATUS_DATA_LOSS,
"replay queue update payload is short");
}
iree_hal_replay_device_queue_update_payload_t payload;
memcpy(&payload, record->payload.data, sizeof(payload));
iree_host_size_t wait_offset = 0;
iree_host_size_t wait_size = 0;
iree_host_size_t signal_offset = 0;
iree_host_size_t signal_size = 0;
iree_host_size_t data_offset = 0;
iree_host_size_t data_size = 0;
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_queue_payload_layout(
record, sizeof(payload), payload.wait_semaphore_count,
payload.signal_semaphore_count, payload.data_length, &wait_offset,
&wait_size, &signal_offset, &signal_size, &data_offset, &data_size));
IREE_RETURN_IF_ERROR(iree_string_builder_append_format(
builder,
",\"payload\":{\"queue_affinity\":%" PRIu64 ",\"flags\":%" PRIu64
",\"source_offset\":%" PRIu64 ",\"wait_semaphore_count\":%" PRIu64
",\"signal_semaphore_count\":%" PRIu64 ",\"data_length\":%" PRIu64,
payload.queue_affinity, payload.flags, payload.source_offset,
payload.wait_semaphore_count, payload.signal_semaphore_count,
payload.data_length));
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_json_buffer_ref(
builder, "target_ref", &payload.target_ref));
iree_hal_replay_file_range_t wait_range =
iree_hal_replay_dump_payload_subrange(payload_range, wait_offset,
wait_size);
iree_hal_replay_file_range_t signal_range =
iree_hal_replay_dump_payload_subrange(payload_range, signal_offset,
signal_size);
iree_hal_replay_file_range_t data_range =
iree_hal_replay_dump_payload_subrange(payload_range, data_offset,
data_size);
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_json_file_range(
builder, "wait_semaphores_range", &wait_range));
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_json_file_range(
builder, "signal_semaphores_range", &signal_range));
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_json_file_range(
builder, "data_range", &data_range));
return iree_string_builder_append_cstring(builder, "}");
}
case IREE_HAL_REPLAY_PAYLOAD_TYPE_DEVICE_QUEUE_COPY: {
if (record->payload.data_length <
sizeof(iree_hal_replay_device_queue_copy_payload_t)) {
return iree_make_status(IREE_STATUS_DATA_LOSS,
"replay queue copy payload is short");
}
iree_hal_replay_device_queue_copy_payload_t payload;
memcpy(&payload, record->payload.data, sizeof(payload));
iree_host_size_t wait_offset = 0;
iree_host_size_t wait_size = 0;
iree_host_size_t signal_offset = 0;
iree_host_size_t signal_size = 0;
iree_host_size_t trailing_offset = 0;
iree_host_size_t trailing_size = 0;
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_queue_payload_layout(
record, sizeof(payload), payload.wait_semaphore_count,
payload.signal_semaphore_count, /*trailing_payload_length=*/0,
&wait_offset, &wait_size, &signal_offset, &signal_size,
&trailing_offset, &trailing_size));
IREE_RETURN_IF_ERROR(iree_string_builder_append_format(
builder,
",\"payload\":{\"queue_affinity\":%" PRIu64 ",\"flags\":%" PRIu64
",\"wait_semaphore_count\":%" PRIu64
",\"signal_semaphore_count\":%" PRIu64,
payload.queue_affinity, payload.flags, payload.wait_semaphore_count,
payload.signal_semaphore_count));
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_json_buffer_ref(
builder, "source_ref", &payload.source_ref));
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_json_buffer_ref(
builder, "target_ref", &payload.target_ref));
iree_hal_replay_file_range_t wait_range =
iree_hal_replay_dump_payload_subrange(payload_range, wait_offset,
wait_size);
iree_hal_replay_file_range_t signal_range =
iree_hal_replay_dump_payload_subrange(payload_range, signal_offset,
signal_size);
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_json_file_range(
builder, "wait_semaphores_range", &wait_range));
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_json_file_range(
builder, "signal_semaphores_range", &signal_range));
return iree_string_builder_append_cstring(builder, "}");
}
case IREE_HAL_REPLAY_PAYLOAD_TYPE_DEVICE_QUEUE_READ: {
if (record->payload.data_length <
sizeof(iree_hal_replay_device_queue_read_payload_t)) {
return iree_make_status(IREE_STATUS_DATA_LOSS,
"replay queue read payload is short");
}
iree_hal_replay_device_queue_read_payload_t payload;
memcpy(&payload, record->payload.data, sizeof(payload));
iree_host_size_t wait_offset = 0;
iree_host_size_t wait_size = 0;
iree_host_size_t signal_offset = 0;
iree_host_size_t signal_size = 0;
iree_host_size_t trailing_offset = 0;
iree_host_size_t trailing_size = 0;
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_queue_payload_layout(
record, sizeof(payload), payload.wait_semaphore_count,
payload.signal_semaphore_count, payload.captured_data_length,
&wait_offset, &wait_size, &signal_offset, &signal_size,
&trailing_offset, &trailing_size));
IREE_RETURN_IF_ERROR(iree_string_builder_append_format(
builder,
",\"payload\":{\"source_file_id\":%" PRIu64
",\"source_offset\":%" PRIu64 ",\"queue_affinity\":%" PRIu64
",\"flags\":%" PRIu64 ",\"captured_data_length\":%" PRIu64
",\"wait_semaphore_count\":%" PRIu64
",\"signal_semaphore_count\":%" PRIu64,
payload.source_file_id, payload.source_offset, payload.queue_affinity,
payload.flags, payload.captured_data_length,
payload.wait_semaphore_count, payload.signal_semaphore_count));
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_json_buffer_ref(
builder, "target_ref", &payload.target_ref));
iree_hal_replay_file_range_t wait_range =
iree_hal_replay_dump_payload_subrange(payload_range, wait_offset,
wait_size);
iree_hal_replay_file_range_t signal_range =
iree_hal_replay_dump_payload_subrange(payload_range, signal_offset,
signal_size);
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_json_file_range(
builder, "wait_semaphores_range", &wait_range));
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_json_file_range(
builder, "signal_semaphores_range", &signal_range));
iree_hal_replay_file_range_t captured_data_range =
iree_hal_replay_dump_payload_subrange(payload_range, trailing_offset,
trailing_size);
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_json_file_range(
builder, "captured_data_range", &captured_data_range));
return iree_string_builder_append_cstring(builder, "}");
}
case IREE_HAL_REPLAY_PAYLOAD_TYPE_DEVICE_QUEUE_WRITE: {
if (record->payload.data_length <
sizeof(iree_hal_replay_device_queue_write_payload_t)) {
return iree_make_status(IREE_STATUS_DATA_LOSS,
"replay queue write payload is short");
}
iree_hal_replay_device_queue_write_payload_t payload;
memcpy(&payload, record->payload.data, sizeof(payload));
iree_host_size_t wait_offset = 0;
iree_host_size_t wait_size = 0;
iree_host_size_t signal_offset = 0;
iree_host_size_t signal_size = 0;
iree_host_size_t trailing_offset = 0;
iree_host_size_t trailing_size = 0;
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_queue_payload_layout(
record, sizeof(payload), payload.wait_semaphore_count,
payload.signal_semaphore_count, /*trailing_payload_length=*/0,
&wait_offset, &wait_size, &signal_offset, &signal_size,
&trailing_offset, &trailing_size));
IREE_RETURN_IF_ERROR(iree_string_builder_append_format(
builder,
",\"payload\":{\"target_file_id\":%" PRIu64
",\"target_offset\":%" PRIu64 ",\"queue_affinity\":%" PRIu64
",\"flags\":%" PRIu64 ",\"wait_semaphore_count\":%" PRIu64
",\"signal_semaphore_count\":%" PRIu64,
payload.target_file_id, payload.target_offset, payload.queue_affinity,
payload.flags, payload.wait_semaphore_count,
payload.signal_semaphore_count));
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_json_buffer_ref(
builder, "source_ref", &payload.source_ref));
iree_hal_replay_file_range_t wait_range =
iree_hal_replay_dump_payload_subrange(payload_range, wait_offset,
wait_size);
iree_hal_replay_file_range_t signal_range =
iree_hal_replay_dump_payload_subrange(payload_range, signal_offset,
signal_size);
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_json_file_range(
builder, "wait_semaphores_range", &wait_range));
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_json_file_range(
builder, "signal_semaphores_range", &signal_range));
return iree_string_builder_append_cstring(builder, "}");
}
case IREE_HAL_REPLAY_PAYLOAD_TYPE_COMMAND_BUFFER_EXECUTION_BARRIER: {
if (record->payload.data_length <
sizeof(iree_hal_replay_command_buffer_execution_barrier_payload_t)) {
return iree_make_status(IREE_STATUS_DATA_LOSS,
"replay execution barrier payload is short");
}
iree_hal_replay_command_buffer_execution_barrier_payload_t payload;
memcpy(&payload, record->payload.data, sizeof(payload));
iree_host_size_t memory_offset = 0;
iree_host_size_t memory_size = 0;
iree_host_size_t buffer_offset = 0;
iree_host_size_t buffer_size = 0;
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_execution_barrier_layout(
record, &payload, &memory_offset, &memory_size, &buffer_offset,
&buffer_size));
IREE_RETURN_IF_ERROR(iree_string_builder_append_format(
builder,
",\"payload\":{\"source_stage_mask\":%" PRIu64
",\"target_stage_mask\":%" PRIu64 ",\"flags\":%" PRIu64
",\"memory_barrier_count\":%" PRIu64
",\"buffer_barrier_count\":%" PRIu64,
payload.source_stage_mask, payload.target_stage_mask, payload.flags,
payload.memory_barrier_count, payload.buffer_barrier_count));
iree_hal_replay_file_range_t memory_range =
iree_hal_replay_dump_payload_subrange(payload_range, memory_offset,
memory_size);
iree_hal_replay_file_range_t buffer_range =
iree_hal_replay_dump_payload_subrange(payload_range, buffer_offset,
buffer_size);
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_json_file_range(
builder, "memory_barriers_range", &memory_range));
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_json_file_range(
builder, "buffer_barriers_range", &buffer_range));
return iree_string_builder_append_cstring(builder, "}");
}
case IREE_HAL_REPLAY_PAYLOAD_TYPE_COMMAND_BUFFER_EVENT: {
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_payload_length_check(
record, sizeof(iree_hal_replay_command_buffer_event_payload_t)));
iree_hal_replay_command_buffer_event_payload_t payload;
memcpy(&payload, record->payload.data, sizeof(payload));
return iree_string_builder_append_format(
builder,
",\"payload\":{\"event_id\":%" PRIu64
",\"source_stage_mask\":%" PRIu64 "}",
payload.event_id, payload.source_stage_mask);
}
case IREE_HAL_REPLAY_PAYLOAD_TYPE_COMMAND_BUFFER_WAIT_EVENTS: {
if (record->payload.data_length <
sizeof(iree_hal_replay_command_buffer_wait_events_payload_t)) {
return iree_make_status(IREE_STATUS_DATA_LOSS,
"replay wait events payload is short");
}
iree_hal_replay_command_buffer_wait_events_payload_t payload;
memcpy(&payload, record->payload.data, sizeof(payload));
iree_host_size_t events_offset = 0;
iree_host_size_t events_size = 0;
iree_host_size_t memory_offset = 0;
iree_host_size_t memory_size = 0;
iree_host_size_t buffer_offset = 0;
iree_host_size_t buffer_size = 0;
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_wait_events_layout(
record, &payload, &events_offset, &events_size, &memory_offset,
&memory_size, &buffer_offset, &buffer_size));
IREE_RETURN_IF_ERROR(iree_string_builder_append_format(
builder,
",\"payload\":{\"source_stage_mask\":%" PRIu64
",\"target_stage_mask\":%" PRIu64 ",\"event_count\":%" PRIu64
",\"memory_barrier_count\":%" PRIu64
",\"buffer_barrier_count\":%" PRIu64,
payload.source_stage_mask, payload.target_stage_mask,
payload.event_count, payload.memory_barrier_count,
payload.buffer_barrier_count));
iree_hal_replay_file_range_t events_range =
iree_hal_replay_dump_payload_subrange(payload_range, events_offset,
events_size);
iree_hal_replay_file_range_t memory_range =
iree_hal_replay_dump_payload_subrange(payload_range, memory_offset,
memory_size);
iree_hal_replay_file_range_t buffer_range =
iree_hal_replay_dump_payload_subrange(payload_range, buffer_offset,
buffer_size);
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_json_file_range(
builder, "events_range", &events_range));
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_json_file_range(
builder, "memory_barriers_range", &memory_range));
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_json_file_range(
builder, "buffer_barriers_range", &buffer_range));
return iree_string_builder_append_cstring(builder, "}");
}
case IREE_HAL_REPLAY_PAYLOAD_TYPE_COMMAND_BUFFER_FILL_BUFFER: {
if (record->payload.data_length <
sizeof(iree_hal_replay_command_buffer_fill_buffer_payload_t)) {
return iree_make_status(IREE_STATUS_DATA_LOSS,
"replay command buffer fill payload is short");
}
iree_hal_replay_command_buffer_fill_buffer_payload_t payload;
memcpy(&payload, record->payload.data, sizeof(payload));
if (payload.pattern_length > IREE_HOST_SIZE_MAX ||
sizeof(payload) + (iree_host_size_t)payload.pattern_length !=
record->payload.data_length) {
return iree_make_status(
IREE_STATUS_DATA_LOSS,
"replay command buffer fill payload length mismatch");
}
IREE_RETURN_IF_ERROR(iree_string_builder_append_format(
builder,
",\"payload\":{\"flags\":%" PRIu32 ",\"pattern_length\":%" PRIu64,
payload.flags, payload.pattern_length));
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_json_buffer_ref(
builder, "target", &payload.target_ref));
iree_hal_replay_file_range_t pattern_range =
iree_hal_replay_dump_payload_subrange(
payload_range, sizeof(payload),
(iree_host_size_t)payload.pattern_length);
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_json_file_range(
builder, "pattern_range", &pattern_range));
return iree_string_builder_append_cstring(builder, "}");
}
case IREE_HAL_REPLAY_PAYLOAD_TYPE_COMMAND_BUFFER_UPDATE_BUFFER: {
if (record->payload.data_length <
sizeof(iree_hal_replay_command_buffer_update_buffer_payload_t)) {
return iree_make_status(
IREE_STATUS_DATA_LOSS,
"replay command buffer update payload is short");
}
iree_hal_replay_command_buffer_update_buffer_payload_t payload;
memcpy(&payload, record->payload.data, sizeof(payload));
if (payload.data_length > IREE_HOST_SIZE_MAX ||
sizeof(payload) + (iree_host_size_t)payload.data_length !=
record->payload.data_length) {
return iree_make_status(
IREE_STATUS_DATA_LOSS,
"replay command buffer update payload length mismatch");
}
IREE_RETURN_IF_ERROR(iree_string_builder_append_format(
builder,
",\"payload\":{\"flags\":%" PRIu32 ",\"source_offset\":%" PRIu64
",\"data_length\":%" PRIu64,
payload.flags, payload.source_offset, payload.data_length));
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_json_buffer_ref(
builder, "target", &payload.target_ref));
iree_hal_replay_file_range_t data_range =
iree_hal_replay_dump_payload_subrange(
payload_range, sizeof(payload),
(iree_host_size_t)payload.data_length);
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_json_file_range(
builder, "data_range", &data_range));
return iree_string_builder_append_cstring(builder, "}");
}
case IREE_HAL_REPLAY_PAYLOAD_TYPE_COMMAND_BUFFER_COPY_BUFFER: {
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_payload_length_check(
record,
sizeof(iree_hal_replay_command_buffer_copy_buffer_payload_t)));
iree_hal_replay_command_buffer_copy_buffer_payload_t payload;
memcpy(&payload, record->payload.data, sizeof(payload));
IREE_RETURN_IF_ERROR(iree_string_builder_append_format(
builder, ",\"payload\":{\"flags\":%" PRIu32, payload.flags));
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_json_buffer_ref(
builder, "source", &payload.source_ref));
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_json_buffer_ref(
builder, "target", &payload.target_ref));
return iree_string_builder_append_cstring(builder, "}");
}
default:
return iree_string_builder_append_cstring(builder, ",\"payload\":null");
}
}
static iree_status_t iree_hal_replay_dump_emit_text_record(
iree_hal_replay_dump_context_t* context, iree_string_builder_t* builder,
const iree_hal_replay_file_record_t* record,
const iree_hal_replay_file_range_t* payload_range,
iree_host_size_t record_offset) {
const iree_hal_replay_file_record_header_t* header = &record->header;
IREE_RETURN_IF_ERROR(iree_string_builder_append_format(
builder,
" @%" PRIhsz " #%" PRIu64 " %-11s dev=%" PRIu64 " obj=%" PRIu64
" rel=%" PRIu64 " thread=%" PRIu64 " status=%s",
record_offset, header->sequence_ordinal,
iree_hal_replay_file_record_type_string(header->record_type),
header->device_id, header->object_id, header->related_object_id,
header->thread_id,
iree_status_code_string((iree_status_code_t)header->status_code)));
if (header->object_type != IREE_HAL_REPLAY_OBJECT_TYPE_NONE) {
IREE_RETURN_IF_ERROR(iree_string_builder_append_format(
builder, " object=%s(%u)",
iree_hal_replay_object_type_string(header->object_type),
header->object_type));
}
if (header->operation_code != IREE_HAL_REPLAY_OPERATION_CODE_NONE) {
IREE_RETURN_IF_ERROR(iree_string_builder_append_format(
builder, " op=%s(%u)",
iree_hal_replay_operation_code_string(header->operation_code),
header->operation_code));
}
if (header->payload_type != IREE_HAL_REPLAY_PAYLOAD_TYPE_NONE ||
header->payload_length != 0) {
IREE_RETURN_IF_ERROR(iree_string_builder_append_format(
builder, " payload=%s(%u) range=[%" PRIu64 ", +%" PRIu64 "]",
iree_hal_replay_payload_type_string(header->payload_type),
header->payload_type, payload_range->offset, payload_range->length));
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_text_payload(
builder, record, payload_range));
}
IREE_RETURN_IF_ERROR(iree_string_builder_append_cstring(builder, "\n"));
return iree_hal_replay_dump_emit(context, builder);
}
static iree_status_t iree_hal_replay_dump_emit_json_record(
iree_hal_replay_dump_context_t* context, iree_string_builder_t* builder,
const iree_hal_replay_file_record_t* record,
const iree_hal_replay_file_range_t* payload_range,
iree_host_size_t record_offset) {
const iree_hal_replay_file_record_header_t* header = &record->header;
IREE_RETURN_IF_ERROR(
iree_string_builder_append_cstring(builder, "{\"kind\":"));
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_json_string(
builder, iree_hal_replay_file_record_type_string(header->record_type)));
IREE_RETURN_IF_ERROR(iree_string_builder_append_format(
builder,
",\"file_offset\":%" PRIhsz ",\"record_length\":%" PRIu64
",\"payload_length\":%" PRIu64 ",\"sequence_ordinal\":%" PRIu64
",\"thread_id\":%" PRIu64 ",\"device_id\":%" PRIu64
",\"object_id\":%" PRIu64 ",\"related_object_id\":%" PRIu64
",\"record_type_code\":%u,\"record_flags\":%u",
record_offset, header->record_length, header->payload_length,
header->sequence_ordinal, header->thread_id, header->device_id,
header->object_id, header->related_object_id, header->record_type,
header->record_flags));
IREE_RETURN_IF_ERROR(
iree_string_builder_append_cstring(builder, ",\"object_type\":"));
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_json_string(
builder, iree_hal_replay_object_type_string(header->object_type)));
IREE_RETURN_IF_ERROR(iree_string_builder_append_format(
builder, ",\"object_type_code\":%u", header->object_type));
IREE_RETURN_IF_ERROR(
iree_string_builder_append_cstring(builder, ",\"operation\":"));
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_json_string(
builder, iree_hal_replay_operation_code_string(header->operation_code)));
IREE_RETURN_IF_ERROR(iree_string_builder_append_format(
builder, ",\"operation_code\":%u,\"status_code\":%u,\"status\":",
header->operation_code, header->status_code));
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_json_string(
builder,
iree_status_code_string((iree_status_code_t)header->status_code)));
IREE_RETURN_IF_ERROR(
iree_string_builder_append_cstring(builder, ",\"payload_type\":"));
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_json_string(
builder, iree_hal_replay_payload_type_string(header->payload_type)));
IREE_RETURN_IF_ERROR(iree_string_builder_append_format(
builder, ",\"payload_type_code\":%u", header->payload_type));
IREE_RETURN_IF_ERROR(iree_hal_replay_dump_append_json_file_range(
builder, "payload_range", payload_range));
IREE_RETURN_IF_ERROR(
iree_hal_replay_dump_append_json_payload(builder, record, payload_range));
IREE_RETURN_IF_ERROR(iree_string_builder_append_cstring(builder, "}\n"));
return iree_hal_replay_dump_emit(context, builder);
}
static iree_status_t iree_hal_replay_dump_emit_text_file(
iree_hal_replay_dump_context_t* context, iree_string_builder_t* builder,
const iree_hal_replay_file_header_t* header,
const iree_hal_replay_dump_file_summary_t* summary) {
const bool environment_referenced = summary->external_file_count != 0;
const bool hermetic =
!environment_referenced && summary->unknown_file_reference_count == 0;
const bool strict_replay_supported =
summary->unsupported_count == 0 &&
summary->unknown_file_reference_count == 0 &&
summary->unknown_file_validation_count == 0;
IREE_RETURN_IF_ERROR(
iree_string_builder_append_format(
builder,
"IREE HAL replay v%u.%u\nfile_length: %" PRIu64
"\nheader_length: %u\nsummary:\n"
" hermetic: %s\n"
" environment_referenced: %s\n"
" strict_replay_supported: %s\n"
" records: total=%" PRIu64 " objects=%" PRIu64 " operations=%" PRIu64
" unsupported=%" PRIu64 "\n"
" scopes: begin=%" PRIu64 " end=%" PRIu64 "\n"
" files: total=%" PRIu64 " external=%" PRIu64 " inline=%" PRIu64
" ranges=%" PRIu64 " unknown=%" PRIu64 "\n"
" file_bytes: external=%" PRIu64 " inline=%" PRIu64
" ranges=%" PRIu64 " captured_reads=%" PRIu64 "\n"
" file_validation: identity=%" PRIu64 " digest=%" PRIu64
" none=%" PRIu64 " unknown=%" PRIu64 "\nrecords:\n",
header->version_major, header->version_minor, header->file_length,
header->header_length, hermetic ? "yes" : "no",
environment_referenced ? "yes" : "no",
strict_replay_supported ? "yes" : "no", summary->record_count,
summary->object_count, summary->operation_count,
summary->unsupported_count, summary->scope_begin_count,
summary->scope_end_count, summary->file_object_count,
summary->external_file_count, summary->inline_file_count,
summary->range_file_count, summary->unknown_file_reference_count,
summary->external_file_total_length,
summary->inline_file_total_length, summary->range_file_total_length,
summary->captured_read_total_length,
summary->identity_file_validation_count,
summary->digest_file_validation_count,
summary->no_file_validation_count,
summary->unknown_file_validation_count));
return iree_hal_replay_dump_emit(context, builder);
}
static iree_status_t iree_hal_replay_dump_emit_json_file(
iree_hal_replay_dump_context_t* context, iree_string_builder_t* builder,
const iree_hal_replay_file_header_t* header) {
IREE_RETURN_IF_ERROR(iree_string_builder_append_format(
builder,
"{\"kind\":\"file\",\"version_major\":%u,\"version_minor\":%u"
",\"header_length\":%u,\"flags\":%u,\"file_length\":%" PRIu64 "}\n",
header->version_major, header->version_minor, header->header_length,
header->flags, header->file_length));
return iree_hal_replay_dump_emit(context, builder);
}
static iree_status_t iree_hal_replay_dump_emit_json_summary(
iree_hal_replay_dump_context_t* context, iree_string_builder_t* builder,
const iree_hal_replay_dump_file_summary_t* summary) {
const bool environment_referenced = summary->external_file_count != 0;
const bool hermetic =
!environment_referenced && summary->unknown_file_reference_count == 0;
const bool strict_replay_supported =
summary->unsupported_count == 0 &&
summary->unknown_file_reference_count == 0 &&
summary->unknown_file_validation_count == 0;
IREE_RETURN_IF_ERROR(iree_string_builder_append_format(
builder,
"{\"kind\":\"summary\",\"hermetic\":%s,\"environment_referenced\":%s"
",\"strict_replay_supported\":%s"
",\"record_count\":%" PRIu64 ",\"object_count\":%" PRIu64
",\"operation_count\":%" PRIu64 ",\"unsupported_count\":%" PRIu64
",\"scope_begin_count\":%" PRIu64 ",\"scope_end_count\":%" PRIu64
",\"file_object_count\":%" PRIu64 ",\"external_file_count\":%" PRIu64
",\"inline_file_count\":%" PRIu64 ",\"range_file_count\":%" PRIu64
",\"unknown_file_reference_count\":%" PRIu64
",\"external_file_total_length\":%" PRIu64
",\"inline_file_total_length\":%" PRIu64
",\"range_file_total_length\":%" PRIu64
",\"captured_read_total_length\":%" PRIu64
",\"file_validation\":{\"identity\":%" PRIu64 ",\"digest\":%" PRIu64
",\"none\":%" PRIu64 ",\"unknown\":%" PRIu64 "}}\n",
hermetic ? "true" : "false", environment_referenced ? "true" : "false",
strict_replay_supported ? "true" : "false", summary->record_count,
summary->object_count, summary->operation_count,
summary->unsupported_count, summary->scope_begin_count,
summary->scope_end_count, summary->file_object_count,
summary->external_file_count, summary->inline_file_count,
summary->range_file_count, summary->unknown_file_reference_count,
summary->external_file_total_length, summary->inline_file_total_length,
summary->range_file_total_length, summary->captured_read_total_length,
summary->identity_file_validation_count,
summary->digest_file_validation_count, summary->no_file_validation_count,
summary->unknown_file_validation_count));
return iree_hal_replay_dump_emit(context, builder);
}
IREE_API_EXPORT iree_status_t
iree_hal_replay_dump_file(iree_const_byte_span_t file_contents,
const iree_hal_replay_dump_options_t* options,
iree_hal_replay_dump_write_callback_t write_callback,
iree_allocator_t host_allocator) {
IREE_ASSERT_ARGUMENT(options);
IREE_ASSERT_ARGUMENT(write_callback.fn);
if (IREE_UNLIKELY(options->format != IREE_HAL_REPLAY_DUMP_FORMAT_TEXT &&
options->format != IREE_HAL_REPLAY_DUMP_FORMAT_JSONL)) {
return iree_make_status(IREE_STATUS_INVALID_ARGUMENT,
"unsupported replay dump format");
}
iree_hal_replay_file_header_t file_header;
iree_host_size_t offset = 0;
IREE_RETURN_IF_ERROR(
iree_hal_replay_file_parse_header(file_contents, &file_header, &offset));
iree_const_byte_span_t valid_contents = file_contents;
if (file_header.file_length != 0) {
valid_contents.data_length = (iree_host_size_t)file_header.file_length;
} else {
file_header.file_length = file_contents.data_length;
}
iree_hal_replay_dump_file_summary_t summary;
IREE_RETURN_IF_ERROR(
iree_hal_replay_dump_scan_summary(valid_contents, offset, &summary));
iree_hal_replay_dump_context_t context = {
.write_callback = write_callback,
.host_allocator = host_allocator,
};
iree_string_builder_t builder;
iree_string_builder_initialize(host_allocator, &builder);
iree_status_t status = iree_ok_status();
if (options->format == IREE_HAL_REPLAY_DUMP_FORMAT_TEXT) {
status = iree_hal_replay_dump_emit_text_file(&context, &builder,
&file_header, &summary);
} else {
status =
iree_hal_replay_dump_emit_json_file(&context, &builder, &file_header);
if (iree_status_is_ok(status)) {
status =
iree_hal_replay_dump_emit_json_summary(&context, &builder, &summary);
}
}
uint64_t expected_sequence_ordinal = 0;
while (iree_status_is_ok(status) && offset < valid_contents.data_length) {
const iree_host_size_t record_offset = offset;
iree_hal_replay_file_record_t record;
status = iree_hal_replay_file_parse_record(valid_contents, record_offset,
&record, &offset);
if (!iree_status_is_ok(status)) break;
if (record.header.sequence_ordinal != expected_sequence_ordinal) {
status = iree_make_status(IREE_STATUS_DATA_LOSS,
"replay record sequence ordinal mismatch");
break;
}
++expected_sequence_ordinal;
iree_hal_replay_file_range_t payload_range =
iree_hal_replay_dump_record_payload_range(&record, record_offset);
if (options->format == IREE_HAL_REPLAY_DUMP_FORMAT_TEXT) {
status = iree_hal_replay_dump_emit_text_record(
&context, &builder, &record, &payload_range, record_offset);
} else {
status = iree_hal_replay_dump_emit_json_record(
&context, &builder, &record, &payload_range, record_offset);
}
}
iree_string_builder_deinitialize(&builder);
return status;
}