Extract the code for releasing a pass into a separate function, and

tidy it up a little.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@82944 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Dan Gohman 2009-09-27 23:38:27 +00:00
parent c261df9fab
commit 27a8fb8a54
2 changed files with 30 additions and 25 deletions

View File

@ -285,10 +285,14 @@ public:
/// Remove Analysis that is not preserved by the pass /// Remove Analysis that is not preserved by the pass
void removeNotPreservedAnalysis(Pass *P); void removeNotPreservedAnalysis(Pass *P);
/// Remove dead passes /// Remove dead passes used by P.
void removeDeadPasses(Pass *P, const StringRef &Msg, void removeDeadPasses(Pass *P, const StringRef &Msg,
enum PassDebuggingString); enum PassDebuggingString);
/// Remove P.
void freePass(Pass *P, const StringRef &Msg,
enum PassDebuggingString);
/// Add pass P into the PassVector. Update /// Add pass P into the PassVector. Update
/// AvailableAnalysis appropriately if ProcessAnalysis is true. /// AvailableAnalysis appropriately if ProcessAnalysis is true.
void add(Pass *P, bool ProcessAnalysis = true); void add(Pass *P, bool ProcessAnalysis = true);

View File

@ -815,34 +815,35 @@ void PMDataManager::removeDeadPasses(Pass *P, const StringRef &Msg,
} }
for (SmallVector<Pass *, 12>::iterator I = DeadPasses.begin(), for (SmallVector<Pass *, 12>::iterator I = DeadPasses.begin(),
E = DeadPasses.end(); I != E; ++I) { E = DeadPasses.end(); I != E; ++I)
freePass(*I, Msg, DBG_STR);
}
dumpPassInfo(*I, FREEING_MSG, DBG_STR, Msg); void PMDataManager::freePass(Pass *P, const StringRef &Msg,
enum PassDebuggingString DBG_STR) {
dumpPassInfo(P, FREEING_MSG, DBG_STR, Msg);
{ {
// If the pass crashes releasing memory, remember this. // If the pass crashes releasing memory, remember this.
PassManagerPrettyStackEntry X(*I); PassManagerPrettyStackEntry X(P);
if (TheTimeInfo) TheTimeInfo->passStarted(*I); if (TheTimeInfo) TheTimeInfo->passStarted(P);
(*I)->releaseMemory(); P->releaseMemory();
if (TheTimeInfo) TheTimeInfo->passEnded(*I); if (TheTimeInfo) TheTimeInfo->passEnded(P);
} }
if (const PassInfo *PI = (*I)->getPassInfo()) {
if (const PassInfo *PI = P->getPassInfo()) {
// Remove the pass itself (if it is not already removed).
AvailableAnalysis.erase(PI);
// Remove all interfaces this pass implements, for which it is also
// listed as the available implementation.
const std::vector<const PassInfo*> &II = PI->getInterfacesImplemented();
for (unsigned i = 0, e = II.size(); i != e; ++i) {
std::map<AnalysisID, Pass*>::iterator Pos = std::map<AnalysisID, Pass*>::iterator Pos =
AvailableAnalysis.find(PI); AvailableAnalysis.find(II[i]);
if (Pos != AvailableAnalysis.end() && Pos->second == P)
// It is possible that pass is already removed from the AvailableAnalysis
if (Pos != AvailableAnalysis.end())
AvailableAnalysis.erase(Pos); AvailableAnalysis.erase(Pos);
// Remove all interfaces this pass implements, for which it is also
// listed as the available implementation.
const std::vector<const PassInfo*> &II = PI->getInterfacesImplemented();
for (unsigned i = 0, e = II.size(); i != e; ++i) {
Pos = AvailableAnalysis.find(II[i]);
if (Pos != AvailableAnalysis.end() && Pos->second == *I)
AvailableAnalysis.erase(Pos);
}
} }
} }
} }