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"というアーキテクチャ名を使えるようにする。
include/llvm/ADT/Triple.h
Tripleの並び順は、上記に示すようにARCHITECTURE-VENDOR-OPERATING_SYSTEM
の並びで与えられる。 この時にARCHITECTURE
に指定できる項目としてmyriscvx32
とmyriscvx64
を追加する。
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