LLVM backend

  后台处理流程如下:

  

  图中灰色矩形代表的操作也被称为superpass——其内部实现也是更小的pass,对于后台的成功执行十分重要;而白色矩形中的pass则主要为了提高代码的效率。

  1. 指令选择(Instruction Selection)
      将IR从三地址机构转化为有向无环图(DAG),每个DAG都代表一个基本块(basic block),通常节点代表指令,边代表数据流。指令选择阶段完成后,DAG的节点都被转化为目标结构的指令节点。
  2. 指令调度I(Instruction Schedule I)
      指令选择阶段过后,目标指令都保存在SelectionDAG类中,但是无法判断DAG中没有依赖关系的节点的先后顺序,因此还需要返回三地址结构的状态。指令调度I又被称为寄存器分配前调度(Pre-register Allocation Scheduling),尽可能的进行指令级的并行。指令调度I完成后,指令都被转化为三地址的结构——MachineInstr。
  3. 寄存器分配(Register Allocation)
      IR有无数个寄存器,寄存器分配阶段将IR中的虚拟寄存器替换为目标平台的寄存器。
  4. 指令调度II(Instruction Schedule II)
      指令调度II也被称作寄存器分配后调度(Post-register Allocation Scheduling),经过寄存器分配阶段真实寄存器对虚拟寄存器的替换,与物理寄存器相关的一些改进可以用来减少危险。
  5. 代码发布(Code Emission)
      代码发布阶段将指令从MachineInstr转化为MCInst,方便编译器和链接器的后续工作。

  llc是后台的主要工具,相关命令如下:

$ llc test.bc -o test.s
$ llc test.bc -filetype=obj -o test.o
$ llc -march=mips -filetype=obj test.bc -o test.o

  与后台相关的代码都在lib目录下以及其子目录CodeGen,MC,TableGen,Target。其中CodeGen包含指令选择,调度器,寄存器分配;MC包含汇编器和反汇编器,以及ELF等文件的定义;TableGen包含TableGen工具的实现——用来从.td文件生成C++代码;Target包含每个目标机器的.cpp,.h,.td文件。这些文件说明如下(以SPARC为例):  

FileName Description
SparcInstrInfo.tdInstruction and format definitions.
SparcInstrFormats.td 
SparcRegisterInfo.tdRegisters and register classes definitions
SparcSelDAGToDAG.cppInstruction selection
SparcSelLowering.cpp SelectionDAG node lowering
SparcTargetMachine.cppInformation about target-specific properties such as the data layout and the ABI
Sparc.tdDefinition of machine features, CPU variations and extension features
SparcAsmPrinter.cpp

Assembly code emission

SparcCallingConv.td

ABI-defined calling conventions

CodeGen

指令选择(Instruction Selection)

  指令选择阶段把LLVM IR转化为SelectionDAG节点(SDNode)——首先把IR转化为目标无关的SDNode,然后进行DAG-to-DAG转化,将SDNode转化为目标相关的SDNode。

   可以查看DAG的llc选项:

The llc optionPhase
-view-dag-combine1-dagsBefore DAG combine 1
-view-legalize-types-dagsBefore legalize type
-view-dag-combine-lt-dagsAfter legalize type 2 and before DAG combine
-view-legalize-dagsBefore legalization
-view-dag-combine2-dagsBefore DAG combine 2
-view-isel-dagsBefore instruction selection
-view-sched-dagsAfter instruction selection and before scheduling 

调度器(Scheduler)

  

转载于:https://www.cnblogs.com/adera/p/7484555.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值