Получить имя аргумента функции - PullRequest
0 голосов
/ 23 мая 2018

Я создаю проход 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 голосов
/ 23 мая 2018

Вы анализируете не сайт вызова, а саму функцию.Когда вы смотрите на функцию, у вас есть только формальные параметры, и вы не можете знать, какие значения передаются туда.

Вместо того, чтобы вызывать ->getCalledFunction() и перебирать его аргументы, вы должны перебирать cast<CallInst>(&(*i)) операндов.См. ->op_begin() и value_op_begin() методы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...