llvm编译器实战 第六章 后端

llvm编译器实战 第六章 后端

  • 1、LLVM 后端组织结构的概述
    • 代码生成器的不同阶段描述
      • (1)指令选择阶段:
      • (2)指令调度
      • (3)寄存器分配
      • (4)代码输出
    • 后端代码结构
    • 目标无关的代码生成器库
    • 指令选择阶段介绍
  • 2、如何解释描述后端的各种TableGen文件
  • 3、LLVM中的指令选择
  • 4、指令调度和寄存器分配
  • 5、代码输出
  • 6、如何自定义后端编译流程

不错的后端讲解

1、LLVM 后端组织结构的概述

llvm编译器实战 第六章 后端_第1张图片
llvm编译器实战 第六章 后端_第2张图片
上图是整个后端的流程图。从LLVM IR开始一直到生成Assembly或者是Object code,涵盖了LLVM后端的整个过程。

代码生成器的不同阶段描述

(1)指令选择阶段:

llvm编译器实战 第六章 后端_第3张图片

(2)指令调度

llvm编译器实战 第六章 后端_第4张图片

(3)寄存器分配

llvm编译器实战 第六章 后端_第5张图片

(4)代码输出

在这里插入图片描述
在这里插入图片描述

后端代码结构

lib目录及其子文件夹CodeGen、MC、TableGen和Target
llvm编译器实战 第六章 后端_第6张图片

目标无关的代码生成器库

llvm编译器实战 第六章 后端_第7张图片

指令选择阶段介绍

llvm编译器实战 第六章 后端_第8张图片
llvm编译器实战 第六章 后端_第9张图片
在这里插入图片描述

llvm编译器实战 第六章 后端_第10张图片
llvm编译器实战 第六章 后端_第11张图片

2、如何解释描述后端的各种TableGen文件

3、LLVM中的指令选择

4、指令调度和寄存器分配

llvm编译器实战 第六章 后端_第12张图片
从LLVM IR开始,直到Instruction selection环节的过程中的所有步骤,此图比较核心的部分,就是不断的和Target lowering不断的交互。这里涉及到了DAG中目标相关node和目标无关node。很多资料介绍后端的时候,在没生成Machine code instruction的时候,都叫平台无关或者目标无关,其实是不严谨的。从SelectionDAG nodes开始,已经开始有目标依赖的指令加入到DAG node。这也是Target lowering的主要作用,生成相关的目标依赖的指令。
llvm编译器实战 第六章 后端_第13张图片图3是Register allocation环节的内部流程,当然也包含了一个狭义的Register allocation环节。这里将包含了虚拟寄存器的MachineInstr最终转变为包含了物理寄存器的MachineInstr。

5、代码输出

llvm编译器实战 第六章 后端_第14张图片
图4表明了Code emission的整个过程。这个过程将MachineInst转化为MCInst,然后再根据需要转化为assembly或者是binary instruction(Object Code)。在这个过程之中,一个重点就是要明白MachineInst(MI)和MCInst的区别。MachineInst是Machine instructions,MCInst是machine code instructions。前者要比后者包含的信息更多一些,后者不光可以从后端生成,还可以通过binary code反汇编出来。

6、如何自定义后端编译流程

你可能感兴趣的:(llvm)