From 73b55510585573cd37fca85864c8d7d73e6b4093 Mon Sep 17 00:00:00 2001 From: Bill Wendling Date: Wed, 11 Nov 2009 23:17:02 +0000 Subject: Don't mark a call as potentially throwing if the function it's calling has the "nounwind" attribute. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@86897 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/AsmPrinter/DwarfException.cpp | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) (limited to 'lib/CodeGen/AsmPrinter/DwarfException.cpp') diff --git a/lib/CodeGen/AsmPrinter/DwarfException.cpp b/lib/CodeGen/AsmPrinter/DwarfException.cpp index b07c95bb59..693dcc2466 100644 --- a/lib/CodeGen/AsmPrinter/DwarfException.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfException.cpp @@ -490,7 +490,27 @@ ComputeCallSiteTable(SmallVectorImpl &CallSites, for (MachineBasicBlock::const_iterator MI = I->begin(), E = I->end(); MI != E; ++MI) { if (!MI->isLabel()) { - SawPotentiallyThrowing |= MI->getDesc().isCall(); + if (MI->getDesc().isCall()) { + // Don't mark a call as potentially throwing if the function it's + // calling is marked "nounwind". + bool DoesNotThrow = 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(MO.getGlobal())) { + if (F->doesNotThrow()) { + DoesNotThrow = true; + break; + } + } + } + } + + if (!DoesNotThrow) + SawPotentiallyThrowing = true; + } + continue; } -- cgit v1.2.3-18-g5258