c++ - 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;
}
我在这上面花了几天时间,我很迷茫。我知道以下是真的:
- ParseConfig 通过
RegisterPass<>
模板注册成功,我在 GDB 中单步执行,发现它确实被注册了。 - 同样使用 GDB,我发现在查看
getAnalysis()
已注册通行证列表时始终为空(这会导致断言)。
重要提示:我最终将在使用 Flang 编译的 Fortran 项目上使用它,因此我使用的 LLVM 库版本是 Flang fork(在此处找到)。那个 fork 就在 LLVM 7.1 附近,但是与注册通行证相关的特定文件似乎与当前的 LLVM 库没有什么不同。
解决方案
将getAnalysis
函数从doInitialization
to移动runOnFunction
会使其工作。
此方法调用getAnalysis*返回对所需通道的引用。如果您尝试获取未在 getAnalysisUsage 实现中按要求声明的分析,则可能会遇到运行时断言失败。此方法可以由您的run*方法实现调用,也可以由您的 run* 方法调用的任何其他本地方法调用。
推荐阅读
- sql-server - 如何过滤或拆分 CTE,以便在特定列中不添加相同值的 2 行
- c# - 为“ObservableCollection 不更新视图”给出的解决方案不起作用
- c# - Microsoft Graph SDK (C#) 组邮箱
- javascript - 从 ImageData 数组生成水平精灵图像
- python - 无法通过 pip install 下载 InstaPy python 模块
- reactjs - 基于会话存储或页面隐藏 React 元素
- python-3.x - 如何从 Exchange 2016 获取日历事件
- sqlite - 在单独文件的 main.dart 中使用 SQLite?
- c++ - 使用 eBPF 拦截 Linux 上的所有传出/传入流量
- r - 获取R中向量中重复值的第一个元素的索引