OSDN Git Service

[WinEH] Fix memory leak with catch-all mapping.
authorAndrew Kaylor <andrew.kaylor@intel.com>
Mon, 20 Apr 2015 18:48:45 +0000 (18:48 +0000)
committerAndrew Kaylor <andrew.kaylor@intel.com>
Mon, 20 Apr 2015 18:48:45 +0000 (18:48 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@235328 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/WinEHPrepare.cpp

index 4923d46..c540a5d 100644 (file)
@@ -1425,11 +1425,18 @@ void WinEHPrepare::mapLandingPadBlocks(LandingPadInst *LPad,
         findCleanupHandlers(Actions, BB, BB);
 
       // Add the catch handler to the action list.
-      // Since this is a catch-all handler, the selector won't actually appear
-      // in the code anywhere.  ExpectedSelector here is the constant null ptr
-      // that we got from the landing pad instruction.
-      CatchHandler *Action = new CatchHandler(BB, ExpectedSelector, nullptr);
-      CatchHandlerMap[BB] = Action;
+      CatchHandler *Action = nullptr;
+      if (CatchHandlerMap.count(BB) && CatchHandlerMap[BB] != nullptr) {
+        // If the CatchHandlerMap already has an entry for this BB, re-use it.
+        Action = CatchHandlerMap[BB];
+        assert(Action->getSelector() == ExpectedSelector);
+      } else {
+        // Since this is a catch-all handler, the selector won't actually appear
+        // in the code anywhere.  ExpectedSelector here is the constant null ptr
+        // that we got from the landing pad instruction.
+        Action = new CatchHandler(BB, ExpectedSelector, nullptr);
+        CatchHandlerMap[BB] = Action;
+      }
       Actions.insertCatchHandler(Action);
       DEBUG(dbgs() << "  Catch all handler at block " << BB->getName() << "\n");
       ++HandlersFound;