LLVMのバックエンドについてより理解するために良さそうな資料を見つけたので一通り触ってみることにした。 Writing an LLVM Backendという。
Writing an LLVM Backend — LLVM 8 documentation
この資料では、新しいターゲットアーキテクチャを追加するにあたって何が必要なのかについて説明してある。 Target Machine Descriptionの記述から、レジスタファイルの定義、命令の定義などについて記述していく。
LLVMのソースコードにはすでにRISCVターゲットのソースが入っているが、現時点では32‐bit版?しか対応していない(もしかしたら64-bitでも動くのかもしれない。ソースを眺めていると64‐bitの記述がいくつか散見される)ので、64-bit版のRISC-Vのターゲットを追加する練習をしてみようと思い立った。
lib/Target/Mips
をコピーして、lib/Target/RISCV64
を作ってみることにした。
ディレクトリをコピーして、まずはMips
という記述を片っ端からRISCV64
に置き換えていく。
ターゲットアーキテクチャにRISCV64を追加した。
- lib/Target/LLVMBuild.txt
diff --git a/lib/Target/LLVMBuild.txt b/lib/Target/LLVMBuild.txt index 0d899a9c782..33baa669987 100644 --- a/lib/Target/LLVMBuild.txt +++ b/lib/Target/LLVMBuild.txt @@ -33,6 +33,7 @@ subdirectories = Nios2 PowerPC RISCV + RISCV64 Sparc SystemZ WebAssembly
あとはひたすらビルドを行う。
mkdir llvm-riscv64 cd llvm-riscv64 cmake -G Ninja -DCMAKE_BUILD_TYPE="Debug" -DLLVM_TARGETS_TO_BUILD="RISCV64" ../llvm cmake --build .
まずこれでかなりの時間を要してしまった。次から、やっとターゲットアーキテクチャ向けに改造を行っていく。