【问题标题】:How to run the Function Pass before the Module Pass in LLVM?如何在 LLVM 中的模块传递之前运行函数传递?
【发布时间】:2015-10-28 08:06:15
【问题描述】:

我正在 LLVM 上实现几个 Passes 以添加原始优化, 这些通行证基于FunctionPassModulePass。 现在,每个 Pass 都由相应的 opt 命令选项调用,即 由RegisterPass模板注册。

将来,我希望这些通行证仅由一个 opt 命令选项调用。 我的想法如下:

  • 首先,函数传递给运行,最后模块传递给运行。
  • 每个函数传递都使用前一个函数传递的分析信息。
  • 最终的 Module 传递,用于使用之前 Function 传递的结果构造一个新函数。
  • 所有这些 Passes 序列仅由一个 opt 命令选项调用,该选项指定最终的 Module pass。

我想我可以使用AnalysisUsage 类中的addRequired 方法来实现。 但是,它似乎不起作用:

  • 在Function pass中,几个Function pass的顺序可能是addRequired
  • 在函数pass 中,只能添加一个Module pass。
  • 在函数pass(X) 中,函数传递和模块传递不能同时为addRequired。 即使用选项X 执行opt 命令会导致锁定状态。
  • 在 Module pass 中,只有一个 Module pass 可能是addRequired
  • 在模块pass(Y)中,函数pass(Z)不能是addRequired。 即带有选项Yopt 命令只执行Y,而函数pass(Z) 被忽略。

我不熟悉通行证管理器机制。 任何人都可以帮助我如何在只有一个 opt 命令选项的模块传递之前运行函数传递?


执行案例如下图:-

$ 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


    【解决方案1】:

    我尝试使用 LLVM 3.8.1 模拟问题here

    我相信您的Function 通行证可以在这里运行:

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

    虽然getPassName 已被覆盖,但我不知道为什么它被标记为未命名。

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

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

    似乎如果依赖传递在一个小的 IR 单元上运行,而不是需要它的传递,则它需要显式执行。我可能弄错了,因为我还没有尝试使用FunctionPass 所需的BasicBlockPass

    【讨论】:

      猜你喜欢
      • 2019-04-29
      • 1970-01-01
      • 2012-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      相关资源
      最近更新 更多