Я создаю проход 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);
};