| # Generate and Inspect IREE Executables | |
| In this doc, we explain the process of generating the IREE executables and | |
| inspecting the excutables with various tools. | |
| ## Generate IREE executables | |
| IREE's main codegen tools are | |
| [iree-opt](https://github.com/google/iree/blob/main/iree/tools/iree-opt-main.cc) | |
| (generate MLIR representations) and | |
| [iree-translate](https://github.com/google/iree/blob/main/iree/tools/iree-translate-main.cc) | |
| (generate the IREE bytecode modules). IREE codegen flow is based on LLVM and | |
| MLIR, so it utilizes the typical LLVM flags to define the machine targets. For | |
| example, to generate the IREE bytecode module from a vector multiply MLIR: | |
| ```bash | |
| ${OUT}/host/iree_compiler/install/bin/iree-translate \ | |
| -iree-input-type=mhlo \ | |
| -iree-mlir-to-vm-bytecode-module \ | |
| -iree-hal-target-backends=dylib-llvm-aot \ | |
| -iree-llvm-target-triple=riscv32-pc-linux-elf \ | |
| -iree-llvm-target-cpu=generic-rv32 \ | |
| -iree-llvm-target-cpu-features="+m,+f" \ | |
| -iree-llvm-target-abi=ilp32 \ | |
| -iree-llvm-embedded-linker-path=${OUT}/host/iree_compiler/install/bin/lld \ | |
| ${ROOTDIR}/toolchain/iree/iree/samples/simple_embedding/simple_embedding_test.mlir \ | |
| -o /tmp/simple_mul-llvm_aot.vmfb | |
| ``` | |
| With the options of: | |
| * iree-hal-target-backends: The HAL device (library + dispatcher) target for | |
| the workload. In Shodan, the supported targets are: | |
| * dylib-llvm-aot: the dynamic library for LLVM ahead-of-time (AOT) compilation. | |
| * vmvx | |
| * iree-llvm-target-triple: The flag is populated to LLVM target triple. | |
| * iree-llvm-target-cpu: The flag populated to LLVM target cpu. It can be | |
| pre-defined cpu targets or the generic ones | |
| ([link](https://github.com/llvm/llvm-project/blob/main/llvm/include/llvm/Support/RISCVTargetParser.def)). | |
| * iree-llvm-target-cpu-features: The flag is populated to LLVM target features for | |
| extra CPU extensions. For RISC-V, it can include the typical ISA extensions, | |
| such as multiplication/division, atomic, floating point, and compression ISA | |
| support. | |
| __For the vector extension, it can be enabled with "+experimental-v"__. | |
| * iree-llvm-target-abi: The flag is polulated to LLVM target abi. | |
| * iree-llvm-embedded-linker-path: Linker for the device executable. It is | |
| recommanded to use the lld from the IREE compiler release. | |
| Some extra options: | |
| * iree-llvm-keep-linker-artifacts: Aside from the generated bytecode flatbuffer | |
| (with [schema](https://github.com/google/iree/blob/main/iree/schemas/bytecode_module_def.fbs)), | |
| the intermediate linker is generated at `/tmp/<module_name>_linked_<hal_target>-xxxxxx.so`. | |
| (the exact path is printed in the stdout). | |
| * iree-vm-emit-polyglot-zip: Instead of the previous flag, by enabling this flag | |
| you can extract the .so from the .vmfb file with 7z | |
| ```bash | |
| 7z e -aoa -bb0 <vmfb> -y | |
| ``` | |
| * riscv-v-vector-bits-min and riscv-v-fixed-length-vector-lmul-max: If the | |
| vector extension is enabled in `iree-llvm-target-cpu-features`, the RVV VLS | |
| (vector length specific) code will be generated with the vector length specified | |
| by these two options. | |
| * iree-llvm-debug-symbols: Add the debug information in the executable. Setting | |
| this to `false` at the production executable can reduce the workload size. | |
| ## Inspect IREE executables | |
| To render the bytecode flatbuffer in a text file, the `iree-dump-module` tool | |
| can print out the content based on the descriptors in the schema, including the | |
| weights in the ML model. | |
| ```bash | |
| ${OUT}/host/iree-compiler/install/bin/iree-dump-module <vmfb file> | |
| ``` | |
| With the linker artifact enabled, The `.so` file contends the dispatch functions | |
| of the workload, and the user can use the objdump in the RISC-V toolchain to | |
| retrieve the assembler content. For example, to render the executable (.text) | |
| segment | |
| ```bash | |
| ${CACHE}/toolchain_iree_rv32imf/bin/riscv32-unknown-elf-objdump -d <linker artifact> | |
| ``` | |
| Note: | |
| * If you use llvm-objdump to retrieve the assembler content, the RVV ISAs could | |
| be rendered as unknown. | |
| ## Inspect IREE IR lowering | |
| Use `iree-opt` to check the IR output | |
| ```bash | |
| ${OUT}/host/iree-compiler/install/bin/iree-opt \ | |
| -print-ir-after-all \ | |
| -iree-transformation-pipeline \ | |
| -iree-hal-target-backends=dylib-llvm-aot \ | |
| -iree-llvm-target-triple=riscv32-pc-linux-elf \ | |
| -iree-llvm-target-cpu=generic-rv32 \ | |
| -iree-llvm-target-cpu-features="+m,+f" \ | |
| -iree-llvm-target-abi=ilp32 \ | |
| <MLIR input> | |
| ``` |