【发布时间】:2019-10-21 15:06:35
【问题描述】:
我有一组使用 LLVM 创建的自定义通道,用于在某些位码上运行。
我已经设法让它编译,但每当我尝试使用在另一个传递类型上调用 getAnalysis() 的传递运行它时,它会失败:
Assertion `ResultPass && "getAnalysis*() called on an analysis that was not " "'required' by pass!"' failed.
调用getAnalysis() 的自定义通行证需要它的类型,特别是;
bool Operators::doInitialization(){
ParseConfig &parseConfig = getAnalysis<ParseConfig>(); // Fails here.
}
.
.
.
void Operators::getAnalysisUsage(AnalysisUsage &AU) const{
AU.addRequired<ParseConfig>();
return;
}
我在这上面花了几天时间,很迷茫。我知道以下是正确的:
- ParseConfig 已通过
RegisterPass<>模板成功注册,我在 GDB 中单步执行后发现它确实已注册。 - 同样使用 GDB,我发现在查看
getAnalysis()时,已注册通行证列表始终为空(这会导致断言)。
重要提示:我最终将在使用 Flang 编译的 Fortran 项目上使用它,因此我使用的 LLVM 库版本是 Flang fork (找到here)。那个 fork 就在 LLVM 7.1 附近,但与注册通行证相关的特定文件似乎与当前的 LLVM 库没有什么不同。
【问题讨论】: