我正在写一个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时,它死于以下错误消息:



我将LLVM静态链接到程序,并在程序中定义传递。

难道我做错了什么?从DominatorTreeWrapperPass中要求CallGraphSCCPass是否有意义?

我还在LLVM ML上发送了问题,但服务器目前已关闭。

如果有什么不同,我使用的是几周前最新的LLVM 3.7干线。

最佳答案

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
}

模块通行证不需要DominatorTreeWrapperPass或其他分析(例如MemoryDependenceAnalysis)都没有问题。但是,这种幼稚的实现可能不像CGPassManager那样支持对调用图的修改。

关于c++ - 在CallGraphSCCPass中使用DominatorTreeWrapperPass,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30059622/

10-11 18:13