LLVM--如何在代码中调用遍(Pass)

来源:互联网 发布:mac虚拟机pd12破解版 编辑:程序博客网 时间:2024/05/16 17:41

本文介绍三种调用遍(Pass)的方法

一、直接调用

如果要调用的遍没有依赖其他的遍,我们可以直接调用,如可以使用如下方法调用函数遍(FunctionPass) DominatorTree。

     DominatorTree*T=new DominatorTree();     T->runOnFunction(*F);     T->print(errs());

二、使用遍管理器

如果我们要调用的遍中依赖其他遍,我们可以使用PassManager或者FunctionPassManager调用。

如我们可以使用PassManager调用模块编,使用FunctionPassManager调用函数遍和基本块(basic block pass)。

具体见include/llvm/PassManager.h

Module* M;...PassManager pm; pm.add(new ModulePass1);pm.run(*M)

三、使用getAnalysisUsage

调用在llvm中已经注册的遍。但是我们的编写的类必须也是一个遍。

namespace {  struct Mypass : public FunctionPass {     static char ID;    Mypass() : FunctionPass(ID) { }     virtual void getAnalysisUsage(AnalysisUsage &AU) const {      AU.addRequired<DominatorTree>();    }    virtual bool runOnFunction(Function &F) {      DominatorTree& DT = getAnalysis<DominatorTree>(F);      return false;    }  };}char Mypass::ID = 0;static RegisterPass<Mypass> X("mypass", "My test analysis", true, true);

四、参考

http://stackoverflow.com/questions/14799127/llvm-pass-segfaults-on-getanalysisdominatortree
0 0