From 6068c48498e9af1076b1b5f2499e176e7e9c0f34 Mon Sep 17 00:00:00 2001 From: Chandler Carruth Date: Mon, 2 Jul 2012 22:56:41 +0000 Subject: All glory to address sanitizer. ;] It appears to have caught a use-after-free introduced as by r159567 and/or friends which call 'addPass' from many more places. The bug in 'addPass' doesn't appear to be new, and was spotted by inspection when ASan shown a bright light of a stacktrace at these functions. Hopefully this will fix the ASan failure -- I have no test case other than running an ASan-built clang over the test suite. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@159614 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/Passes.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'lib/CodeGen/Passes.cpp') diff --git a/lib/CodeGen/Passes.cpp b/lib/CodeGen/Passes.cpp index 1fefb9d45f..9693780bda 100644 --- a/lib/CodeGen/Passes.cpp +++ b/lib/CodeGen/Passes.cpp @@ -280,11 +280,17 @@ AnalysisID TargetPassConfig::getPassSubstitution(AnalysisID ID) const { void TargetPassConfig::addPass(Pass *P) { assert(!Initialized && "PassConfig is immutable"); + // Cache the Pass ID here in case the pass manager finds this pass is + // redundant with ones already scheduled / available, and deletes it. + // Fundamentally, once we add the pass to the manager, we no longer own it + // and shouldn't reference it. + AnalysisID PassID = P->getPassID(); + if (Started && !Stopped) PM->add(P); - if (StopAfter == P->getPassID()) + if (StopAfter == PassID) Stopped = true; - if (StartAfter == P->getPassID()) + if (StartAfter == PassID) Started = true; if (Stopped && !Started) report_fatal_error("Cannot stop compilation after pass that is not run"); -- cgit v1.2.3