-const AnalysisManager::AnalysisResultConcept<Function> &
-AnalysisManager::getResultImpl(void *PassID, Function *F) {
- assert(F->getParent() == M && "Analyzing a function from another module!");
-
- FunctionAnalysisResultMapT::iterator RI;
- bool Inserted;
- llvm::tie(RI, Inserted) = FunctionAnalysisResults.insert(std::make_pair(
- std::make_pair(PassID, F), FunctionAnalysisResultListT::iterator()));
-
- 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.
- FunctionAnalysisPassMapT::const_iterator PI =
- FunctionAnalysisPasses.find(PassID);
- assert(PI != FunctionAnalysisPasses.end() &&
- "Analysis passes must be registered prior to being queried!");
- FunctionAnalysisResultListT &ResultList = FunctionAnalysisResultLists[F];
- ResultList.push_back(std::make_pair(PassID, PI->second->run(F)));
- RI->second = llvm::prior(ResultList.end());
- }
-
- return *RI->second->second;
-}
-
-void AnalysisManager::invalidateImpl(void *PassID, Module *M) {
- assert(M == this->M && "Invalidating a pass over a different module!");
- ModuleAnalysisResults.erase(PassID);
-}
-
-void AnalysisManager::invalidateImpl(void *PassID, Function *F) {
- assert(F->getParent() == M &&
- "Invalidating a pass over a function from another module!");
-
- FunctionAnalysisResultMapT::iterator RI =
- FunctionAnalysisResults.find(std::make_pair(PassID, F));
- if (RI == FunctionAnalysisResults.end())
- return;
-
- FunctionAnalysisResultLists[F].erase(RI->second);
-}