FPGA開発日記

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

LLVM 8.0がリリースされたのでビルド試行とオリジナル実装の8.0への移行

f:id:msyksphinz:20181123225150p:plain

releases.llvm.org

LLVM 8.0がリリースされたので、さっそくダウンロードしてビルドしてみた。

これまで通り、GitHub経由でダウンロードしていたので、タグをrelease_80にアップデートするだけである。

$ cmake -G Ninja -DCMAKE_CXX_COMPILER=${HOME}/others/usr/bin/clang++ -DCMAKE_C_COMPILER=${HOME}/others/usr/bin/clang -DCMAKE_BUILD_TYPE="Debug" -DLLVM_TARGETS_TO_BUILD="Mips" -DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD="RISCV" ../llvm-myriscvx
$ cmake --build .

一応、問題なくビルドはできたようだ。一応llcのバージョンを確認してみると、riscv32とriscv64がサポートされている!素晴らしい。

$ ./bin/llc --version
LLVM (http://llvm.org/):
  LLVM version 8.0.0
  DEBUG build with assertions.
  Default target: x86_64-unknown-linux-gnu
  Host CPU: haswell

  Registered Targets:
    mips     - MIPS (32-bit big endian)
    mips64   - MIPS (64-bit big endian)
    mips64el - MIPS (64-bit little endian)
    mipsel   - MIPS (32-bit little endian)
    riscv32  - 32-bit RISC-V
    riscv64  - 64-bit RISC-V

ついでに、これまでLLVM 7.0ベースで作業をしていたオリジナルRISC-V実装の対応作業を、LLVM 8.0に移行してビルドできるか試行してみよう。

現在の作業ブランチであるmyriscvx/implmyriscvx80/implに変更し、ベースとなるブランチをrelease_70からrelease_80へ移行しよう。これにはgit rebase --ontoを使用する。

git rebase --onto release_80 origin/release_70 myriscvx80/impl

これでベースとなるブランチがrelease_80に変更された。これでビルド試行を行う。

/home/msyksphinz/work/riscv/llvm/llvm-myriscvx/lib/Target/MYRISCVX/MYRISCVXTargetMachine.cpp:82:25: error: no matching function for call to 'getEffectiveCodeModel'
                        getEffectiveCodeModel(CM), OL),
                        ^~~~~~~~~~~~~~~~~~~~~

getEffectiveCodeModelに多少の変更が加わっているようだ。この部分だけ変更する。

diff --git a/lib/Target/MYRISCVX/MYRISCVXTargetMachine.cpp b/lib/Target/MYRISCVX/MYRISCVXTargetMachine.cpp
index bfa94e6041f..7112b6b5a8a 100644
--- a/lib/Target/MYRISCVX/MYRISCVXTargetMachine.cpp
+++ b/lib/Target/MYRISCVX/MYRISCVXTargetMachine.cpp
@@ -56,7 +56,8 @@ static Reloc::Model getEffectiveRelocModel(Optional<CodeModel::Model> CM,
 }


-static CodeModel::Model getEffectiveCodeModel(Optional<CodeModel::Model> CM) {
+static CodeModel::Model getEffectiveCodeModel(Optional<CodeModel::Model> CM,
+                                              CodeModel::Model Default) {
   if (CM)
     return *CM;
   return CodeModel::Small;
@@ -79,7 +80,7 @@ MYRISCVXTargetMachine::MYRISCVXTargetMachine(const Target &T, const Triple &TT,
     //- Default is big endian
     : LLVMTargetMachine(T, computeDataLayout(TT, CPU, Options), TT, CPU, FS, Options,
                         getEffectiveRelocModel(CM, RM),
-                        getEffectiveCodeModel(CM), OL),
+                        getEffectiveCodeModel(CM, CodeModel::Small), OL),
       TLOF(make_unique<MYRISCVXTargetObjectFile>()),
       ABI(MYRISCVXABIInfo::computeTargetABI()),
       DefaultSubtarget(TT, CPU, FS, *this) {

これで一応ビルドが完了した。多少の変更は必要なようだ。