写一个LLVM后端 :转换LLVM IR为目标平台的指令(汇编码/机器码-JIT)
英文原文:https://releases.llvm.org/8.0.0/docs/WritingAnLLVMBackend.html#id33
详细请看知乎翻译:https://zhuanlan.zhihu.com/p/149599651
个人简短笔记如下:
- 建立新后端的七大步骤
- 描述特定目标平台的属性
- TargetMachine.cpp
- 描述特定目标平台的寄存器
- TargetRegisterInfo.td:寄存器定义+寄存器别名+寄存器分类
- TargetRegisterInfo.cpp:寄存器分配和交互,include ”TargetGenRegisterInfo.inc”
- 描述特定目标平台的指令集
- TargetInstrFormats.td:指令格式
- TargetInstrInfo.td:指令定义
- TargetInstrInfo.cpp:
- LLVM IR从DAG到目标平台指令的选择和转换:指令选择
- TargetISelDAGToDAG.cpp:模式匹配+DAGToDAG指令选择
- TargetISelLowering.cpp:替换或删除目标平台不支持的数据和操作类型,即数据和操作合法化
- LLVM IR->GAS格式的汇编
- TargetAsmPrinter.cpp
- (可选)支持子目标平台,允许使用-mcpu=和-mattr=命令行选项
- TargetSubtarget.cpp
- (可选)JIT即时编译
- TargetJITInfo.cpp
- 描述特定目标平台的属性
- 目标机器
- getInstrInfo()
- getRegisterInfo()
- getFrameInfo():栈帧布局
- getDataLayout():数据布局(大小端序+数据类型+ABI对齐+首选对齐+