All glory to address sanitizer. ;]
authorChandler Carruth <chandlerc@gmail.com>
Mon, 2 Jul 2012 22:56:41 +0000 (22:56 +0000)
committerChandler Carruth <chandlerc@gmail.com>
Mon, 2 Jul 2012 22:56:41 +0000 (22:56 +0000)
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

index 1fefb9d45f47918607113e0be963f2f647d933c4..9693780bdaa07f278cdb53b9f183630b38726971 100644 (file)
@@ -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");