TargetPassConfig类是LLVM 后端添加pass入口,LLVM 框架将整个后端依次划分为指令选择、指令调度,寄存器分配等几个阶段,,如下图:
其中每个阶段包含有一个或者多个pass,LLVM后端一个重要的处理就是兼容性和模块化,为了对这些后端所加的pass进行管理,LLVM后端对上述几个比较重要的阶段封装成接口,而每个接口基本代表一个 重要阶段,每个target可以根据需要添加所需要pass,
TargetPassConfig该类为codegen中各个阶段提供了各个接口,提供主要接口如下:
接口 | 说明 |
addISelPasses | 添加所有必须的从llvm IR转成生成MI的pass |
addIRPasses | 添加对llvm IR->IR的优化pass |
addPassesToHandleExceptions | 添加较低级别的各种异常pass,这些pass主要处理CodeGen中产生的各种异常 |
addCodeGenPrepare | 在LLVM IR这个级别中添加CodeGen前准备的pass,这些pass此时还只处理IR,因此需要在addPassesToHandleExceptions之前添加 |
addISelPrepare | 添加指令选择前的一些优化IR的pass,这个阶段也处于IR阶段,还未转换成DAG,主要优化IR |
addInstSelector | 添加指令选择器selector以及必要pass |
addIRTranslator | 添加IR转换成机器码相关pass,调用关系时addIRTranslatoràaddInstSelector |
addMachinePasses | 添加一套CodeGen 标准所需要的pass |
addMachineSSAOptimization | SSA优化所需要添加pass |
addPreRegAlloc/addPostRegAlloc | 分别是寄存器分配前/后所需要添加pass |
addFastRegAlloc | 快速分配寄存器所需要添加pass |
addPassesToGenerateCode函数为添加CodeGen Pass总入口:
- /// addPassesToX helper drives creation and initialization of TargetPassConfig.
- static TargetPassConfig *
- addPassesToGenerateCode(LLVMTargetMachine &TM, PassManagerBase &PM,
- bool DisableVerify,
- MachineModuleInfoWrapperPass &MMIWP) {
- // Targets may override createPassConfig to provide a target-specific
- // subclass.
- TargetPassConfig *PassConfig = TM.createPassConfig(PM);
- // Set PassConfig options provided by TargetMachine.
- PassConfig->setDisableVerify(DisableVerify);
- PM.add(PassConfig);
- PM.add(&MMIWP);
-
- if (PassConfig->addISelPasses())
- return nullptr;
- PassConfig->addMachinePasses();
- PassConfig->setInitialized();
- return PassConfig;
- }
新写一个后端时,一个重要内容就是实现该target 所需要的添加pass, 以AMDGPU为例TargetPassConfig继承关系如下: