最终目的
- Name. 姓名
- Number of arguments (or * if variable). 参数数目
- Number of direct call sites in the same LLVM module (i.e. locations where this function is explicitly called, ignoring function pointers).
- Number of basic blocks. 基础块数量
- Number of instructions. 指令个数
实现效果 ↓
实现分析
基础代码。
1 |
|
这里我们继承的是 ModulePass
类。用于执行任何非结构化的过程间优化
经常用到的类有 都是 pass 类
的派生类
BasicBlockPass
类。用于实现本地优化,优化通常每次针对一个基本块或指令运行FunctionPass
类。用于全局优化,每次执行一个功能ModulePass
类。用于执行任何非结构化的过程间优化
我们可以在 pass.h 头文件中查看类的定义
里面定义了 virtual bool runOnModule(Module &M) = 0;
接口。
为了实现功能我们要 复写这个 接口
我们利用 runOnModule(Module &M)
能够得到我们 load 的文件的代码,通过stdin传入
Makefile
文件
1 | .PHONY : all clean run_ol build_ll |
测试
测试的代码 loop.c
可以不用定义头文件 和main 函数
1 | int g; |
说明 用的 runOnModule
函数得到的 参数值的类型是整个 ll文件的输入。 stdin
类型。
1 | errs() << M.getName() << "\n"; |
在给的 基础代码 依次 去除M中的 类型,传入 runOnFunction
函数。我们就可以通过这个 runOnFunction
函数实现答应我们的 每个方法的基础信息。
1 | virtual bool runOnModule(Module& M) { |
实现方法1
编写 runOnFunction
的代码
1 |
|
这里 Module
存储 Function
, Function
存储 BasicBlock
, BasicBlock
存储的 instruction
结构
这些类定义 在下面的头文件中
1 | llvm/IR/Function.h |
里面的 BasicBlock 可以通过查看 .ll 文件知道多少行代码。
实现效果
实现方法2
利用 printFunctionInfo
函数
稍微进行了修改。
1 | // Output the function information to standard out. |
其实和 调用 runOnFunction
基本一样的方法。 runOnFunction
我们可以直接获得 Function 指正。
实现效果
最终的 FunctionInfo Pass 的代码。
1 | // |
参考