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


我花了几天的时间,很失落。我知道以下事实:


通过RegisterPass<>模板成功注册了ParseConfig,我已经在GDB中逐步进行了查找,以发现它确实得到了注册。
同样使用GDB时,我发现在查看getAnalysis()时,已注册通行证的列表始终为空(这会导致断言)。


重要说明:最终,我将在用Flang编译的Fortran项目中使用它,因此我正在使用的LLVM库版本是Flang分支(找到here)。该分支就在LLVM 7.1左右,但是与注册通行证相关的特定文件似乎与当前LLVM库没有什么不同。

最佳答案

getAnalysis函数从doInitialization移到runOnFunction将使其起作用。



来自LLVM page


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

关于c++ - LLVM GetAnalysis()失败,并带有必需的通行证,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58489142/

10-15 16:55