Table of Contents
1 Basic Steps for Writing an LLVM Backend
- Minial setup for Target Registration
- TargetMachine and Target Registration
- Register Info
- Instruction Info
- XXXISelDAGToDAG.cpp, XXXISelLowering.cpp for Instruction Selection
- AsmPrinter TargetAsmInfo
- TargetSubtarget for -mcpu=xxx and -mattr=xxx commandline options (Optional)
2 LLVM Backend Initializations
locations | names |
---|---|
RISCV/RISCVAsmPrinter.cpp:207 | LLVMInitializeRISCVAsmPrinter() |
RISCV/AsmParser/RISCVAsmParser.cpp:2449 | LLVMInitializeRISCVAsmParser() |
RISCV/RISCVTargetMachine.cpp:35 | LLVMInitializeRISCVTarget() |
RISCV/Disassembler/RISCVDisassembler.cpp:54 | LLVMInitializeRISCVDisassembler() |
RISCV/TargetInfo/RISCVTargetInfo.cpp:23 | LLVMInitializeRISCVTargetInfo() |
RISCV/MCTargetDesc/RISCVMCTargetDesc.cpp:140 | LLVMInitializeRISCVTargetMC() |
2.1 XXXAsmPrinter()
extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeRISCVAsmPrinter() { RegisterAsmPrinter<RISCVAsmPrinter> X(getTheRISCV32Target()); RegisterAsmPrinter<RISCVAsmPrinter> Y(getTheRISCV64Target()); }
2.2 XXXAsmParser()
extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeRISCVAsmParser() { RegisterMCAsmParser<RISCVAsmParser> X(getTheRISCV32Target()); RegisterMCAsmParser<RISCVAsmParser> Y(getTheRISCV64Target()); }
2.3 XXXTarget()
extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeRISCVTarget() { RegisterTargetMachine<RISCVTargetMachine> X(getTheRISCV32Target()); RegisterTargetMachine<RISCVTargetMachine> Y(getTheRISCV64Target()); auto PR = PassRegistry::getPassRegistry(); initializeGlobalISel(*PR); initializeRISCVExpandPseudoPass(*PR); }
2.4 XXXDisassembler()
extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeRISCVDisassembler() { // Register the disassembler for each target. TargetRegistry::RegisterMCDisassembler(getTheRISCV32Target(), createRISCVDisassembler); TargetRegistry::RegisterMCDisassembler(getTheRISCV64Target(), createRISCVDisassembler); }
2.5 XXXTargetInfo()
Target &llvm::getTheRISCV32Target() { static Target TheRISCV32Target; return TheRISCV32Target; }Target &llvm::getTheRISCV64Target() { static Target TheRISCV64Target; return TheRISCV64Target; }
extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeRISCVTargetInfo() { RegisterTarget<Triple::riscv32> X(getTheRISCV32Target(), "riscv32", "32-bit RISC-V", "RISCV"); RegisterTarget<Triple::riscv64> Y(getTheRISCV64Target(), "riscv64", "64-bit RISC-V", "RISCV"); }
2.6 XXXTargetMC()
extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeRISCVTargetMC() { for (Target *T : {&getTheRISCV32Target(), &getTheRISCV64Target()}) { TargetRegistry::RegisterMCAsmInfo(*T, createRISCVMCAsmInfo); TargetRegistry::RegisterMCInstrInfo(*T, createRISCVMCInstrInfo); TargetRegistry::RegisterMCRegInfo(*T, createRISCVMCRegisterInfo); TargetRegistry::RegisterMCAsmBackend(*T, createRISCVAsmBackend); TargetRegistry::RegisterMCCodeEmitter(*T, createRISCVMCCodeEmitter); TargetRegistry::RegisterMCInstPrinter(*T, createRISCVMCInstPrinter); TargetRegistry::RegisterMCSubtargetInfo(*T, createRISCVMCSubtargetInfo); TargetRegistry::RegisterObjectTargetStreamer(*T, createRISCVObjectTargetStreamer); TargetRegistry::RegisterMCInstrAnalysis(*T, createRISCVInstrAnalysis); // Register the asm target streamer. TargetRegistry::RegisterAsmTargetStreamer(*T, createRISCVAsmTargetStreamer); // Register the null target streamer. TargetRegistry::RegisterNullTargetStreamer(*T, createRISCVNullTargetStreamer); } }