Pass编写运行
编写Pass
- 在
llvm/lib/Transforms/
目录下新建文件夹,命名为MyPass
- 在
MyPass
文件夹下创建两个文件,分别为MyPass.cpp
、CMakeLists.txt
- 对
MyPass.cpp
以及CMakeLists.txt
文件进行编写。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| #MyPass.cpp #include "llvm/Pass.h" #include "llvm/IR/Function.h" #include "llvm/Support/raw_ostream.h"
#include "llvm/Analysis/LoopInfo.h"
using namespace llvm;
#define DEBUG_TYPE "hello"
namespace{ struct MyPass : public FunctionPass{ static char ID; MyPass() : FunctionPass(ID){}
bool runOnFunction(Function &F) override{ LoopInfo *LI = &getAnalysis<LoopInfoWrapperPass>().getLoopInfo(); errs()<<"Function "<<F.getName() << '\n'; for(Loop *L : *LI) countBlocksInLoop(L,0); return false; }
void countBlocksInLoop(Loop *L,unsigned nest){ unsigned num_Blocks=0; Loop::block_iterator bb; for(bb = L->block_begin();bb!=L->block_end();++bb) num_Blocks++; errs()<<"Loop level "<< nest <<"has"<<num_Blocks<<" blocks\n"; std::vector<Loop*> subLoops = L->getSubLoops(); Loop::iterator j,f; for(j = subLoops.begin(),f=subLoops.end();j!=f;++j) countBlocksInLoop(*j, nest+1); }
void getAnalysisUsage(AnalysisUsage &AU) const override{ AU.addRequired<LoopInfoWrapperPass>(); } }; }
char MyPass::ID=0; static RegisterPass<MyPass> X("MyPass","Function Block Count",false,false);
|
1 2 3 4 5 6
| #CMakeLists.txt cmake_minimum_required(VERSION 3.5)
add_llvm_loadable_module(MyPass MyPass.cpp )
|
- 对Transforms/文件夹下面的CMakeLists.txt文件进行修改。
编译生成.so文件
在llvm/build/
目录下面执行make
指令,则会编译生成动态链接库.so
文件,生成的文件在llvm/build/lib/
目录下面。
编写测试程序
编写.c
或.cpp
文件,然后用clang
工具对源程序进行编译,生成LLVM IR
中间代码。
运行Pass
通过调用测试程序运行Pass
1
| opt -load ../Desktop/llvm/build/lib/MyPass.so -MyPass -disable-output testPra.ll
|