
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.hTripleの並び順は、上記に示すように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