在 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
}
模块通过要求 DominatorTreeWrapperPass
或 MemoryDependenceAnalysis
等其他分析没有问题。但是,这种天真的实现可能不支持像 CGPassManager
那样对调用图进行修改。
我正在写一个 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
中请求 LoopPassCallGraphSCCPass 似乎是一种特殊情况,不能很好地支持所有分析。最简单的做法是将传递转换为 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
那样对调用图进行修改。