-PreservedAnalyses ModulePassManager::run(Module *M) {
- PreservedAnalyses PA = PreservedAnalyses::all();
- for (unsigned Idx = 0, Size = Passes.size(); Idx != Size; ++Idx) {
- PreservedAnalyses PassPA = Passes[Idx]->run(M);
- if (AM)
- AM->invalidate(M, PassPA);
- PA.intersect(llvm_move(PassPA));
- }
- return PA;
-}
-
-void ModuleAnalysisManager::invalidate(Module *M, const PreservedAnalyses &PA) {
- // FIXME: This is a total hack based on the fact that erasure doesn't
- // invalidate iteration for DenseMap.
- for (ModuleAnalysisResultMapT::iterator I = ModuleAnalysisResults.begin(),
- E = ModuleAnalysisResults.end();
- I != E; ++I)
- if (!PA.preserved(I->first) && I->second->invalidate(M))
- ModuleAnalysisResults.erase(I);
-}
-
-const detail::AnalysisResultConcept<Module> &
-ModuleAnalysisManager::getResultImpl(void *PassID, Module *M) {
- ModuleAnalysisResultMapT::iterator RI;
- bool Inserted;
- llvm::tie(RI, Inserted) = ModuleAnalysisResults.insert(std::make_pair(
- PassID, polymorphic_ptr<detail::AnalysisResultConcept<Module> >()));
-
- if (Inserted) {
- // We don't have a cached result for this result. Look up the pass and run
- // it to produce a result, which we then add to the cache.
- ModuleAnalysisPassMapT::const_iterator PI =
- ModuleAnalysisPasses.find(PassID);
- assert(PI != ModuleAnalysisPasses.end() &&
- "Analysis passes must be registered prior to being queried!");
- RI->second = PI->second->run(M);
- }