我正在写一个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/