pass们组合在一起,处理IR
而最后的目标代码生成阶段,会生成另一种MIR(Machine IR)
PassManager管理这些pass
pass处理IR之后会改变分析的情况,这些关于IR的信息由 AnalysisManager处理
1、pass
(1)转换pass
比如我们试图给指针变量加上noalias属性
这里返回的是一个分析
(2)分析pass
分析pass返回的也是分析,但是它不改变IR
也就是不管是分析pass还是转换pass,都要返回一个PreservedAnalyses更新最新的信息。
2、分析工具
Printing Pass pipeline details
clang -O0 -Xclang -disable-O0-optnone -emit-llvm -S test.c
-Xclang是传递想要的参数给前端
-disable-O0-optnone
标志用于在编译时告诉 Clang 或 LLVM 编译器即使在 -O0
优化级别也不要自动为每个函数添加 optnone
属性,允许一定程度的优化发生,尽管这些优化仍然会比其他优化级别如 -O1
, -O2
, -O3
或 -Os
来得少。
-emit-llvm
: 这是告诉编译器生成LLVM中间表示(IR)的选项。LLVM IR是一种高级的、与平台无关的汇编语言,可以被LLVM后端编译为特定目标平台的机器代码。
-S
: 这是告诉编译器生成汇编代码的选项。当结合-emit-llvm
选项使用时,它将生成LLVM IR的文本表示。
之后对生成的.ll使用如下命令
opt -O2 --disable-output --debug-pass-manager test.ll
综上所述,——debug-pass-manager是一个有用的工具,可以查看Pass管道在某个优化级别上运行的Pass及其顺序。了解这些信息可以让您大致了解pass和分析如何与输入IR交互。】
Printing changes to the IR after each Pass
opt -O2 --disable-output --print-changed ./test.ll
可以打印出经过pass之后改变的IR
也可以针对指定的函数或者一组特点的pass来看
可以只运行前几个管道