LLVM目标无关代码生成器(上)(译)
💡
原文中文,约8200字,阅读约需20分钟。
📝
内容提要
LLVM的代码生成器将LLVM IR翻译为特定目标机器的汇编指令,包括抽象目标机描述接口、目标机器代码的类、目标文件表示代码的类和算法、目标机描述的特定机器实现和目标无关的JIT组件。要增加后端,需要实现TargetMachine和DataLayout接口。代码生成器的高层设计包括指令选择、调度和生成序列化指令、基于SSA的机器代码优化、寄存器分配、插入prolog/epilog、晚期机器码优化和代码输出。机器描述使用TableGen语言描述。代码生成器还涉及寄存器、指令和堆栈布局的描述。机器码描述使用MachineInstr、MachineBasicBlock和MachineFunction类表示。MC层用于表示和处理原始机器码级别的代码,包括汇编器API、MCStreamer、MCContext、MCSymbol、MCSection和MCInst类。
🎯
关键要点
- LLVM的代码生成器将LLVM IR翻译为特定目标机器的汇编指令,包含多个组件。
- 后端开发人员需要实现TargetMachine和DataLayout接口以增加后端。
- 代码生成器的高层设计包括指令选择、调度、机器代码优化、寄存器分配等阶段。
- 机器描述使用TableGen语言来减少重复,并提供目标机器的抽象描述。
- TargetMachine类提供访问不同机器描述类的虚函数,DataLayout类描述目标机的内存布局。
- TargetRegisterInfo类描述目标机的寄存器集合及其相互作用。
- MachineInstr类表示机器指令,支持SSA形式和寄存器分配后的非SSA形式。
- MC层处理原始机器码级别的代码,涉及多个重要类如MCStreamer和MCContext。
- MCStreamer是汇编器API,负责生成.s或.o文件。
- MCInst类是机器无关指令的表示,包含特定机器的操作码和操作数。
➡️