[llvm-commits] [llvm] r159614 - /llvm/trunk/lib/CodeGen/Passes.cpp
Chandler Carruth
chandlerc at gmail.com
Mon Jul 2 15:56:41 PDT 2012
Author: chandlerc
Date: Mon Jul 2 17:56:41 2012
New Revision: 159614
URL: http://llvm.org/viewvc/llvm-project?rev=159614&view=rev
Log:
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.
Modified:
llvm/trunk/lib/CodeGen/Passes.cpp
Modified: llvm/trunk/lib/CodeGen/Passes.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/Passes.cpp?rev=159614&r1=159613&r2=159614&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/Passes.cpp (original)
+++ llvm/trunk/lib/CodeGen/Passes.cpp Mon Jul 2 17:56:41 2012
@@ -280,11 +280,17 @@
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");
More information about the llvm-commits
mailing list