У меня есть RegionPass, результаты анализа которого я хочу использовать в FunctionPass.
class RPass : public RegionPass{
bool runOnRegion(...) { ... };
}
class FPass : public FunctionPass {
bool runOnFunction(Function &F){
// Get a list of regions in the function
auto RI = &getAnalysis<RegionInfoPass>().getRegionInfo();
std::deque<Region *> RQ = getRegionList(RI->getTopLevelRegion());
for(Region *R : RQ){
/* In this step, I want to get the analysis results
* for the Region from the RPass */
RPass *RPI = &getAnalysis<RPass>(R);
...
}
}
void getAnalysisUsage(AnalysisUsage &AU){
AU.addRequired<RPass>();
...
AU.setPreservesAll();
}
}
К сожалению, доступны только следующие функции: getAnalysis () и getAnalysis (Function & F) .
* RPass RPI = & getAnalysis (); вызывает ошибку времени выполнения:
Assertion 'ResultPass && "getAnalysis*() called on an analysis that wa not " "'required' by pass!"' failed
и * RPass RPI = & getAnalysis (R); вызывает ошибку компиляции:
error: no matching function for call to 'FPass::getAnalysis(llvm::Region*&)
Есть идеи, как получить необходимую информацию? Документация по написанию пропусков LLVM ведет в тупик.