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.
The host platform should have been set up for developing IREE. Right now only Linux is supported. Please make sure you have followed the steps for Linux.
Execute the following script to download RISC-V toolchain and QEMU:
# In IREE source root $ ./build_tools/riscv/riscv_bootstrap.sh
$ mkdir build-riscv ; cd build-riscv $ cmake -G Ninja \ -DCMAKE_TOOLCHAIN_FILE="../build_tools/cmake/riscv.toolchain.cmake" \ -DRISCV_CPU=rv64 \ -DIREE_BUILD_COMPILER=OFF -DIREE_BUILD_SAMPLES=OFF \ -DIREE_HOST_C_COMPILER=`which clang` -DIREE_HOST_CXX_COMPILER=`which clang++` ..
rv64
cpu platform.${HOME}/riscv
) in riscv_bootscrap.sh
, please append -DRISCV_TOOL_PATH="/path/to/the/downloaded/folder"
in cmake command.$ cmake --build .
Translate a source MLIR into IREE module:
# Still in "build-riscv" folder. $ ./host/iree/tools/iree-translate \ -iree-mlir-to-vm-bytecode-module \ -iree-hal-target-backends=vmla \ ../iree/tools/test/simple.mlir \ -o /tmp/simple-vmla.vmfb
Then run on the RISC-V QEMU:
$ $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/tools/iree-run-module -driver=vmla \ -module_file=/tmp/simple-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
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:
# Still in "build-riscv" folder $ export IREE_LLVMAOT_LINKER_PATH="$HOME/riscv/toolchain/clang/linux/RISCV/bin/clang++ -static-libstdc++ -O3"
Translate a source MLIR into an IREE module:
$ ./host/iree/tools/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 \ ../iree/tools/test/simple.mlir \ -o /tmp/simple-llvm_aot.vmfb
Then run on the RISC-V QEMU:
$ $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/tools/iree-run-module -driver=dylib \ -module_file=/tmp/simple-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