为什么我的LLVM别名分析不会被调用?

时间:2014-04-25 17:40:01

标签: plugins llvm

我试图做一些别名分析&其他记忆检查。我已经写了一个毫无意义的AliasAnalysis通行证(说明一切都必须别名),以试图验证我的通行证是否已被取消&由opt运行。

我使用opt -load ~/Applications/llvm/lib/MustAA.so -must-aa -aa-eval -debug < trace0.ll -debug-pass=Structure

运行opt

我看到我的传递被初始化,但从未被调用(我看到只有别名结果)。

有关如何调试此操作的任何想法?或者我错过了什么?我通读了http://llvm.org/docs/AliasAnalysis.html并且没有看到任何我遗失的内容。

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

#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)

如上所述运行opt会产生:

Args: opt -load /home/moconnor/Applications/llvm/lib/MustAA.so -must-aa -aa-eval -debug -debug-pass=Structure 
WARNING: You're attempting to print out a bitcode file.
This is inadvisable as it may cause display problems. If
you REALLY want to taste LLVM bitcode first-hand, you
can force output with the `-f' option.

Subtarget features: SSELevel 8, 3DNowLevel 0, 64bit 1
Initializing everything-must-alias
Pass Arguments:  -targetlibinfo -datalayout -notti -basictti -x86tti -no-aa -must-aa -aa-eval -preverify -domtree -verify
Target Library Information
Data Layout
No target information
Target independent code generator's TTI
X86 Target Transform Info
No Alias Analysis (always returns 'may' alias)
Everything must alias
  ModulePass Manager
    FunctionPass Manager
      Exhaustive Alias Analysis Precision Evaluator
      Preliminary module verification
      Dominator Tree Construction
      Module Verifier
===== Alias Analysis Evaluator Report =====
  163 Total Alias Queries Performed
  0 no alias responses (0.0%)
  163 may alias responses (100.0%)
  0 partial alias responses (0.0%)
  0 must alias responses (0.0%)
  Alias Analysis Evaluator Pointer Alias Summary: 0%/100%/0%/0%
  168 Total ModRef Queries Performed
  0 no mod/ref responses (0.0%)
  0 mod responses (0.0%)
  0 ref responses (0.0%)
  168 mod & ref responses (100.0%)
  Alias Analysis Evaluator Mod/Ref Summary: 0%/0%/0%/100%

当我的传递返回163 may alias responses时,请注意MustAlias

编辑:根据邮件列表上的建议,我添加了以下成员函数,因为我的pass使用了多重继承。它似乎没有改变任何东西或被召唤。

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

1 个答案:

答案 0 :(得分:1)

我改变了:

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);

显然INITIALIZE_AG_PASS只定义了注册功能&amp;所以只对静态链接到LLVM可执行文件(或其他东西)的传递有用。 <{1}}在此模块动态链接时运行,然后进行注册。