如何在模块通过LLVM之前运行函数通过?

我在LLVM上实现了几个通道,以便添加原始优化,这些通道基于FunctionPass和ModulePass。 现在,每个Pass都由RegisterPass模板注册的相应opt命令选项调用。

将来,我希望通过一个opt命令选项来调用这些Passes。 我的想法如下: - 首先,函数传递运行,最后模块通过运行。 - 每个函数传递使用前一个函数传递的分析信息。 - 最后一个模块通过构造一个使用前一个函数的新函数传递结果。 - 所有这些Passes序列仅由一个指定最终模块通过的opt命令选项调用。

我想我可以使用AnalysisUsage类中的addRequired方法来完成它。 但是,它似乎不起作用: - 在函数过程中,几个函数过程可能是顺序中的addRequired。 - 在函数过程中,只有一个模块过程可以是addRequired。 - 在函数过程(X)中,函数过程和模块过程不能同时添加。 即使用选项X执行选择命令执行会导致锁定状态。 - 在模块过程中,只有一个模块过程可能是addRequired。 - 在模块通过(Y)中,功能通过(Z)不能被addRequired。 即带有选项Y的opt命令只执行Y,并忽略函数传递(Z)。

我对Pass管理机制并不熟悉。 任何人只需要一个opt命令选项就可以帮助我如何在Module pass之前运行Function pass?


执行情况如下所示: -

$ opt -stats -load ~/samples/tryPass4.so -MPass4 hello2.ll -S -o tryPass4.ll -debug-pass=Structure
Pass Arguments:  -targetlibinfo -datalayout -notti -basictti -x86tti -MPass4 -verify -verify-di -print-module
Target Library Information                                              ↑
Data Layout                              -FPass4 doesn't appear here
No target information
Target independent code generator's TTI
X86 Target Transform Info
  ModulePass Manager
    Module Pass
      Unnamed pass: implement Pass::getPassName()
    FunctionPass Manager
      Module Verifier
    Debug Info Verifier
    Print module to stderr
Pass Arguments:  -FPass4    <- here -FPass4 appears, but not executed
  FunctionPass Manager
    Function Pass


 ***** Module Name : hello2.ll  <- output from the Module pass

上面的源代码如下: -

using namespace llvm;
namespace{
 class tryFPass4 : public FunctionPass { 
   public :
    static char ID;
    tryFPass4() : FunctionPass(ID){}
    ~tryFPass4(){}
    virtual bool runOnFunction(llvm::Function &F);
    virtual void getAnalysisUsage(llvm::AnalysisUsage &AU) const;
 };
 class tryMPass4 : public ModulePass { 
   public :
    static char ID;
    tryMPass4() : ModulePass(ID){}
    ~tryMPass4(){}
    virtual bool runOnModule(llvm::Module &M);
    virtual void getAnalysisUsage(llvm::AnalysisUsage &AU) const;
 };
}
bool tryFPass4::runOnFunction(Function &F) {
  bool change = false;
   ....  
  return change;
}
bool tryMPass4::runOnModule(Module &M) {
  bool change = false ;
   ....
  return change;
}

void tryFPass4::getAnalysisUsage(AnalysisUsage &AU) const {
  AU.setPreservesCFG(); 
}

void tryMPass4::getAnalysisUsage(AnalysisUsage &AU) const {
  AU.setPreservesCFG();
  AU.addRequired<tryFPass4>();
}
char tryFPass4::ID = 0;
static RegisterPass<tryFPass4> X("FPass4", "Function Pass", false, false);

char tryMPass4::ID = 0;
static RegisterPass<tryMPass4> Y("MPass4", "Module Pass", false, false);

我试图用LLVM 3.8.1模拟这个问题。

我相信你的Function传递可以在这里运行:

Module Pass
  Unnamed pass: implement Pass::getPassName()

我不知道为什么它被标记为未命名,但getPassName被重写。

您需要注意的一个细节是,为了使函数传递实际执行其runOnFunction方法,您需要调用Function & getAnalysis特定方法,如下所示:

getAnalysis<tryFPass4>(f); // where f is the current Function operating on

看起来,如果依赖通行证在一小部分IR上运行,而不是需要通行证的通行证,则需要明确执行。 因为我还没有与试了一下,我可能是错误BasicBlockPass通过所需的FunctionPass

链接地址: http://www.djcxy.com/p/68695.html

上一篇: How to run the Function Pass before the Module Pass in LLVM?

下一篇: Replace all uses of an instruction to delete with an Undef value at llvm?