LLVM 目标无关代码生成器 2:目标描述类
本文是一篇译文,翻译自:
https://llvm.org/docs/CodeGenerator.htmlllvm.org/docs/CodeGenerator.html
如有问题,敬请指出。
转载需注明出处,若需相关专业翻译服务,可联系我。
LLVM 目标描述的类 (存放在 include/llvm/Target/ 路径下)提供了一套抽象的针对任意后端机器通用的描述。这些类被设计来管理一些抽象的目标属性(比如指令和寄存器),并且不夹杂任何代码生成算法的片段。
除了 DataLayout 以外,其他所有的目标描述类都需要作为基类被特定目标的描述类所继承,同时提供虚函数的实现。为了便于实现, TargetMachine 类提供了一些访问器(accessor),这些也同样需要在特定目标的描述类中实现。
- LLVM 目标无关代码生成器 1:介绍
- LLVM 目标无关代码生成器 2:目标描述类
- LLVM 目标无关代码生成器 3:机器代码描述类
- LLVM 目标无关代码生成器 4:MC 层
- LLVM 目标无关代码生成器 5:目标无关代码生成算法
- LLVM 目标无关代码生成器 6:实现原生汇编器
2.1 TargetMachine 类
TargetMachine 类提供了一些虚函数用来访问与特定目标相关的访问器,被命名为 get*Info 方法,比如 getInstrInfo、getRegisterInfo、getFrameInfo 等。这个类需要被特定目标的类所继承,比如 X86 中继承 TargetMachine 实现的 X86TargetMachine,其中需要实现各种虚函数。唯一必须依赖的类是 DataLayout,但是如果其他功能类也被使用的话,它们同样也需要被实现。
2.2 DataLayout 类
DataLayout 类是唯一必须依赖的目标描述类,而且不能被继承。 DataLayout 指定了一些与目标 layout 有关的信息,比如内存结构,各种数据类型的对齐要求,指针占用空间,大小端的要求。
2.3 TargetLowering 类
TargetLowering 类被 SelectionDAG 组件所使用,在指令选择器中发挥功能,它描述了 LLVM IR 代码如何 lowering 到 SelectionDAG 结构。另外,这个类还描述了以下信息:
- 一个使用不同 ValueType 的初始化寄存器类;
- 其操作数是目标机器原生支持的;
- 返回值支持 setcc 操作数;
- 用于移位的类型;
- 一系列高层的属性,比如是否需要将一个常数的除法转换为乘法操作。
2.4 TargetRegisterInfo 类
TargetRegisterInfo 类用于描述与目标相关的寄存器信息以及任何与寄存器的交互动作。
寄存器在代码生成器中用无符号整形数字来表示,物理寄存器(真实存在于目标机器的寄存器)使用唯一的小整形数字,虚拟寄存器通常使用较大的值,需要说明,值 #0 被保留作为一个 flag value。
每一个目标机器的寄存器都有一个 TargetRegisterDesc 的入口,会提供关于寄存器的文本描述(用于汇编输出和调试信息 dump)和一些别名(用于标识寄存器之间的相关性)。
除了对每个寄存器进行描述以外,TargetRegisterInfo 类还暴露了特定目标机器的寄存器类别(register class,是 TargetRegisterClass 的类)。每个寄存器类别是一些寄存器的集合(这些寄存器可能具有相同的属性,比如它们都是 32 位寄存器)。每一个由指令选择器创建的虚拟寄存器都需要属于一个寄存器类别。当运行寄存器分配器时,会将虚拟寄存器转换为满足同一寄存器类别下的物理寄存器。
这些类的实现是通过 tblgen 工具依据 TableGen 的寄存器描述文件来自动生成的。
2.5 TargetInstrInfo 类
TargetInstrInfo 类被用于描述特定目标支持的机器指令码。会描述指定对应的助记符和操作码、操作数的数量、隐式寄存器 uses 和 defs、一些目标无关的属性(比如指令是否访问内存、是否可交换)、以及维护目标平台的 flag。
2.6 TargetFrameLowering 类
TargetFrameLowering 类被用于提供一些目标栈帧相关的信息。比如栈的生长方向,进入函数的栈对齐要求和对局部数据的偏移。对局部数据的偏移是针对进入函数的栈指针的偏移,这里还存储一些处理函数的数据,如局部变量、 spill 位置等。
2.7 TargetSubtarget 类
TargetSubtarget 类被用于提供一些与目标特定芯片相关的信息。一个 subtarget 会为代码生成器描述在特定芯片下支持的指令、指令延迟和指令执行行程(instruction execution itinerary,表示处理器单元怎么使用,以什么顺序使用以及使用多久)。
2.8 TargetJITInfo 类
TargetJITInfo 类提供了一个抽象的接口,用于支持特定目标的 Just-In-Time 代码生成器的工作,比如发射 stubs。如果一个 TargetMachine 支持 JIT 代码生成,则它(TargetMachine)还需要为这个对象提供 getJITInfo 方法。
本文同步发布在知乎账号下:LLVM 目标无关代码生成器(第二章) - 知乎 (zhihu.com)











