OSDN Git Service

Fix a use-iterator-after-invalidate error
authorSanjoy Das <sanjoy@playingwithpointers.com>
Fri, 27 Feb 2015 02:19:11 +0000 (02:19 +0000)
committerSanjoy Das <sanjoy@playingwithpointers.com>
Fri, 27 Feb 2015 02:19:11 +0000 (02:19 +0000)
AnalysisResult::getResultImpl reuses an iterator into a DenseMap after
inserting elements into it. This change adds code to recompute the
iterator before the second use.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@230718 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/IR/PassManager.h

index c92e7c9..513bbe0 100644 (file)
@@ -471,6 +471,12 @@ private:
         dbgs() << "Running analysis: " << P.name() << "\n";
       AnalysisResultListT &ResultList = AnalysisResultLists[&IR];
       ResultList.emplace_back(PassID, P.run(IR, this));
+
+      // P.run may have inserted elements into AnalysisResults and invalidated
+      // RI.
+      RI = AnalysisResults.find(std::make_pair(PassID, &IR));
+      assert(RI != AnalysisResults.end() && "we just inserted it!");
+
       RI->second = std::prev(ResultList.end());
     }