首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在LLVM中模块传递之前运行函数传递?

如何在LLVM中模块传递之前运行函数传递?
EN

Stack Overflow用户
提问于 2015-10-28 08:06:15
回答 1查看 2.6K关注 0票数 1

为了添加原始优化,我在LLVM上实现了几次传递,这些传递基于FunctionPassModulePass。现在,每一次传递都由相应的opt命令选项调用,该选项由RegisterPass模板注册。

将来,我只希望通过一个opt命令选项来调用这些传递。我的想法如下:

  • 首先,函数传递到运行,最后是模块传递到运行。
  • 每个函数通过使用前一个函数传递的分析信息。
  • 最后的模块传递来构造一个新的函数,使用前一个函数传递的结果。
  • 所有这些传递序列仅由一个opt命令选项调用,指定最后的Module。

我想我可以在addRequired类中使用AnalysisUsage方法实现它。然而,它似乎不起作用:

  • 在函数传递中,几个函数传递按顺序可以是addRequired
  • 在函数pass中,只有一个模块通行证可以是addRequired。
  • 在函数pass(X)中,函数传递和模块传递不能同时是addRequired。例如,带有选项Xopt命令执行会导致锁定状态。
  • 在模块传递中,只有一个模块通行证可以是addRequired
  • 在模块pass(Y)中,函数pass(Z)不能是addRequired。也就是说,带有选项Yopt命令只执行Y,而函数pass(Z)则被忽略。

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

执行案件如下:

代码语言:javascript
复制
$ 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

以上的源代码如下:

代码语言:javascript
复制
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);
EN

回答 1

Stack Overflow用户

发布于 2016-05-27 13:15:50

我尝试使用LLVM3.8.1模拟问题这里

我相信你的Function通行证会在这里运行:

代码语言:javascript
复制
Module Pass
  Unnamed pass: implement Pass::getPassName()

我不知道为什么它被标记为未命名,尽管getPassName太过了。

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

代码语言:javascript
复制
getAnalysis<tryFPass4>(f); // where f is the current Function operating on

如果依赖的pass在IR的一个小单位上运行,而不是需要它的pass,那么它似乎需要显式地执行。我可能弄错了,因为我还没有用FunctionPass所需的FunctionPass来尝试它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33385795

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档