Skip to content

Commit

Permalink
Fix a PassManager pointer use-after-free bug.
Browse files Browse the repository at this point in the history
The bug can be triggered when we require LoopInfo analysis ahead of DominatorTree construction in a Module Pass. The cause is that the LoopInfo analysis itself also invokes DominatorTree construction, therefore, when PassManager schedules LoopInfo, it will add DominatorTree first. Then after that, when the PassManger turns to schedule DominatorTree invoked by the above ModulePass, it finds there is already a DominatorTree, so it delete the redundant one. However, somehow it still try to access that pass pointer after free as code pasted below, which results in segment fault.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@168581 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
sheng-sq committed Nov 26, 2012
1 parent 38c4441 commit 9853db7
Showing 1 changed file with 12 additions and 0 deletions.
12 changes: 12 additions & 0 deletions lib/VMCore/PassManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1654,6 +1654,18 @@ void MPPassManager::addLowerLevelRequiredPass(Pass *P, Pass *RequiredPass) {

OnTheFlyManagers[P] = FPP;
}

// If RequiredPass is an analysis pass and it is available then do not
// generate the analysis again. Stale analysis info should not be
// available at this point.
const PassInfo *PI =
PassRegistry::getPassRegistry()->getPassInfo(RequiredPass->getPassID());
if (PI && PI->isAnalysis() &&
FPP->getTopLevelManager()->findAnalysisPass(RequiredPass->getPassID())) {
delete RequiredPass;
return;
}

FPP->add(RequiredPass);

// Register P as the last user of RequiredPass.
Expand Down

0 comments on commit 9853db7

Please sign in to comment.