LLVM查缺补漏-1

本文深入探讨了LLVM框架的接口类,包括TargetMachine、TargetLowering和TargetRegisterInfo等,以及代码生成过程,如SelectionDAG、MachineInstr和MC层的工作原理。此外,还介绍了寄存器分配、活动区间分析和指令调度等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. include/llvm接口类定义
    1. /Target目标描述接口
      1. TargetMachineDataLayout,是必须要在一个确定的后端中实现的,但其他接口都是可选的
      2. 除了 DataLayout 以外,其他所有的目标描述类都需要作为基类被特定目标的描述类所继承,同时提供虚函数的实现。DataLayout 类是唯一必须依赖的目标描述类,而且不能被继承。
      3. TargetMachine 类提供了一些访问器(accessor),这些也同样需要在特定目标的描述类中实现,比如get*Info 方法,有 getInstrInfo、getRegisterInfo、getFrameInfo 等
      4. TargetLowering 类描述了 LLVM IR 代码如何 lowering 到 SelectionDAG 结构
      5. TargetRegisterInfo 类:寄存器在代码生成器中用无符号整形数字来表示,物理寄存器(真实存在于目标机器的寄存器)使用唯一的小整形数字,虚拟寄存器通常使用较大的值,需要说明,值 #0 被保留作为一个 flag value
      6. TargetInstrInfo 类
      7. TargetFrameLowering 类
      8. TargetSubtarget 类:一个 subtarget 会为代码生成器描述在特定芯片下支持的指令、指令延迟和指令执行行程(instruction execution itinerary,表示处理器单元怎么使用,以什么顺序使用以及使用多久
      9. TargetJITInfo 类
    2. /CodeGen代码生成
      1. SelectionDAG :提供了一种抽象的代码表示方式来通过自动化技术完成指令选择构建(比如基于动态编程的最优模式匹配选择器,dynamic-programming based optimal pattern matching selectors),合法化类型和合法化操作阶段负责将一个非法的 DAG 逐步转变为一个合法的 DAG。
        1. SDNode节点
          1. SDNode 最主要的内容是操作码(Opcode),操作码表示节点的一种操作。在 include/llvm/CodeGen/ISDOpcodes.h 文件中定义了很多节点操作码类型
          2. 虽然大多数操作都定义一个值,但 DAG 中的一个 SDNode 却可以定义多个值。比如,一个 div/rem 的组合操作
        2. SDValue
          1. SDNode节点的有向边,表示操作数
          2. 实际上是 <SDNode, unsigned> 的对,表示某个边(某个值)发出的节点和对应的值的结果。每个值都有一个关联的 MVT(Machine Value Type),表示值的类型。
        3. MVT值类型
          1. 两种不同的值类型:表示数据流和表示控制流依赖
          2. 控制
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值