If there's more than one function operand to a call instruction, be conservative
and don't assume that the call doesn't throw. It would be nice if there were a
way to determine which is the callee and which is a parameter. In practice, the
architecture we care about normally only have one operand for a call instruction
(x86 and arm).


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@87023 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/AsmPrinter/DwarfException.cpp b/lib/CodeGen/AsmPrinter/DwarfException.cpp
index 693dcc2..1ef34b9 100644
--- a/lib/CodeGen/AsmPrinter/DwarfException.cpp
+++ b/lib/CodeGen/AsmPrinter/DwarfException.cpp
@@ -494,15 +494,26 @@
           // Don't mark a call as potentially throwing if the function it's
           // calling is marked "nounwind".
           bool DoesNotThrow = false;
+          bool SawFunc = 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;
+                if (SawFunc) {
+                  // Be conservative. If we have more than one function operand
+                  // for this call, then we can't make the assumption that it's
+                  // the callee and not a parameter to the call.
+                  // 
+                  // FIXME: Determine if there's a way to say that `F' is the
+                  // callee or parameter.
+                  DoesNotThrow = false;
                   break;
                 }
+                if (F->doesNotThrow()) {
+                  SawFunc = true;
+                  DoesNotThrow = true;
+                }
               }
             }
           }