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