如何使用 LLVM 中的新通道管理器 运行 别名分析 (AAManager)

How to run alias analysis (AAManager) with the new pass manager in LLVM

我正在尝试在为 LLVM 中的新传递管理器编写的传递中使用别名分析。

  PreservedAnalyses run(Module &m, ModuleAnalysisManager &mam) {
    auto &aa = mam.getResult<AAManager>(m);

    analysis(aa, m);

    return PreservedAnalyses::all();
  }

在我的通行证中,我使用mam.getResult(这似乎等同于旧通行证的getAnalysis<AliasAnalysis>()),但是,通行证管理员要我先注册分析:

Assertion `AnalysisPasses.count(PassT::ID()) && "This analysis pass was not registered prior to being queried"' failed.

我找不到有关如何执行此操作的任何文档。我最接近解决方案的是邮件列表中的 this question,但回复并不是很有帮助。

如何注册分析通行证?

原来别名分析不能运行在模块通道中(这是一个功能级分析)。

来自 LLVM 的新 pass 管理器页面:

The analysis manager only provides analysis results for the same IR type as what the pass runs on. For example, a function pass receives an analysis manager that only provides function-level analyses.

解决方法:

  PreservedAnalyses run(Module &m, ModuleAnalysisManager &mam) {
    // Get the functional analysis manager from the module analysis manager
    // which has access to the function level analyses
    FunctionAnalysisManager &fam =
        mam.getResult<FunctionAnalysisManagerModuleProxy>(m).getManager();

    assert(not fam.empty());

    // Iterate over each function and get the Alias Analysis for that 
    // particular function
    for (auto fi = m.begin(); fi != m.end(); ++fi) {
      auto demangledName = demangleSym(fi->getName().str());
      auto &aam = fam.getResult<AAManager>(*fi);
      analyseFunc(aam, *fi);
    }
  }