Author: baldrick Date: Thu Dec 6 02:10:52 2007 New Revision: 44659 URL: http://llvm.org/viewvc/llvm-project?rev=44659&view=rev Log: Inspect the nounwind attribute rather than using the special fact that intrinsics cannot throw.
Modified: llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp Modified: llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp?rev=44659&r1=44658&r2=44659&view=diff ============================================================================== --- llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp (original) +++ llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp Thu Dec 6 02:10:52 2007 @@ -2307,36 +2307,36 @@ /// result, otherwise store it in DestLoc. Value *TreeToLLVM::EmitCallOf(Value *Callee, tree exp, const MemRef *DestLoc, const ParamAttrsList *PAL) { + if (!PAL && isa<Function>(Callee)) + PAL = cast<Function>(Callee)->getParamAttrs(); + // Determine if we need to generate an invoke instruction (instead of a simple // call) and if so, what the exception destination will be. BasicBlock *LandingPad = 0; - bool NoUnwind = false; - - // Do not turn intrinsic calls into invokes. - if (!isa<Function>(Callee) || !cast<Function>(Callee)->getIntrinsicID()) { - // Do not turn no-throw calls into invokes; mark them as "nounwind". - NoUnwind = !tree_could_throw_p(exp); - - if (!NoUnwind) { - int RegionNo = lookup_stmt_eh_region(exp); - - // Is the call contained in an exception handling region? - if (RegionNo > 0) { - // Are there any exception handlers for this region? - if (can_throw_internal_1(RegionNo, false)) { - // Turn the call into an invoke. - LandingPads.grow(RegionNo); - BasicBlock *&ThisPad = LandingPads[RegionNo]; - - // Create a landing pad if one didn't exist already. - if (!ThisPad) - ThisPad = new BasicBlock("lpad"); + bool NoUnwind = + (PAL && PAL->paramHasAttr(0, ParamAttr::NoUnwind)) || + !tree_could_throw_p(exp); + + // Do not turn nounwind calls into invokes. + if (!NoUnwind) { + int RegionNo = lookup_stmt_eh_region(exp); + + // Is the call contained in an exception handling region? + if (RegionNo > 0) { + // Are there any exception handlers for this region? + if (can_throw_internal_1(RegionNo, false)) { + // Turn the call into an invoke. + LandingPads.grow(RegionNo); + BasicBlock *&ThisPad = LandingPads[RegionNo]; + + // Create a landing pad if one didn't exist already. + if (!ThisPad) + ThisPad = new BasicBlock("lpad"); - LandingPad = ThisPad; - } else { - // Can this call unwind out of the current function? - NoUnwind = !can_throw_external_1(RegionNo, false); - } + LandingPad = ThisPad; + } else { + // Can this call unwind out of the current function? + NoUnwind = !can_throw_external_1(RegionNo, false); } } } _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits