| // 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 | |
| // Assembles textual VM assembly into a VM bytecode module. | |
| // | |
| // $ iree-as-module --output=module.vmfb module.vmasm | |
| #include <stdio.h> | |
| #include <string.h> | |
| #include "iree/base/api.h" | |
| #include "iree/base/tooling/flags.h" | |
| #include "iree/io/file_contents.h" | |
| #include "iree/vm/bytecode/assembler/assembler.h" | |
| IREE_FLAG(string, output, "", "Output .vmfb file path."); | |
| int main(int argc, char** argv) { | |
| IREE_TRACE_APP_ENTER(); | |
| iree_allocator_t host_allocator = iree_allocator_system(); | |
| int exit_code = EXIT_SUCCESS; | |
| iree_flags_set_usage( | |
| "iree-as-module", | |
| "Assembles textual VM assembly into an IREE VM bytecode module.\n" | |
| "$ iree-as-module --output=module.vmfb module.vmasm\n" | |
| "$ iree-as-module --output=module.vmfb -\n"); | |
| iree_flags_parse_checked(IREE_FLAGS_PARSE_MODE_DEFAULT, &argc, &argv); | |
| iree_status_t status = iree_ok_status(); | |
| if (argc != 2 || strlen(FLAG_output) == 0) { | |
| fprintf(stderr, | |
| "Syntax: iree-as-module --output=module.vmfb module.vmasm\n"); | |
| status = iree_make_status(IREE_STATUS_INVALID_ARGUMENT, | |
| "expected one input file and --output"); | |
| } | |
| iree_io_file_contents_t* input_contents = NULL; | |
| if (iree_status_is_ok(status)) { | |
| if (strcmp(argv[1], "-") == 0) { | |
| status = | |
| iree_io_file_contents_read_stdin(host_allocator, &input_contents); | |
| } else { | |
| status = iree_io_file_contents_read(iree_make_cstring_view(argv[1]), | |
| host_allocator, &input_contents); | |
| } | |
| } | |
| iree_byte_span_t archive = iree_byte_span_empty(); | |
| if (iree_status_is_ok(status)) { | |
| iree_string_view_t source = | |
| iree_make_string_view((const char*)input_contents->const_buffer.data, | |
| input_contents->const_buffer.data_length); | |
| status = | |
| iree_vm_bytecode_assembler_assemble(source, host_allocator, &archive); | |
| } | |
| if (iree_status_is_ok(status)) { | |
| status = iree_io_file_contents_write(iree_make_cstring_view(FLAG_output), | |
| iree_const_cast_byte_span(archive), | |
| host_allocator); | |
| } | |
| iree_allocator_free(host_allocator, archive.data); | |
| iree_io_file_contents_free(input_contents); | |
| if (!iree_status_is_ok(status)) { | |
| iree_status_fprint(stderr, status); | |
| iree_status_free(status); | |
| exit_code = EXIT_FAILURE; | |
| } | |
| fflush(stderr); | |
| IREE_TRACE_APP_EXIT(exit_code); | |
| return exit_code; | |
| } |