fix memory leak in pass manager when adding an analysis pass that already existed. as pass manager takes ownership of the added passes, it has to delete the pass if it isnt added to the pass list

tweak the opt tool so that it doesnt access a Pass after the ownership was taken by the pass manager

llvm-svn: 58730
This commit is contained in:
Nuno Lopes 2008-11-04 23:03:58 +00:00
parent 169173000f
commit a5d766c285
2 changed files with 14 additions and 7 deletions

View File

@ -458,8 +458,10 @@ void PMTopLevelManager::schedulePass(Pass *P) {
// generate the analysis again. Stale analysis info should not be
// available at this point.
if (P->getPassInfo() &&
P->getPassInfo()->isAnalysis() && findAnalysisPass(P->getPassInfo()))
P->getPassInfo()->isAnalysis() && findAnalysisPass(P->getPassInfo())) {
delete P;
return;
}
AnalysisUsage *AnUsage = findAnalysisUsage(P);

View File

@ -527,16 +527,21 @@ int main(int argc, char **argv) {
cerr << argv[0] << ": cannot create pass: "
<< PassInf->getPassName() << "\n";
if (P) {
bool isBBPass = dynamic_cast<BasicBlockPass*>(P) != 0;
bool isLPass = !isBBPass && dynamic_cast<LoopPass*>(P) != 0;
bool isFPass = !isLPass && dynamic_cast<FunctionPass*>(P) != 0;
bool isCGSCCPass = !isFPass && dynamic_cast<CallGraphSCCPass*>(P) != 0;
addPass(Passes, P);
if (AnalyzeOnly) {
if (dynamic_cast<BasicBlockPass*>(P))
if (isBBPass)
Passes.add(new BasicBlockPassPrinter(PassInf));
else if (dynamic_cast<LoopPass*>(P))
Passes.add(new LoopPassPrinter(PassInf));
else if (dynamic_cast<FunctionPass*>(P))
else if (isLPass)
Passes.add(new LoopPassPrinter(PassInf));
else if (isFPass)
Passes.add(new FunctionPassPrinter(PassInf));
else if (dynamic_cast<CallGraphSCCPass*>(P))
else if (isCGSCCPass)
Passes.add(new CallGraphSCCPassPrinter(PassInf));
else
Passes.add(new ModulePassPrinter(PassInf));