Plugins 为什么不是';调用的不是我的LLVM别名分析过程吗?

Plugins 为什么不是';调用的不是我的LLVM别名分析过程吗?,plugins,llvm,Plugins,Llvm,我正在尝试做一些别名分析和其他内存检查。我编写了一个无意义的别名分析过程(表示所有内容都必须使用别名),以尝试验证我的过程是否被opt拾取并运行 我运行opt时使用:opt-load~/Applications/llvm/lib/MustAA.so-must-aa-aa eval-debug

我正在尝试做一些别名分析和其他内存检查。我编写了一个无意义的别名分析过程(表示所有内容都必须使用别名),以尝试验证我的过程是否被opt拾取并运行

我运行opt时使用:
opt-load~/Applications/llvm/lib/MustAA.so-must-aa-aa eval-debug

我看到我的过程被初始化,但从未被调用(我只看到可能的别名结果)

关于如何调试这个有什么想法吗?或者我错过了什么?我通读了一遍,没有发现我遗漏了什么

以下是我通行证的完整源代码:

#define DEBUG_TYPE "must-aa"
#include "llvm/Pass.h"
#include "llvm/Analysis/AliasAnalysis.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Support/Debug.h"
using namespace llvm;

namespace {
struct EverythingMustAlias : public ImmutablePass, public AliasAnalysis {
  static char ID;
  EverythingMustAlias() : ImmutablePass(ID) {}

  virtual void *getAdjustedAnalysisPointer(AnalysisID ID) {
    errs() << "called getAdjustedAnalysisPointer with " << ID << "\n";
    if (ID == &AliasAnalysis::ID)
      return (AliasAnalysis*)this;
    return this;
  }

  virtual void initializePass() {
    DEBUG(dbgs() << "Initializing everything-must-alias\n");
    InitializeAliasAnalysis(this);
  }

  virtual void getAnalysisUsage(AnalysisUsage &AU) const {
    AliasAnalysis::getAnalysisUsage(AU);
    AU.setPreservesAll();
  }

  virtual AliasResult alias(const Location &LocA, const Location &LocB) {
    DEBUG(dbgs() << "Everything must alias!\n");
    return AliasAnalysis::MustAlias;
  }
};
}

namespace llvm {
void initializeEverythingMustAliasPass(PassRegistry &Registry);
}

char EverythingMustAlias::ID = 0;
static RegisterPass<EverythingMustAlias> A("must-aa", "Everything must alias");
INITIALIZE_AG_PASS(EverythingMustAlias, AliasAnalysis, "must-aa",
                   "Everything must alias", false, true, false)
请注意,当我的通行证返回时,
163可能会有别名响应

编辑:根据邮件列表上的建议,我添加了以下成员函数,因为我的pass使用多重继承。它似乎没有改变任何事情,也没有接到任何电话

virtual void *getAdjustedAnalysisPointer(AnalysisID ID) {
  errs() << "called getAdjustedAnalysisPointer with " << ID << "\n";
  if (ID == &AliasAnalysis::ID)
    return (AliasAnalysis*)this;
  return this;
}
virtualvoid*getAdjustedAnalysisPointer(分析ID){
errs()我更改了:

static RegisterPass<EverythingMustAlias> A("must-aa", "Everything must alias");
INITIALIZE_AG_PASS(EverythingMustAlias, AliasAnalysis, "must-aa",
                   "Everything must alias", false, true, false)
staticregisterpassa(“必须aa”,“一切都必须别名”);
初始化密码(所有内容都必须别名,别名分析,“必须aa”,
“一切都必须化名”,假,真,假)

staticregisterpassx(“必须aa”,“所有内容都必须别名”,false,true);
静态寄存器分析组Y(X);
显然,
INITIALIZE\u AG\u PASS
仅定义注册函数,因此仅对静态链接到LLVM可执行文件(或其他文件)的过程有用。
RegisterAnalysisGroup
在动态链接此模块时运行,以便随后注册

static RegisterPass<EverythingMustAlias> A("must-aa", "Everything must alias");
INITIALIZE_AG_PASS(EverythingMustAlias, AliasAnalysis, "must-aa",
                   "Everything must alias", false, true, false)
static RegisterPass<EverythingMustAlias> X("must-aa", "Everything must alias", false, true);
static RegisterAnalysisGroup<AliasAnalysis> Y(X);