| // 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; | |
| } |