From: Chris Lattner Date: Sun, 15 Feb 2004 22:24:51 +0000 (+0000) Subject: By default, llvm.setjmp/llvm.longjmp intrinsics get lowered to their libc counterparts X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=9b700f7951b07cb7be885c7560066c73733ef101;p=oota-llvm.git By default, llvm.setjmp/llvm.longjmp intrinsics get lowered to their libc counterparts git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11483 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/IntrinsicLowering.cpp b/lib/CodeGen/IntrinsicLowering.cpp index ae16c6f96cd..b199ad38331 100644 --- a/lib/CodeGen/IntrinsicLowering.cpp +++ b/lib/CodeGen/IntrinsicLowering.cpp @@ -81,13 +81,25 @@ void DefaultIntrinsicLowering::LowerIntrinsicCall(CallInst *CI) { // never optimized (ie, right out of the CFE), or if it has been hacked on // by the lowerinvoke pass. In both cases, the right thing to do is to // convert the call to an explicit setjmp or longjmp call. - case Intrinsic::setjmp: - case Intrinsic::sigsetjmp: + case Intrinsic::setjmp: { + static Function *SetjmpFCache = 0; + Value *V = ReplaceCallWith("setjmp", CI, CI->op_begin()+1, CI->op_end(), + Type::IntTy, SetjmpFCache); if (CI->getType() != Type::VoidTy) - CI->replaceAllUsesWith(Constant::getNullValue(CI->getType())); + CI->replaceAllUsesWith(V); break; + } + case Intrinsic::sigsetjmp: + if (CI->getType() != Type::VoidTy) + CI->replaceAllUsesWith(Constant::getNullValue(CI->getType())); + break; case Intrinsic::longjmp: + static Function *LongjmpFCache = 0; + ReplaceCallWith("longjmp", CI, CI->op_begin()+1, CI->op_end(), + Type::VoidTy, LongjmpFCache); + break; + case Intrinsic::siglongjmp: // Insert the call to abort static Function *AbortFCache = 0; diff --git a/lib/VMCore/IntrinsicLowering.cpp b/lib/VMCore/IntrinsicLowering.cpp index ae16c6f96cd..b199ad38331 100644 --- a/lib/VMCore/IntrinsicLowering.cpp +++ b/lib/VMCore/IntrinsicLowering.cpp @@ -81,13 +81,25 @@ void DefaultIntrinsicLowering::LowerIntrinsicCall(CallInst *CI) { // never optimized (ie, right out of the CFE), or if it has been hacked on // by the lowerinvoke pass. In both cases, the right thing to do is to // convert the call to an explicit setjmp or longjmp call. - case Intrinsic::setjmp: - case Intrinsic::sigsetjmp: + case Intrinsic::setjmp: { + static Function *SetjmpFCache = 0; + Value *V = ReplaceCallWith("setjmp", CI, CI->op_begin()+1, CI->op_end(), + Type::IntTy, SetjmpFCache); if (CI->getType() != Type::VoidTy) - CI->replaceAllUsesWith(Constant::getNullValue(CI->getType())); + CI->replaceAllUsesWith(V); break; + } + case Intrinsic::sigsetjmp: + if (CI->getType() != Type::VoidTy) + CI->replaceAllUsesWith(Constant::getNullValue(CI->getType())); + break; case Intrinsic::longjmp: + static Function *LongjmpFCache = 0; + ReplaceCallWith("longjmp", CI, CI->op_begin()+1, CI->op_end(), + Type::VoidTy, LongjmpFCache); + break; + case Intrinsic::siglongjmp: // Insert the call to abort static Function *AbortFCache = 0;