# LLVM Backend
###### tags: `llvm` `backend` `code generation`
## How to add target
1. add your target into `lib/Target`
* e.g: lib/Target/`TEMP`
2. add the target [td](https://llvm.org/docs/TableGen/index.html)
- TableGen would eat td file to generate XXX`GenRegisterInfo.inc` file included by C++
* `TEMP.td`
* `TEMPRegisterInfo.td` -[defining-a-register](https://llvm.org/docs/WritingAnLLVMBackend.html#defining-a-register)
```td=
// for assembly code with opcode
class TEMPReg<bits<16> Enc, string n> : Register<n> {
let HWEncoding = Enc;
let Namespace = "TEMP";
}
// regular registers
/* */
def R0 : TEMPReg< 0, "r0">, DwarfRegNum<[0]>;
def R1 : TEMPReg< 1, "r1">, DwarfRegNum<[1]>;
def R2 : TEMPReg< 2, "r2">, DwarfRegNum<[2]>;
def R3 : TEMPReg< 3, "r3">, DwarfRegNum<[3]>;
def R4 : TEMPReg< 4, "r4">, DwarfRegNum<[4]>;
...
// System registers
def PC : TEMPReg< 12, "pc">, DwarfRegNum<[12]>;
def SP : TEMPReg< 13, "sp">, DwarfRegNum<[13]>;
def RETREG : TEMPReg< 14, "retreg">, DwarfRegNum<[14]>;
// branch registers
def PR0 : TEMPReg<1, "pr0">, DwarfRegNum<[22]>;
def PR1 : TEMPReg<2, "pr1">, DwarfRegNum<[23]>;
def PR2 : TEMPReg<3, "pr2">, DwarfRegNum<[34]>;
...
// class register
// class RegisterClass<string namespace, list<ValueType> regTypes, int alignment,
// dag regList, RegAltNameIndex idx = NoRegAltName>
// general purpose register file or GPR
def GPR : RegisterClass<"TEMP", [XLenVT], 32, (add
(sequence "R%u", #, #),
(sequence "R%u", #, #),
(sequence "R%u", #, #),
(sequence "R%u", #, #),
(sequence "R%u", #, #),
(sequence "R%u", #, #)
)> {
let RegInfos = RegInfoByHwMode<
[RV32, RV64, DefaultMode],
[RegInfo<32,32,32>, RegInfo<64,64,64>, RegInfo<32,32,32>]>;
}
def GRF : RegisterClass<"TEMP", [i32], 32, (sequence "R%u", 0, 23)>;
/** options - https://en.wikipedia.org/wiki/Register_file
* rename register file (RRF)
* architected register file (ARF)
* special register file (SRF)
* accumulator register (ACR)
* physical register file (PRF)
* system refgister file (SRF)
* predicate register file (PRF)
*/
```
* tablegen will generate `TEMPRegister.inc`
```inc
```
* `TEMP`RegisterInfo.cpp
* `TEMP`RegisterInfo.h
* LLVMBuild.txt
```txt=
[common]
subdirectories =
[component_0]
type = TargetGroup
name = TEMP
parent = Target
has_asmprinter = 1
has_disassembler = 1
[component_1]
type = Library
name = TEMPCodeGen
parent = TEMP
required_libraries = Analysis AsmPrinter CodeGen Core MC Scalar SelectionDAG Support Target GlobalISel TransformUtils
add_to_library_groups = TEMP
```
* CMakeLists.txt
* MCTargetDesc/`TEMT`MCTargetDesc.h