blob: aca1c470a48f6ed1f67a0d392bd164e6fb44f4f4 [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 <stdio.h>
#include <stdlib.h>
#include "iree/base/api.h"
#include "iree/base/tooling/flags.h"
#include "iree/tooling/profile/commands.h"
#include "iree/tooling/profile/help.h"
#ifndef IREE_PROFILE_HAVE_AMDGPU_ATT
#define IREE_PROFILE_HAVE_AMDGPU_ATT 0
#endif // IREE_PROFILE_HAVE_AMDGPU_ATT
#if IREE_PROFILE_HAVE_AMDGPU_ATT
#include "iree/tooling/profile/att/att.h"
#endif // IREE_PROFILE_HAVE_AMDGPU_ATT
IREE_FLAG(string, format, "text",
"Output format for the selected command. Report commands support "
"`text` and `jsonl`; export supports `ireeperf-jsonl`.");
IREE_FLAG(string, filter, "*",
"Name/key wildcard filter for commands that consume named rows.");
IREE_FLAG(string, output, "-",
"Output file path for export commands, or `-` for stdout.");
IREE_FLAG(int64_t, id, -1,
"Optional id filter interpreted by commands that accept ids.");
IREE_FLAG(bool, dispatch_events, false,
"Emits individual dispatch event rows for projection commands with "
"`--format=jsonl`.");
IREE_FLAG(bool, counter_samples, false,
"Emits individual counter sample rows for the counter command with "
"`--format=jsonl`.");
IREE_FLAG(bool, agents_md, false,
"Prints an agent-oriented Markdown guide for iree-profile JSONL "
"workflows and exits.");
IREE_FLAG(string, rocm_library_path, "",
"ROCm library directory or exact dynamic library path used by ATT "
"decode. Overrides IREE_HAL_AMDGPU_LIBAQLPROFILE_PATH and "
"IREE_HAL_AMDGPU_LIBHSA_PATH.");
int main(int argc, char** argv) {
IREE_TRACE_APP_ENTER();
IREE_TRACE_ZONE_BEGIN(z0);
iree_allocator_t host_allocator = iree_allocator_system();
int exit_code = EXIT_SUCCESS;
const iree_profile_command_t* const commands[] = {
iree_profile_summary_command(), iree_profile_statistics_command(),
iree_profile_explain_command(), iree_profile_executable_command(),
iree_profile_dispatch_command(), iree_profile_command_command(),
iree_profile_counter_command(), iree_profile_memory_command(),
iree_profile_queue_command(), iree_profile_export_command(),
iree_profile_cat_command(),
#if IREE_PROFILE_HAVE_AMDGPU_ATT
iree_profile_att_command(),
#endif // IREE_PROFILE_HAVE_AMDGPU_ATT
};
iree_flags_set_usage("iree-profile", iree_profile_usage_text());
iree_flags_parse_checked(IREE_FLAGS_PARSE_MODE_DEFAULT, &argc, &argv);
if (FLAG_agents_md) {
iree_profile_print_agent_markdown(stdout);
fflush(stdout);
IREE_TRACE_ZONE_END(z0);
IREE_TRACE_APP_EXIT(exit_code);
return exit_code;
}
iree_string_view_t command_name = IREE_SV("cat");
iree_string_view_t input_path = iree_string_view_empty();
if (argc == 2) {
input_path = iree_make_cstring_view(argv[1]);
} else if (argc == 3) {
command_name = iree_make_cstring_view(argv[1]);
input_path = iree_make_cstring_view(argv[2]);
}
iree_status_t status = iree_ok_status();
const iree_profile_command_t* command = NULL;
if (argc != 2 && argc != 3) {
fprintf(stderr, "Error: expected profile bundle path.\n");
iree_profile_fprint_usage(stderr);
status = iree_make_status(IREE_STATUS_INVALID_ARGUMENT,
"expected profile bundle path");
} else if (iree_string_view_is_empty(input_path)) {
fprintf(stderr, "Error: missing profile bundle path.\n");
iree_profile_fprint_usage(stderr);
status = iree_make_status(IREE_STATUS_INVALID_ARGUMENT,
"missing profile bundle path");
} else {
command = iree_profile_find_command(commands, IREE_ARRAYSIZE(commands),
command_name);
if (!command) {
status = iree_make_status(IREE_STATUS_INVALID_ARGUMENT,
"unsupported iree-profile command '%.*s'",
(int)command_name.size, command_name.data);
}
}
if (iree_status_is_ok(status)) {
const iree_profile_command_options_t options = {
.format = iree_make_cstring_view(FLAG_format),
.filter = iree_make_cstring_view(FLAG_filter),
.output_path = iree_make_cstring_view(FLAG_output),
.rocm_library_path = iree_make_cstring_view(FLAG_rocm_library_path),
.id = FLAG_id,
.emit_dispatch_events = FLAG_dispatch_events,
.emit_counter_samples = FLAG_counter_samples,
.host_allocator = host_allocator,
};
status = iree_profile_command_validate_options(command, &options);
if (iree_status_is_ok(status)) {
const iree_profile_command_invocation_t invocation = {
.input_path = input_path,
.output_file = stdout,
.options = &options,
};
status = command->run(&invocation);
}
}
fflush(stdout);
if (!iree_status_is_ok(status)) {
iree_status_fprint(stderr, status);
iree_status_free(status);
exit_code = EXIT_FAILURE;
}
fflush(stderr);
IREE_TRACE_ZONE_END(z0);
IREE_TRACE_APP_EXIT(exit_code);
return exit_code;
}