首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >LLVM GetAnalysis()与所需的通行证失败

LLVM GetAnalysis()与所需的通行证失败
EN

Stack Overflow用户
提问于 2019-10-21 15:06:35
回答 1查看 598关注 0票数 0

我使用LLVM创建了一组自定义的passes,用于在某些bitcode上运行。我已经成功地让它编译了,但是每当我尝试使用对另一个pass调用getAnalysis()的pass来运行它时,它就会失败:

代码语言:javascript
运行
复制
Assertion `ResultPass && "getAnalysis*() called on an analysis that was not " "'required' by pass!"' failed.

调用getAnalysis()的自定义传递要求它的类型,特别是;

代码语言:javascript
运行
复制
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附近,但是与注册passes相关的特定文件似乎与当前的LLVM库没有什么不同。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-29 15:33:34

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

来自LLVM页面

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58489142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档