【问题标题】:LLVM Pass segfaults on getAnalysis<DominatorTree>()LLVM 在 getAnalysis<DominatorTree>() 上传递段错误
【发布时间】:2013-02-10 15:09:34
【问题描述】:

我正在尝试为需要支配树的 LLVM 3.2 优化器构建通行证。这应该很容易通过从 PassManager 请求DominatorTree 分析结果来实现,但即使是这个简单的示例也会崩溃。

我做错了什么?

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);

调用时

opt --load mypass.so -mypass --debug-pass=Structure test.bc

它立即出现段错误

Pass Arguments:  -targetlibinfo -datalayout -domtree -mypass -preverify -domtree -verify
Target Library Information
Data Layout
  ModulePass Manager
    FunctionPass Manager
      Dominator Tree Construction
      My test analysis
      Preliminary module verification
      Dominator Tree Construction
      Module Verifier
0  libLLVM-3.2.so.1 0x00007f2d8172a1df
1  libLLVM-3.2.so.1 0x00007f2d8172a649
2  libpthread.so.0  0x00007f2d80842bd0
3  mypass.so      0x00007f2d7f63deb9 llvm::DominatorTree& llvm::Pass::getAnalysisID<llvm::DominatorTree>(void const*, llvm::Function&) + 217
4  mypass.so      0x00007f2d7f63ddce llvm::DominatorTree& llvm::Pass::getAnalysis<llvm::DominatorTree>(llvm::Function&) + 94
5  mypass.so      0x00007f2d7f63dc38
6  libLLVM-3.2.so.1 0x00007f2d811e0e3f llvm::FPPassManager::runOnFunction(llvm::Function&) + 575
7  libLLVM-3.2.so.1 0x00007f2d811e0e83 llvm::FPPassManager::runOnModule(llvm::Module&) + 51
8  libLLVM-3.2.so.1 0x00007f2d811e0ba4 llvm::MPPassManager::runOnModule(llvm::Module&) + 484
9  libLLVM-3.2.so.1 0x00007f2d811e44bb llvm::PassManagerImpl::run(llvm::Module&) + 107
10 opt              0x000000000040d606 main + 4230
11 libc.so.6        0x00007f2d80189ea5 __libc_start_main + 245
12 opt              0x000000000040db41
Stack dump:
0.  Program arguments: opt --load mypass.so -mypass --debug-pass=Structure 
1.  Running pass 'Function Pass Manager' on module '<stdin>'.
2.  Running pass 'My test analysis' on function '@const_expr'
Segmentation fault (core dumped)

【问题讨论】:

    标签: segmentation-fault llvm


    【解决方案1】:

    DominatorTree&amp; DT = getAnalysis&lt;DominatorTree&gt;(F); 更改为DominatorTree&amp; DT = getAnalysis&lt;DominatorTree&gt;(); 似乎可行。

    【讨论】:

    • 是的,这似乎有效!但是我仍然感到困惑,因为llvm.org/docs/… 中的示例调用了带有参数的方法...
    • 如教程所说:“一个模块级通行证可以通过这个接口使用函数级分析信息”;你的pass是FunctionPass,参数化的方法是ModulePass,由于dominatorTree是函数相关的分析,你可以直接在你的FunctionPass中使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-23
    • 1970-01-01
    • 2018-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多