blob: beabbb92398118ebaee5b7fd730a96b3639e8aac [file] [log] [blame] [view]
# Getting Started on RISC-V with CMake
<!--
Notes to those updating this guide:
* This document should be __simple__ and cover essential items only.
Notes for optional components should go in separate files.
-->
This guide walks through cross-compiling IREE core runtime towards the RISC-V Linux platform. Cross-compiling IREE compilers towards RISC-V is not supported at the moment.
Cross-compilation involves both a *host* platform and a *target* platform. One
invokes compiler toolchains on the host platform to generate libraries and
executables that can be run on the target platform.
## Prerequisites
### Install RISC-V Tools
Execute the following script to download RISC-V toolchain and QEMU:
```shell
# In IREE source root
$ ./build_tools/riscv/riscv_bootstrap.sh
```
* RISC-V toolchain is built from https://github.com/llvm/llvm-project
* RISC-V QEMU is built from https://github.com/sifive/qemu/tree/v5.1.0-rvv-zfh-pmp
## Configure and build
### Host configuration
Build and install at least the compiler tools on your host machine, or install them from a binary distribution:
```shell
$ cmake -G Ninja -B ../iree-build-host/ -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_INSTALL_PREFIX=../iree-build-host/install .
$ cmake --build ../iree-build-host/ --target install
```
Debugging note: if `IREE_LLVMAOT_LINKER_PATH` is set for targeting Android then the build above will fail, and you should run `unset IREE_LLVMAOT_LINKER_PATH`.
### Target configuration
```shell
$ cmake -G Ninja -B ../iree-build-riscv/ \
-DCMAKE_TOOLCHAIN_FILE="./build_tools/cmake/riscv.toolchain.cmake" \
-DIREE_HOST_BINARY_ROOT=$(realpath ../iree-build-host/install) \
-DRISCV_CPU=rv64 \
-DIREE_BUILD_COMPILER=OFF \
-DIREE_ENABLE_MLIR=OFF \
-DIREE_BUILD_SAMPLES=OFF \
.
```
* The above configures IREE to cross-compile towards `rv64` cpu platform.
* If user specify different download path (default in `${HOME}/riscv`) in `riscv_bootscrap.sh`, please append `-DRISCV_TOOL_PATH="/path/to/the/downloaded/folder"` in cmake command.
Build target:
```shell
$ cmake --build ../iree-build-riscv/
```
## Test on RISC-V QEMU
### VMLA HAL backend
Translate a source MLIR into IREE module:
```shell
$ ../iree-build-host/install/bin/iree-translate \
-iree-mlir-to-vm-bytecode-module \
-iree-hal-target-backends=vmla \
$PWD/iree/tools/test/iree-run-module.mlir \
-o /tmp/iree-run-module-vmla.vmfb
```
Then run on the RISC-V QEMU:
```shell
$ $HOME/riscv/qemu/linux/RISCV/bin/qemu-riscv64 \
-cpu rv64,x-v=true,x-k=true,vlen=256,elen=64,vext_spec=v1.0 \
-L $HOME/riscv/toolchain/clang/linux/RISCV/sysroot/ \
../iree-build-riscv/iree/tools/iree-run-module -driver=vmla \
-module_file=/tmp/iree-run-module-vmla.vmfb \
-entry_function=abs \
-function_inputs="i32=-5"
```
Output:
```
I ../iree/tools/utils/vm_util.cc:227] Creating driver and device for 'vmla'...
EXEC @abs
I ../iree/tools/utils/vm_util.cc:172] result[0]: Buffer<sint32[]>
i32=5
```
### Dylib LLVM AOT backend
To compile an IREE module using the Dylib LLVM ahead-of-time (AOT) backend for
a target RISC-V we need to use the corresponding toolchain which we have downloaded at the `$HOME/riscv` folder.
Set the AOT linker path environment variable:
```shell
$ export IREE_LLVMAOT_LINKER_PATH="$HOME/riscv/toolchain/clang/linux/RISCV/bin/clang++"
```
Translate a source MLIR into an IREE module:
```shell
$ ../iree-build-host/install/bin/iree-translate \
-iree-mlir-to-vm-bytecode-module \
-iree-hal-target-backends=dylib-llvm-aot \
-iree-llvm-target-triple=riscv64 \
-iree-llvm-target-cpu=sifive-u74 \
-iree-llvm-target-abi=lp64d \
$PWD/iree/tools/test/iree-run-module.mlir \
-o /tmp/iree-run-module-llvm_aot.vmfb
```
Then run on the RISC-V QEMU:
```shell
$ $HOME/riscv/qemu/linux/RISCV/bin/qemu-riscv64 \
-cpu rv64,x-v=true,x-k=true,vlen=256,elen=64,vext_spec=v1.0 \
-L $HOME/riscv/toolchain/clang/linux/RISCV/sysroot/ \
../iree-build-riscv/iree/tools/iree-run-module -driver=dylib \
-module_file=/tmp/iree-run-module-llvm_aot.vmfb \
-entry_function=abs \
-function_inputs="i32=-5"
```
Output:
```
I ../iree/tools/utils/vm_util.cc:227] Creating driver and device for 'dylib'...
EXEC @abs
I ../iree/tools/utils/vm_util.cc:172] result[0]: Buffer<sint32[]>
i32=5
```