如何使用 LLVM 中的新通道管理器 运行 别名分析 (AAManager)
How to run alias analysis (AAManager) with the new pass manager in LLVM
我正在尝试在为 LLVM 中的新传递管理器编写的传递中使用别名分析。
PreservedAnalyses run(Module &m, ModuleAnalysisManager &mam) {
auto &aa = mam.getResult<AAManager>(m);
analysis(aa, m);
return PreservedAnalyses::all();
}
在我的通行证中,我使用mam.getResult
(这似乎等同于旧通行证的getAnalysis<AliasAnalysis>()
),但是,通行证管理员要我先注册分析:
Assertion `AnalysisPasses.count(PassT::ID()) && "This analysis pass was not registered prior to being queried"' failed.
我找不到有关如何执行此操作的任何文档。我最接近解决方案的是邮件列表中的 this question,但回复并不是很有帮助。
如何注册分析通行证?
原来别名分析不能运行在模块通道中(这是一个功能级分析)。
来自 LLVM 的新 pass 管理器页面:
The analysis manager only provides analysis results for the same IR type as what the pass runs on. For example, a function pass receives an analysis manager that only provides function-level analyses.
解决方法:
PreservedAnalyses run(Module &m, ModuleAnalysisManager &mam) {
// Get the functional analysis manager from the module analysis manager
// which has access to the function level analyses
FunctionAnalysisManager &fam =
mam.getResult<FunctionAnalysisManagerModuleProxy>(m).getManager();
assert(not fam.empty());
// Iterate over each function and get the Alias Analysis for that
// particular function
for (auto fi = m.begin(); fi != m.end(); ++fi) {
auto demangledName = demangleSym(fi->getName().str());
auto &aam = fam.getResult<AAManager>(*fi);
analyseFunc(aam, *fi);
}
}
我正在尝试在为 LLVM 中的新传递管理器编写的传递中使用别名分析。
PreservedAnalyses run(Module &m, ModuleAnalysisManager &mam) {
auto &aa = mam.getResult<AAManager>(m);
analysis(aa, m);
return PreservedAnalyses::all();
}
在我的通行证中,我使用mam.getResult
(这似乎等同于旧通行证的getAnalysis<AliasAnalysis>()
),但是,通行证管理员要我先注册分析:
Assertion `AnalysisPasses.count(PassT::ID()) && "This analysis pass was not registered prior to being queried"' failed.
我找不到有关如何执行此操作的任何文档。我最接近解决方案的是邮件列表中的 this question,但回复并不是很有帮助。
如何注册分析通行证?
原来别名分析不能运行在模块通道中(这是一个功能级分析)。
来自 LLVM 的新 pass 管理器页面:
The analysis manager only provides analysis results for the same IR type as what the pass runs on. For example, a function pass receives an analysis manager that only provides function-level analyses.
解决方法:
PreservedAnalyses run(Module &m, ModuleAnalysisManager &mam) {
// Get the functional analysis manager from the module analysis manager
// which has access to the function level analyses
FunctionAnalysisManager &fam =
mam.getResult<FunctionAnalysisManagerModuleProxy>(m).getManager();
assert(not fam.empty());
// Iterate over each function and get the Alias Analysis for that
// particular function
for (auto fi = m.begin(); fi != m.end(); ++fi) {
auto demangledName = demangleSym(fi->getName().str());
auto &aam = fam.getResult<AAManager>(*fi);
analyseFunc(aam, *fi);
}
}