获取函数参数的名称

时间:2018-05-23 12:56:26

标签: llvm

我正在创建一个LLVM传递,但我不明白:当我查看.ll文件时,函数的参数有一个名称:

call void @_ZNK2xi9spawnable9SpawnableIFvbdEEclEbd( %"class.xi::spawnable::Spawnable.0"* nonnull @_ZN2xi9spawnable2f2E, i1 zeroext %9, double %10)

所以这里的第一个参数名称似乎是_ZN2xi9spawnable2f2E

但是在我使用函数getName()的传递中,它返回一个空字符串。当我访问完整的参数时,我获得:%"class.xi::spawnable::Spawnable.0"* %1

我如何获得与.ll文件中相同的名称?

编辑:这是代码的一部分(我试图将其清理一下,所以可能有一些缺失的括号)

virtual bool runOnFunction(Function &F){
  LoopInfo &LI = getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
  std::string Name = demangle(F.getName ());     
  outs() << "Function "<< *(F.getFunctionType()) <<" " << Name << " {\n";
  for(LoopInfo::iterator i = LI.begin(), e = LI.end(); i!=e; ++i)
    BlocksInLoop (*i,0);
  for( Function::iterator b = F.begin() , be = F.end() ;b != be; ++b){
    for(BasicBlock::iterator i = b->begin() , ie = b->end();i != ie; ++i){
      if(isa<CallInst>(&(*i)) || isa<InvokeInst>(&(*i))){
        if (!(i->getMetadata("seen"))){
          Function * fct =NULL;
          if (isa<CallInst>(&(*i)))
            fct = cast<CallInst>(&(*i))->getCalledFunction();
          if (isa<InvokeInst>(&(*i)))
            fct = cast<InvokeInst>(&(*i))->getCalledFunction(); 
          if (fct){
            outs()<<"Call " << *(fct->getFunctionType()) <<" "<< demangle(fct->getName()) << "\n";
          for(Function::arg_iterator argi=fct->arg_begin(),arge=fct->arg_end(); argi!=arge;argi++ )
            outs()<< argi->getName()<<"\n";
          }
        }
      }
    }
  }
  outs() << "}\n";
  return(false);
};

1 个答案:

答案 0 :(得分:2)

您正在分析的不是呼叫站点,而是分析功能本身。当你查看一个函数时,你只有正式的参数,并且不知道那里传递了什么值。

不应调用->getCalledFunction()并迭代其args,而应迭代cast<CallInst>(&(*i))个操作数。请参阅->op_begin()value_op_begin()方法。