失业在家闲来无事,不如写些教程回馈下社区。
如果你已经有一定基础,这里是建议您直接看 LLVM的加PASS的 官方文档。可能限制于自身经验以及专有名词语言的障碍,您可以看下我这篇文章,希望对您有所帮助,如果有不清楚的欢迎留言或查看官方文档。
本文以LLVM Release 15.0.7: Jan 2023 中的 AMDGPUResourceUsageAnalysisPass
为例,和你一起剖析他是怎么加进去的
一、什么是PASS
LLVM PASS是针对LLVM编译器基础设施的插件式组件,用于执行编译器优化或代码分析。
1、所有的LLVM PASS都是PASS的子类
我们 AMDGPUResourceUsageAnalysis
是这样定义的,llvm/lib/Target/AMDGPU/AMDGPUResourceUsageAnalysis.h:27,其继承于ModulePass
struct AMDGPUResourceUsageAnalysis : public ModulePass {
static char ID;
我们可以在 llvm/include/llvm/Pass.h:248 中看到其实基于 Pass的类
//===----------------------------------------------------------------------===//
/// ModulePass class - This class is used to implement unstructured
/// interprocedural optimizations and analyses. ModulePasses may do anything
/// they want to the program.
///
class ModulePass : public Pass {
public:
AMDGPUResourceUsageAnalysis 这个PASS是为了完成栈、寄存器等相关信息的计算,待到指令发射的时候用的。
ModulePass 是用于在整个编译单元(Module)级别执行优化和分析操作,作用于编译单元的中间表示(IR),而不是单个函数或基本块