首页 > 解决方案 > LLVM GetAnalysis() 失败并需要通过

问题描述

我有一组使用 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;
}

我在这上面花了几天时间,我很迷茫。我知道以下是真的:

重要提示:我最终将在使用 Flang 编译的 Fortran 项目上使用它,因此我使用的 LLVM 库版本是 Flang fork(在此处找到)。那个 fork 就在 LLVM 7.1 附近,但是与注册通行证相关的特定文件似乎与当前的 LLVM 库没有什么不同。

标签: c++llvmflang

解决方案


getAnalysis函数从doInitializationto移动runOnFunction会使其工作。


LLVM 页面

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


推荐阅读