Don't mark a call as potentially throwing if the function it's calling has the
authorBill Wendling <isanbard@gmail.com>
Wed, 11 Nov 2009 23:17:02 +0000 (23:17 +0000)
committerBill Wendling <isanbard@gmail.com>
Wed, 11 Nov 2009 23:17:02 +0000 (23:17 +0000)
"nounwind" attribute.

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

lib/CodeGen/AsmPrinter/DwarfException.cpp

index b07c95bb59931f0f65278dbe553c00ad39bbb2d0..693dcc2466d6db5c8376703fcf998ddf9df15a93 100644 (file)
@@ -490,7 +490,27 @@ ComputeCallSiteTable(SmallVectorImpl<CallSiteEntry> &CallSites,
     for (MachineBasicBlock::const_iterator MI = I->begin(), E = I->end();
          MI != E; ++MI) {
       if (!MI->isLabel()) {
-        SawPotentiallyThrowing |= MI->getDesc().isCall();
+        if (MI->getDesc().isCall()) {
+          // Don't mark a call as potentially throwing if the function it's
+          // calling is marked "nounwind".
+          bool DoesNotThrow = false;
+          for (unsigned OI = 0, OE = MI->getNumOperands(); OI != OE; ++OI) {
+            const MachineOperand &MO = MI->getOperand(OI);
+
+            if (MO.isGlobal()) {
+              if (Function *F = dyn_cast<Function>(MO.getGlobal())) {
+                if (F->doesNotThrow()) {
+                  DoesNotThrow = true;
+                  break;
+                }
+              }
+            }
+          }
+
+          if (!DoesNotThrow)
+            SawPotentiallyThrowing = true;
+        }
+
         continue;
       }