0%

LLVM Pass编写及运行

Pass编写运行

编写Pass

  1. llvm/lib/Transforms/目录下新建文件夹,命名为MyPass

Pass1

  1. MyPass 文件夹下创建两个文件,分别为MyPass.cppCMakeLists.txt

image-20220102144652248

  1. 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
)
  1. 对Transforms/文件夹下面的CMakeLists.txt文件进行修改。

image-20220102145118378

编译生成.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
正在加载今日诗词....