LLVM的优化和转换工作就需要通过PASS来进行,就像下面这种图,PASS就像流水线上的操作工一样对中间代码IR进行优化,每个PASS完成特定的优化工作。
所有的pass都是llvm的Pass类的子类,通过重写继承的虚函数来实现特定的功能。根据pass不同的功能分类,继承的类也不同,比如:ModulePass , CallGraphSCCPass, FunctionPass , LoopPass, RegionPass, BasicBlockPass,llvm系统会根据实例的类别来判断pass的功能,然后将其整合到现有的优化体系中去。
FunctionPASS会遍历我们编译的每个函数,在遍历编译的函数过程中,在函数运行之前获取当前时间,在函数运行之后获取当前时间,二者相减,可以得到函数的运行时间。
待插入函数
my_fun_b是函数的最开始,插入并用于记录当前时间;
my_fun_e则是在函数的最末尾插入,用于记录当前时间并与之前函数开始记录的时间做差值,把函数名称和耗时打印出来。
可以通过hook objc_msgSend: