我正在实现一个使用别名分析器的传递,特别是使用AliasSetTracker。我只想在函数中输出所有别名集。
密码非常简单,它在函数上运行,就像这样:
virtual bool runOnFunction(Function &F) {
AliasAnalysis &AA = getAnalysis<AliasAnalysis>();
AliasSetTracker tr(AA);
for(Function::iterator i=F.begin();i!=F.end();++i){
for(BasicBlock::iterator j=i->begin();j!=i->end();++j){
if(dyn_cast<StoreInst>(j)){
StoreInst *ai=dyn_cast<StoreInst>(j);
//errs().write_escaped(ai->getName());
tr.add(ai);
}
if(dyn_cast<LoadInst>(j)){
LoadInst *ai=dyn_cast<LoadInst>(j);
//errs().write_escaped(ai->getName());
tr.add(ai);
}
}
int counter=0;
for(AliasSetTracker::iterator it=tr.begin();it!=tr.end();++it){
errs() << "Set " << counter++ << "\n";
AliasSet *s=dyn_cast<AliasSet>(it);
if(s->isMustAlias())
errs() << " set is must alias\n";
if(s->isMayAlias())
errs() << " set is may alias\n";
for(AliasSet::iterator ra=s->begin();ra!=s->end();++ra){
errs() << ra.getPointer()->getName() << " ";
}
}
}
return true;
}
我使用hello.cpp中的以下测试函数实现测试传递:
void testfuncion(int *given){
int *o,*i;
o=given;
i=NULL;
}
我使用不同的AA通道运行插件,例如:
clang -emit-llvm -o hello.bc -c hello.cpp -> compile the test code
./opt -load ../lib/AliasTest.so -globalsmodref-aa -aliastoprolog < hello.bc OR
./opt -load ../lib/AliasTest.so -basicaa -aliastoprolog < hello.bc
在测试函数中,您可以看到i和o不是别名。使用globalsmodref,传递打印可能是别名。 使用basicaa o 和 i 处于不同的集合中(正确)但是当我将行 i = NULL 更改为 i = o <时/ em>在测试函数中,basicaa仍为 o 和 i 返回单独的集合,globalsmodref表示o和i可能是别名,即使它必须是别名。那么我在这里做错了什么?
答案 0 :(得分:0)
我不认为AliasSet *s=dyn_cast<AliasSet>(it);
是获取AliasSet
的正确方法。请改用getAliasSets()方法,如下面的链接所示。
它有所作为吗?