LLVMをビルドしてRISC-V向けにコンパイルする

Last update: 2024/12/15


環境

前提

RISC-V GNU Compiler ToolchainとSpikeがインストールされていること。インストール方法は以下を参照。

RISC-V GNU Compiler Toolchainとツール群をインストールする

LLVMのソースコードをCloneしてBuildする

以下でLLVMの最新のソースコードをCloneする。この投稿を書いている時点での最新版はLLVM 21.0.0になっている。

git clone https://github.com/llvm/llvm-project.git

cloneしたディレクトリの中にbuildディレクトリを作り、その中で以下の設定でcmakeを実行する。今回はターゲットとしてX86とRISC-Vのみ設定した。

$ cmake -G Ninja -DCMAKE_BUILD_TYPE="Debug" -DLLVM_TARGETS_TO_BUILD="X86;RISCV" -DLLVM_ENABLE_PROJECTS="clang" -DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi;libunwind" ../llvm

あとはninjaを実行して並列でビルドを回す。

$ ninja

ただ、LLVMのビルドはかなり重く、メモリ不足でビルドが止まってしまうことがあった。この場合は、時間がかかるがビルドの並列度を1に設定すると回避できた。

$ ninja -j 1

RISC-V向けにコンパイルする

以下の手順でコンパイルする。ここではriscv_test.cというファイルをコンパイルしている。なお、最後だけgccでアセンブラとリンカだけ使って実行ファイルを作成している。${BUILD}はLLVMをビルドしたbuildディレクトリのPATH、${RISCV}はRISC-V GNU Compiler ToolchainをインストールしたPATHを設定する。

 ${BUILD}/bin/clang -emit-llvm -c riscv_test.c --target=riscv64-unknown-linux-gnu --sysroot=${RISCV}/riscv64-unknown-elf
$ ${BUILD}/bin/llc riscv_test.bc -march=riscv64 --float-abi=hard -mattr="+d,+f" -filetype=asm
$ riscv64-unknown-elf-gcc riscv_test.s -march=rv64gc -lc -o riscv_test

参考文献

RISCVアセンブリ生成が失敗してしまう · Issue #1 · msyksphinz-self/support_ca_llvm_book


Copyright (c) 2024 kd