diff options
| author | Bill Wendling <isanbard@gmail.com> | 2009-11-12 21:59:20 +0000 |
|---|---|---|
| committer | Bill Wendling <isanbard@gmail.com> | 2009-11-12 21:59:20 +0000 |
| commit | e412064c4c3b4ed8c0a72f7887714c7c0c0c809a (patch) | |
| tree | 872c96c7d2e4696b383b4be06554495771898ce5 /llvm/lib/CodeGen | |
| parent | 5c89f4b4ef868627d104af82d78b7fc79bbed3cb (diff) | |
| download | bcm5719-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.cpp | 67 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/DwarfException.h | 4 |
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 |

