FPGA開発日記

FPGAというより、コンピュータアーキテクチャかもね! カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages

LLVMのバックエンドを作るための第一歩 (2. LLVMバックエンドにターゲットアーキテクチャを登録する)

f:id:msyksphinz:20190425001356p:plain
LLVM Compiler Infrastructure

LLVMバックエンドを追加するにあたり、まずはLLVMに新しいバックエンドを登録する必要がある。

とりあえず、LLVMバックエンドがMYRISCVXアーキテクチャを認識できるようになりたい。そのために最低限追加すべきファイルについて見ていく。

lib/Target/MYRISCVX
├── CMakeLists.txt
├── LLVMBuild.txt
├── MCTargetDesc
│   ├── CMakeLists.txt
│   ├── LLVMBuild.txt
│   ├── MYRISCVXMCTargetDesc.cpp
│   └── MYRISCVXMCTargetDesc.h
├── MYRISCVX.h
├── MYRISCVX.td
├── MYRISCVXInstrFormats.td
├── MYRISCVXInstrInfo.td
├── MYRISCVXRegisterInfo.td
├── MYRISCVXTargetMachine.cpp
├── MYRISCVXTargetMachine.h
└── TargetInfo
    ├── CMakeLists.txt
    ├── LLVMBuild.txt
    └── MYRISCVXTargetInfo.cpp

MYRISCVXをターゲット名として登録する作業

以下のファイルを追加して、MYRISCVXというターゲット名をLLVMに認識させる。

CMakeLists.txt
cmake/config-ix.cmake
include/llvm/ADT/Triple.h
include/llvm/BinaryFormat/ELF.h
include/llvm/BinaryFormat/ELFRelocs/MYRISCVX.def
include/llvm/Object/ELFObjectFile.h
lib/Object/ELF.cpp
lib/Support/Triple.cpp
  • CMakeLists.txt
  diff --git a/CMakeLists.txt b/CMakeLists.txt
  index 81c2bab39ec..09ecfb45d8d 100644
  --- a/CMakeLists.txt
  +++ b/CMakeLists.txt
  @@ -299,6 +299,7 @@ set(LLVM_ALL_TARGETS
     WebAssembly
     X86
     XCore
  +  MYRISCVX   // CMakeListsにMYRISCVXをターゲットとして追加
     )
  • cmake/config-ix.cmake

    ```diff diff --git a/cmake/config-ix.cmake b/cmake/config-ix.cmake index 900c35ee4f0..8737afb9d35 100644 --- a/cmake/config-ix.cmake +++ b/cmake/config-ix.cmake @@ -410,6 +410,8 @@ elseif (LLVM_NATIVE_ARCH MATCHES "riscv32") set(LLVM_NATIVE_ARCH RISCV) elseif (LLVM_NATIVE_ARCH MATCHES "riscv64") set(LLVM_NATIVE_ARCH RISCV) +elseif (LLVM_NATIVE_ARCH MATCHES "myriscvx") // "myriscvx"というアーキテクチャ名を使えるようにする。

    • set(LLVM_NATIVE_ARCH MYRISCVX) else () message(FATAL_ERROR "Unknown architecture ${LLVM_NATIVE_ARCH}") endif () ```
  • include/llvm/ADT/Triple.h Tripleの並び順は、上記に示すようにARCHITECTURE-VENDOR-OPERATING_SYSTEMの並びで与えられる。 この時にARCHITECTUREに指定できる項目としてmyriscvx32myriscvx64を追加する。

  diff --git a/include/llvm/ADT/Triple.h b/include/llvm/ADT/Triple.h
  index e06a68e2731..1ba59ac1e74 100644
  --- a/include/llvm/ADT/Triple.h
  +++ b/include/llvm/ADT/Triple.h
  @@ -67,6 +67,8 @@ public:
    enum ArchType {
      UnknownArch,
  ...
       amdgcn,         // AMDGCN: AMD GCN GPUs
       riscv32,        // RISC-V (32-bit): riscv32
       riscv64,        // RISC-V (64-bit): riscv64
  +    myriscvx32,     // MYRISCVX (32-bit): myriscvx32
  +    myriscvx64,     // MYRISCVX (64-bit): myriscvx64
       sparc,          // Sparc: sparc
       sparcv9,        // Sparcv9: Sparcv9
       sparcel,        // Sparc: (endianness = little). NB: 'Sparcle' is a CPU variant
  • lib/Target/LLVMBuild.txt 各バックエンドターゲットは、lib/Target/以下にディレクトリとして登録される。 新しいターゲットは、lib/Target/LLVMBuild.txtに登録することで認識される。
  diff --git a/lib/Target/LLVMBuild.txt b/lib/Target/LLVMBuild.txt
  index 0ed7e9f854d..d3e945db482 100644
  --- a/lib/Target/LLVMBuild.txt
  +++ b/lib/Target/LLVMBuild.txt
  @@ -37,6 +37,7 @@ subdirectories =
    WebAssembly
    X86
    XCore
  + MYRISCVX
  
   ; This is a special group whose required libraries are extended (by llvm-build)
   ; with the best execution engine (the native JIT, if available, or the