LLVM 9.0.0がリリースされた。前回のリリースからおよそ半年である。最近はLLVMはリリースバージョンが半年に1回カウントアップするのでもう9.0まで到達している(もう少し小刻みでも良いのではないか...)
LLVM 9.0のブランチはGitHubのLLVMリポジトリでも切られており、さっそくリビジョンを移してビルドを実行した。
今回から、RISC-VのサポートがExperimentalから正式なリリースに入っている。8.0.0では命令の生成状況が相当いまいちだったので、改善されているかどうか確認したい。
The RISCV target is no longer “experimental”! It’s now built by default, rather than needing to be enabled with LLVM_EXPERIMENTAL_TARGETS_TO_BUILD.
The backend has full codegen support for the RV32I and RV64I base RISC-V instruction set variants, with the MAFDC standard extensions. We support the hard and soft-float ABIs for these targets. Testing has been performed with both Linux and bare-metal targets, including the compilation of a large corpus of Linux applications (through buildroot).
git clone https://github.com/llvm-mirror/llvm.git -b release_90 cd llvm/tools git clone https://github.com/llvm-mirror/clang.git -b release_90 cd ../../
ビルド用のディレクトリを作成し、ビルド実行。
cmake -G Ninja -DCMAKE_CXX_COMPILER=${HOME}/compiler/llvm-7.0.0/bin/clang++ -DCMAKE_C_COMPILER=${HOME}/compiler/llvm-7.0.0/bin/clang -DCMAKE_BUILD_TYPE="Release" -DLLVM_TARGETS_TO_BUILD="X86;Mips;RISCV;AArch64" ../llvm90 cmake --build .
ビルドにはかなり時間がかかった。高性能なマシンが欲しい...
./bin/llc --version LLVM (http://llvm.org/): LLVM version 9.0.0 DEBUG build with assertions. Default target: x86_64-unknown-linux-gnu Host CPU: skylake Registered Targets: aarch64 - AArch64 (little endian) aarch64_32 - AArch64 (little endian ILP32) aarch64_be - AArch64 (big endian) amdgcn - AMD GCN GPUs arm - ARM arm64 - ARM64 (little endian) arm64_32 - ARM64 (little endian ILP32) armeb - ARM (big endian) bpf - BPF (host endian) bpfeb - BPF (big endian) bpfel - BPF (little endian) hexagon - Hexagon lanai - Lanai mips - MIPS (32-bit big endian) mips64 - MIPS (64-bit big endian) mips64el - MIPS (64-bit little endian) mipsel - MIPS (32-bit little endian) msp430 - MSP430 [experimental] nvptx - NVIDIA PTX 32-bit nvptx64 - NVIDIA PTX 64-bit ppc32 - PowerPC 32 ppc64 - PowerPC 64 ppc64le - PowerPC 64 LE r600 - AMD GPUs HD2XXX-HD6XXX riscv32 - 32-bit RISC-V riscv64 - 64-bit RISC-V sparc - Sparc sparcel - Sparc LE sparcv9 - Sparc V9 systemz - SystemZ thumb - Thumb thumbeb - Thumb (big endian) wasm32 - WebAssembly 32-bit wasm64 - WebAssembly 64-bit x86 - 32-bit X86: Pentium-Pro and above x86-64 - 64-bit X86: EM64T and AMD64 xcore - XCore
あれ?ターゲットを絞ってコンパイルしたつもりだけど、なぜかすべて使えるようになっている。
では、さっそくRISC-V向けのコンパイルをしてみる。Dhystoneをダウンロードして、コンパイルしてみる。
http://www.cpu-ns32k.net/files/dhrystone.c
./bin/clang -O3 ./sample/dhrystone.c -c -emit-llvm --target=riscv64-unknown-elf -o sample/dhrystone.bc ./bin/llc -debug -march=riscv64 -filetype=asm ./sample/dhrystone.bc -o ./sample/dhrystone.S
とりあえずエラーは出なくなった。まともに使うことができそうだ。