Look at only the terminators of the basic block. Also, if we're using the new EH
authorBill Wendling <isanbard@gmail.com>
Thu, 25 Aug 2011 23:48:11 +0000 (23:48 +0000)
committerBill Wendling <isanbard@gmail.com>
Thu, 25 Aug 2011 23:48:11 +0000 (23:48 +0000)
scheme, return 'true' so that it doesn't try to run the old EH scheme's fixup on
the new code.

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

lib/CodeGen/DwarfEHPrepare.cpp

index 3aa72ee1960d07612f829dc9cabb2707f10a6488..d2b129a448ee1ae73424ca055c46ee0866b999fa 100644 (file)
@@ -663,14 +663,18 @@ Instruction *DwarfEHPrepare::CreateExceptionValueCall(BasicBlock *BB) {
 /// InsertUnwindResumeCalls - Convert the ResumeInsts that are still present
 /// into calls to the appropriate _Unwind_Resume function.
 bool DwarfEHPrepare::InsertUnwindResumeCalls() {
+  bool UsesNewEH = false;
   SmallVector<ResumeInst*, 16> Resumes;
-  for (Function::iterator I = F->begin(), E = F->end(); I != E; ++I)
-    for (BasicBlock::iterator II = I->begin(), IE = I->end(); II != IE; ++II)
-      if (ResumeInst *RI = dyn_cast<ResumeInst>(II))
-        Resumes.push_back(RI);
+  for (Function::iterator I = F->begin(), E = F->end(); I != E; ++I) {
+    TerminatorInst *TI = I->getTerminator();
+    if (ResumeInst *RI = dyn_cast<ResumeInst>(TI))
+      Resumes.push_back(RI);
+    else if (InvokeInst *II = dyn_cast<InvokeInst>(TI))
+      UsesNewEH = II->getUnwindDest()->isLandingPad();
+  }
 
   if (Resumes.empty())
-    return false;
+    return UsesNewEH;
 
   // Find the rewind function if we didn't already.
   if (!RewindFunction) {