本文是一篇译文,翻译自:
https://llvm.org/docs/CodeGenerator.html​llvm.org/docs/CodeGenerator.html
如有问题,敬请指出。
转载需注明出处,若需相关专业翻译服务,可联系我。


LLVM 目标描述的类 (存放在 include/llvm/Target/ 路径下)提供了一套抽象的针对任意后端机器通用的描述。这些类被设计来管理一些抽象的目标属性(比如指令和寄存器),并且不夹杂任何代码生成算法的片段。

除了 DataLayout 以外,其他所有的目标描述类都需要作为基类被特定目标的描述类所继承,同时提供虚函数的实现。为了便于实现, TargetMachine 类提供了一些访问器(accessor),这些也同样需要在特定目标的描述类中实现。

  1. LLVM 目标无关代码生成器 1:介绍
  2. LLVM 目标无关代码生成器 2:目标描述类
  3. LLVM 目标无关代码生成器 3:机器代码描述类
  4. LLVM 目标无关代码生成器 4:MC 层
  5. LLVM 目标无关代码生成器 5:目标无关代码生成算法
  6. LLVM 目标无关代码生成器 6:实现原生汇编器

2.1 TargetMachine 类

TargetMachine 类提供了一些虚函数用来访问与特定目标相关的访问器,被命名为 get*Info 方法,比如 getInstrInfogetRegisterInfogetFrameInfo 等。这个类需要被特定目标的类所继承,比如 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 方法。