Сбой getAnalysis в цепочке ModulePassA->FunctionPassB->FunctionPassC

opt вылетает из-за следующей ошибки (изменил имя прохода в соответствии с примером):

include / llvm / PassAnalysisSupport.h: 213: AnalysisType & llvm:: Pass:: getAnalysisID (const void *) const [with AnalysisType = PassC]: утверждение `ResultPass && "getAnalysis*() вызвано для анализа, который не был " " " Требуется "мимо!"

PassB и C - проход анализа, унаследованный от functionPass. PassA - это модуль pass. Мой код похож на:

-------- PassA.cpp -----------

void PassA::getAnalysisUsage(AnalysisUsage &AU) const {
  AU.addRequired<PassB>();
}

void PassA::doSomething(Function &F){
     bool memDep = getAnalysis<PassB>(F).getDep();
}

bool PassA::runOnModule(Module &M){
  boo changed = false;
  for(Module::iterator fi = M.begin(); fi != M.end(); ++fi){
    if(!fi->isDeclaration()) {
      doSomething(*fi);
      changed = true;
    }
  }
  return changed;
}

-------- PassB.cpp ---------

void PassB::getAnalysisUsage(AnalysisUsage &AU) const {
  AU.addRequiredTransitive<PassC>();
  AU.setPreservedALL();
}

bool  PassB::runOnFunction(Function &F){
  CA = &getAnalysis<PassC>();
  doSomeThingElse();
  return false;
}

Я передал объект функции в модуле pass call в анализ и убедился, что F не является декларацией (так как это известная проблема из поиска Google)

0 ответов

Другие вопросы по тегам