llvm编译器实战 第六章 后端
1、LLVM 后端组织结构的概述
上图是整个后端的流程图。从LLVM IR开始一直到生成Assembly或者是Object code,涵盖了LLVM后端的整个过程。
代码生成器的不同阶段描述
(1)指令选择阶段:
(2)指令调度
(3)寄存器分配
(4)代码输出
后端代码结构
lib目录及其子文件夹CodeGen、MC、TableGen和Target
目标无关的代码生成器库
指令选择阶段介绍
2、如何解释描述后端的各种TableGen文件
3、LLVM中的指令选择
4、指令调度和寄存器分配
从LLVM IR开始,直到Instruction selection环节的过程中的所有步骤,此图比较核心的部分,就是不断的和Target lowering不断的交互。这里涉及到了DAG中目标相关node和目标无关node。很多资料介绍后端的时候,在没生成Machine code instruction的时候,都叫平台无关或者目标无关,其实是不严谨的。从SelectionDAG nodes开始,已经开始有目标依赖的指令加入到DAG node。这也是Target lowering的主要作用,生成相关的目标依赖的指令。
图3是Register allocation环节的内部流程,当然也包含了一个狭义的Register allocation环节。这里将包含了虚拟寄存器的MachineInstr最终转变为包含了物理寄存器的MachineInstr。
5、代码输出
图4表明了Code emission的整个过程。这个过程将MachineInst转化为MCInst,然后再根据需要转化为assembly或者是binary instruction(Object Code)。在这个过程之中,一个重点就是要明白MachineInst(MI)和MCInst的区别。MachineInst是Machine instructions,MCInst是machine code instructions。前者要比后者包含的信息更多一些,后者不光可以从后端生成,还可以通过binary code反汇编出来。