我正在创建一个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);
};
答案 0 :(得分:2)
您正在分析的不是呼叫站点,而是分析功能本身。当你查看一个函数时,你只有正式的参数,并且不知道那里传递了什么值。
不应调用->getCalledFunction()
并迭代其args,而应迭代cast<CallInst>(&(*i))
个操作数。请参阅->op_begin()
和value_op_begin()
方法。