在 CallGraphSCCPass 中使用 DominatorTreeWrapperPass

Using DominatorTreeWrapperPass in CallGraphSCCPass

我正在写一个 CallGraphSCCPass,它需要每个函数的支配树信息。我的 getAnalysisUsage 相当简单:

virtual void getAnalysisUsage(AnalysisUsage& au) const override
{
    au.setPreservesAll();
    au.addRequired<DominatorTreeWrapperPass>();
}

通行证是这样注册的:

char MyPass::ID = 0;
static RegisterPass<MyPass> tmp("My Pass", "Do fancy analysis", true, true);

INITIALIZE_PASS_BEGIN(MyPass, "My Pass", "Do fancy analysis", true, true)
INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
INITIALIZE_PASS_END(MyPass, "My Pass", "Do fancy analysis", true, true)

当我尝试将我的通行证添加到 legacy::PassManager 时,它因以下错误消息而终止:

Unable to schedule 'Dominator Tree Construction' required by ‘My Pass'
Unable to schedule pass
UNREACHABLE executed at LegacyPassManager.cpp:1264!

我静态地link LLVM 到我的程序,并在我的程序中定义传递。

我做错了什么吗?要求 CallGraphSCCPass 中的 DominatorTreeWrapperPass 有意义吗?

我也发了关于LLVM ML的问题,但是现在服务器好像宕机了。

如果有任何不同,我使用的是 LLVM 3.7 主干,截至几周前是最新的。

CallGraphSCCPass 是一个 ModulePass,因此由 ModulePassManager 处理和调用,ModulePassManager 调用 FunctionPassManager(管理 FunctionPasses)并在调用 Module passes 后为其提供句柄(换句话说,ModulePasses 在 PassManager 管道中的 FunctionPasses 之前排队),因此当您在 ModulePass 中时,您不能向 PassManager 请求 functionPass,但您可以在 FunctionPass 中请求 ModulePass,因为他们已经有 运行。出于同样的原因,您不能在 FunctionPass

中请求 LoopPass

CallGraphSCCPass 似乎是一种特殊情况,不能很好地支持所有分析。最简单的做法是将传递转换为 ModulePass,并使用 <llvm/ADT/SCCIterator.h>runOnModule 构造调用图 SCC,就像 CGPassManager 的做法一样。

virtual void getAnalysisUsage(AnalysisUsage& au) const override
{
    au.addRequired<CallGraphWrapperPass>();
    // rest of your analysis usage here...
}

virtual bool runOnModule(Module& m) override
{
    CallGraph& cg = getAnalysis<CallGraphWrapperPass>().getCallGraph();

    scc_iterator<CallGraph*> cgSccIter = scc_begin(&cg);
    CallGraphSCC curSCC(&cgSccIter);
    while (!cgSccIter.isAtEnd())
    {
        const vector<CallGraphNode*>& nodeVec = *cgSccIter;
        curSCC.initialize(nodeVec.data(), nodeVec.data() + nodeVec.size());
        runOnSCC(curSCC);
        ++cgSccIter;
    }

    return false;
}

bool runOnSCC(CallGraphSCC& scc)
{
    // your stuff here
}

模块通过要求 DominatorTreeWrapperPassMemoryDependenceAnalysis 等其他分析没有问题。但是,这种天真的实现可能不支持像 CGPassManager 那样对调用图进行修改。