LLVM GetAnalysis() 失败,需要通过

LLVM GetAnalysis() failing with required passes

本文关键字:失败 GetAnalysis LLVM      更新时间:2023-10-16

我有一组使用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 分支(可在此处找到(。该分支就在LLVM 7.1左右,但与注册通行证相关的特定文件似乎与当前的LLVM库没有什么不同。

getAnalysis函数从doInitialization移动到runOnFunction可以使其工作。


从 LLVM 页面

此方法调用getAnalysis*返回对所需传递的引用。如果您尝试获取未在 getAnalysisUsage 实现中声明为必需的分析,则可能会遇到运行时断言失败。此方法可以由 run* 方法实现调用,也可以由 run*方法调用的任何其他本地方法调用。