从零开始教你写一个LLVM PASS

发布时间 2023-08-18 14:46:46作者: 暴力都不会的蒟蒻

失业在家闲来无事,不如写些教程回馈下社区。
如果你已经有一定基础,这里是建议您直接看 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),而不是单个函数或基本块