15 #ifndef LLVM_IR_PASSMANAGERIMPL_H
16 #define LLVM_IR_PASSMANAGERIMPL_H
22 template <
typename IRUnitT,
typename... ExtraArgTs>
25 : DebugLogging(DebugLogging) {}
27 template <
typename IRUnitT,
typename... ExtraArgTs>
31 template <
typename IRUnitT,
typename... ExtraArgTs>
36 template <
typename IRUnitT,
typename... ExtraArgTs>
41 dbgs() <<
"Clearing all analysis results for: " <<
Name <<
"\n";
43 auto ResultsListI = AnalysisResultLists.find(&
IR);
44 if (ResultsListI == AnalysisResultLists.end())
47 for (
auto &IDAndResult : ResultsListI->second)
48 AnalysisResults.erase({IDAndResult.first, &
IR});
51 AnalysisResultLists.erase(ResultsListI);
54 template <
typename IRUnitT,
typename... ExtraArgTs>
55 inline typename AnalysisManager<IRUnitT, ExtraArgTs...>::ResultConceptT &
58 typename AnalysisResultMapT::iterator RI;
60 std::tie(RI, Inserted) = AnalysisResults.insert(std::make_pair(
61 std::make_pair(
ID, &
IR),
typename AnalysisResultListT::iterator()));
66 auto &
P = this->lookUpPass(
ID);
70 PI = getResult<PassInstrumentationAnalysis>(
IR, ExtraArgs...);
74 AnalysisResultListT &ResultList = AnalysisResultLists[&
IR];
75 ResultList.emplace_back(
ID,
P.run(
IR, *
this, ExtraArgs...));
81 RI = AnalysisResults.find({
ID, &
IR});
82 assert(RI != AnalysisResults.end() &&
"we just inserted it!");
84 RI->second = std::prev(ResultList.end());
87 return *RI->second->second;
90 template <
typename IRUnitT,
typename... ExtraArgTs>
100 Invalidator Inv(IsResultInvalidated, AnalysisResults);
101 AnalysisResultListT &ResultsList = AnalysisResultLists[&
IR];
102 for (
auto &AnalysisResultPair : ResultsList) {
108 auto &Result = *AnalysisResultPair.second;
110 auto IMapI = IsResultInvalidated.
find(
ID);
111 if (IMapI != IsResultInvalidated.
end())
121 IsResultInvalidated.
insert({
ID, Result.invalidate(
IR, PA, Inv)}).second;
123 assert(Inserted &&
"Should never have already inserted this ID, likely "
124 "indicates a cycle!");
128 if (!IsResultInvalidated.
empty()) {
129 for (
auto I = ResultsList.begin(),
E = ResultsList.end();
I !=
E;) {
131 if (!IsResultInvalidated.
lookup(
ID)) {
137 dbgs() <<
"Invalidating analysis: " << this->lookUpPass(
ID).name()
138 <<
" on " <<
IR.getName() <<
"\n";
140 I = ResultsList.erase(
I);
141 AnalysisResults.erase({
ID, &
IR});
145 if (ResultsList.empty())
146 AnalysisResultLists.erase(&
IR);
150 #endif // LLVM_IR_PASSMANAGERIMPL_H