-void ModulePassManager::run(Module *M) {
- for (unsigned Idx = 0, Size = Passes.size(); Idx != Size; ++Idx)
- if (Passes[Idx]->run(M))
- if (AM)
- AM->invalidateAll(M);
-}
-
-void ModuleAnalysisManager::invalidateAll(Module *M) {
- // 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 (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);
- }