c++ - LLVM 别名分析器奇怪的结果

标签 c++ pointers compiler-construction llvm

我正在实现一个使用别名分析器的 channel ,特别是使用 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 channel 运行插件,例如:

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 oi 是在不同的集合中(正确地)但是当我将行 i=NULL 更改为 i=o 在测试函数中,basicaa 仍然为 oi 返回单独的集合,globalsmodref 说 o 和 i 可能是别名,即使它应该是必须别名。那我在这里做错了什么?

最佳答案

我不认为AliasSet *s=dyn_cast<AliasSet>(it);是获得 AliasSet 的正确方法秒。请改用 getAliasSets() 方法,如下面的链接所示。

http://llvm.org/docs/doxygen/html/classllvm_1_1AliasSetTracker.html#a8f3b5f5d7978436b03d3e4b8597d9bc4

有区别吗?

关于c++ - LLVM 别名分析器奇怪的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16406118/

相关文章:

在文件范围内使用具有副作用的 C++ 函数,访问单例

C : scanf skips the first iteration while taking char* inputs from user through scanf

c++ - C++中的堆和指针

c++ - 使用 g++、bison 和 flex 进行编译时,yyparse() 中未定义对 `yylex' 的引用

c++ - 交叉编译器库交互(动态加载)(插件)

compiler-construction - DMD 与 GDC 与 LDC

c++ - 假人的高内存使用率

c++ - qt 执行昂贵的操作会破坏样式表

c++ - 用于 C++ 的 MySQL 连接器 | setSchema 上的 MySQL_Connection::setReadOnly() 异常

pointers - 在 Golang 中取消引用 map 索引