Сбой 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)