【问题标题】:LLVM GetAnalysis() failing with required passesLLVM GetAnalysis() 失败并需要通过
【发布时间】:2019-10-21 15:06:35
【问题描述】:

我有一组使用 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&lt;&gt; 模板成功注册,我在 GDB 中单步执行后发现它确实已注册。
  • 同样使用 GDB,我发现在查看 getAnalysis() 时,已注册通行证列表始终为空(这会导致断言)。

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

【问题讨论】:

    标签: c++ llvm flang


    【解决方案1】:

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


    来自LLVM page

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

    【讨论】:

    • 我实际上是在几天前自己解决了这个问题。事实证明 doInitialization 在运行之前被所有其他传递调用,所以我试图对尚未运行的传递进行分析。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-23
    • 1970-01-01
    • 2013-03-15
    • 1970-01-01
    • 2018-09-16
    • 2012-02-19
    相关资源
    最近更新 更多