环境配置
llvm版本4.0.0,使用官网的prebuilt binary安装
跟着llvm-cookbook的教程做了下,发现教程那种方法需要重新编译llvm源码
于是上网搜了下,找到一个repo llvm-pass-skeleton,可以在不重新编译全部源码的情况下生成Pass
FuncBlockCount Pass
Pass源码如下
1 | #include "llvm/Pass.h" |
编译出libFuncBlockCountPass. so
创建一个文件 sample.c
1 | int foo(int n,int m) { |
使用
1 | clang -O0 -S -emit-llvm sample.c -o sample.ll |
生成IR
然后用opt运行Pass,结果如下,输出函数名字
FuncBlockCount Pass v2
源码如下
这里提一下getAnalysisUsage这个函数,在llvm cookbook里面并没有提到,但是如果没有加这个函数的话,后面用opt跑的时候会报错
至于这个函数的作用,可以看【LLVM】Pass之间的依赖
1 | #include "llvm/Pass.h" |
修改sample.c源码为
1 | int main(int argc, char **argv) { |
使用
1 | clang –O0 –S –emit-llvm sample.c –o sample.ll |
来生成IR
输出的结果
opcodeCounter
源码如下
1 | #define DEBUG_TYPE "opcodeCounter" |
这个Pass是统计各个opcode的数量
测试代码 testcode.c
1 | int func(int a,int b){ |
运行结果