[llvm-commits] [llvm] r87036 - in /llvm/trunk/lib/CodeGen/AsmPrinter: DwarfException.cpp DwarfException.h

Bill Wendling isanbard at gmail.com
Thu Nov 12 13:59:20 PST 2009


Author: void
Date: Thu Nov 12 15:59:20 2009
New Revision: 87036

URL: http://llvm.org/viewvc/llvm-project?rev=87036&view=rev
Log:
Refactor code that checks if it's a call to a "nounwind" function.

Modified:
    llvm/trunk/lib/CodeGen/AsmPrinter/DwarfException.cpp
    llvm/trunk/lib/CodeGen/AsmPrinter/DwarfException.h

Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfException.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfException.cpp?rev=87036&r1=87035&r2=87036&view=diff

==============================================================================
--- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfException.cpp (original)
+++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfException.cpp Thu Nov 12 15:59:20 2009
@@ -462,6 +462,40 @@
   return SizeActions;
 }
 
+/// CallToNoUnwindFunction - Return `true' if this is a call to a function
+/// marked `nounwind'. Return `false' otherwise.
+bool DwarfException::CallToNoUnwindFunction(const MachineInstr *MI) {
+  assert(MI->getDesc().isCall() && "This should be a call instruction!");
+
+  bool MarkedNoUnwind = false;
+  bool SawFunc = false;
+
+  for (unsigned I = 0, E = MI->getNumOperands(); I != E; ++I) {
+    const MachineOperand &MO = MI->getOperand(I);
+
+    if (MO.isGlobal()) {
+      if (Function *F = dyn_cast<Function>(MO.getGlobal())) {
+        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.
+          MarkedNoUnwind = false;
+          break;
+        }
+        if (F->doesNotThrow()) {
+          SawFunc = true;
+          MarkedNoUnwind = true;
+        }
+      }
+    }
+  }
+
+  return MarkedNoUnwind;
+}
+
 /// ComputeCallSiteTable - Compute the call-site table.  The entry for an invoke
 /// has a try-range containing the call, a non-zero landing pad, and an
 /// appropriate action.  The entry for an ordinary call has a try-range
@@ -490,37 +524,8 @@
     for (MachineBasicBlock::const_iterator MI = I->begin(), E = I->end();
          MI != E; ++MI) {
       if (!MI->isLabel()) {
-        if (MI->getDesc().isCall()) {
-          // 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 (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;
-                }
-              }
-            }
-          }
-
-          if (!DoesNotThrow)
-            SawPotentiallyThrowing = true;
-        }
+        if (MI->getDesc().isCall())
+          SawPotentiallyThrowing |= !CallToNoUnwindFunction(MI);
 
         continue;
       }

Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfException.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfException.h?rev=87036&r1=87035&r2=87036&view=diff

==============================================================================
--- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfException.h (original)
+++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfException.h Thu Nov 12 15:59:20 2009
@@ -155,6 +155,10 @@
                                SmallVectorImpl<ActionEntry> &Actions,
                                SmallVectorImpl<unsigned> &FirstActions);
 
+  /// CallToNoUnwindFunction - Return `true' if this is a call to a function
+  /// marked `nounwind'. Return `false' otherwise.
+  bool CallToNoUnwindFunction(const MachineInstr *MI);
+
   /// ComputeCallSiteTable - Compute the call-site table.  The entry for an
   /// invoke has a try-range containing the call, a non-zero landing pad and an
   /// appropriate action.  The entry for an ordinary call has a try-range





More information about the llvm-commits mailing list