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 | ed060dcb5c7e9cb2fd11ff3b0b98203fb53063e7 (patch) | |
tree | 53b58488c575e3d2307416cca86fa34d58963973 /lib | |
parent | 4ff4141a9ee9ce705f2a709f3372acaf58d86ea3 (diff) | |
download | external_llvm-ed060dcb5c7e9cb2fd11ff3b0b98203fb53063e7.zip external_llvm-ed060dcb5c7e9cb2fd11ff3b0b98203fb53063e7.tar.gz external_llvm-ed060dcb5c7e9cb2fd11ff3b0b98203fb53063e7.tar.bz2 |
Refactor code that checks if it's a call to a "nounwind" function.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@87036 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/CodeGen/AsmPrinter/DwarfException.cpp | 67 | ||||
-rw-r--r-- | lib/CodeGen/AsmPrinter/DwarfException.h | 4 |
2 files changed, 40 insertions, 31 deletions
diff --git a/lib/CodeGen/AsmPrinter/DwarfException.cpp b/lib/CodeGen/AsmPrinter/DwarfException.cpp index 1ef34b9..bb33b8e 100644 --- a/lib/CodeGen/AsmPrinter/DwarfException.cpp +++ b/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/lib/CodeGen/AsmPrinter/DwarfException.h b/lib/CodeGen/AsmPrinter/DwarfException.h index f6f5025..391cf05 100644 --- a/lib/CodeGen/AsmPrinter/DwarfException.h +++ b/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 |