FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

LLVM 9.0.0がリリースされたのでRISC-Vの対応状況を確認する

LLVM 9.0.0がリリースされた。前回のリリースからおよそ半年である。最近はLLVMはリリースバージョンが半年に1回カウントアップするのでもう9.0まで到達している(もう少し小刻みでも良いのではないか...)

LLVM 9.0のブランチはGitHubLLVMリポジトリでも切られており、さっそくリビジョンを移してビルドを実行した。

今回から、RISC-VのサポートがExperimentalから正式なリリースに入っている。8.0.0では命令の生成状況が相当いまいちだったので、改善されているかどうか確認したい。

releases.llvm.org

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).

github.com

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

とりあえずエラーは出なくなった。まともに使うことができそうだ。