summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen
diff options
context:
space:
mode:
authorBill Wendling <isanbard@gmail.com>2009-11-12 21:59:20 +0000
committerBill Wendling <isanbard@gmail.com>2009-11-12 21:59:20 +0000
commite412064c4c3b4ed8c0a72f7887714c7c0c0c809a (patch)
tree872c96c7d2e4696b383b4be06554495771898ce5 /llvm/lib/CodeGen
parent5c89f4b4ef868627d104af82d78b7fc79bbed3cb (diff)
downloadbcm5719-llvm-e412064c4c3b4ed8c0a72f7887714c7c0c0c809a.tar.gz
bcm5719-llvm-e412064c4c3b4ed8c0a72f7887714c7c0c0c809a.zip
Refactor code that checks if it's a call to a "nounwind" function.
llvm-svn: 87036
Diffstat (limited to 'llvm/lib/CodeGen')
-rw-r--r--llvm/lib/CodeGen/AsmPrinter/DwarfException.cpp67
-rw-r--r--llvm/lib/CodeGen/AsmPrinter/DwarfException.h4
2 files changed, 40 insertions, 31 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfException.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfException.cpp
index 1ef34b96e0e..bb33b8e41d0 100644
--- a/llvm/lib/CodeGen/AsmPrinter/DwarfException.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/DwarfException.cpp
@@ -462,6 +462,40 @@ ComputeActionsTable(const SmallVectorImpl<const LandingPadInfo*> &LandingPads,
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 @@ ComputeCallSiteTable(SmallVectorImpl<CallSiteEntry> &CallSites,
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;
}
diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfException.h b/llvm/lib/CodeGen/AsmPrinter/DwarfException.h
index f6f50255f2e..391cf05541e 100644
--- a/llvm/lib/CodeGen/AsmPrinter/DwarfException.h
+++ b/llvm/lib/CodeGen/AsmPrinter/DwarfException.h
@@ -155,6 +155,10 @@ class VISIBILITY_HIDDEN DwarfException : public Dwarf {
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
OpenPOWER on IntegriCloud