From: Chris Lattner Date: Wed, 22 Apr 2009 02:15:23 +0000 (+0000) Subject: make try/catch objc runtime functions be lazily generated. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8a56911956aa875922a5faa3787c6829e7f7011f;p=clang make try/catch objc runtime functions be lazily generated. rdar://6809612 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@69762 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGObjCMac.cpp b/lib/CodeGen/CGObjCMac.cpp index de29427c0e..e987261daa 100644 --- a/lib/CodeGen/CGObjCMac.cpp +++ b/lib/CodeGen/CGObjCMac.cpp @@ -317,7 +317,29 @@ public: return llvm::ConstantExpr::getBitCast(Personality, Int8PtrTy); } - llvm::Constant *UnwindResumeOrRethrowFn, *ObjCBeginCatchFn, *ObjCEndCatchFn; + llvm::Constant *getUnwindResumeOrRethrowFn() { + std::vector Params; + Params.push_back(Int8PtrTy); + return CGM.CreateRuntimeFunction(llvm::FunctionType::get(llvm::Type::VoidTy, + Params, false), + "_Unwind_Resume_or_Rethrow"); + } + + llvm::Constant *getObjCEndCatchFn() { + std::vector Params; + return CGM.CreateRuntimeFunction(llvm::FunctionType::get(llvm::Type::VoidTy, + Params, false), + "objc_end_catch"); + + } + + llvm::Constant *getObjCBeginCatchFn() { + std::vector Params; + Params.push_back(Int8PtrTy); + return CGM.CreateRuntimeFunction(llvm::FunctionType::get(Int8PtrTy, + Params, false), + "objc_begin_catch"); + } const llvm::StructType *EHTypeTy; const llvm::Type *EHTypePtrTy; @@ -3915,24 +3937,6 @@ ObjCNonFragileABITypesHelper::ObjCNonFragileABITypesHelper(CodeGen::CodeGenModul "objc_msgSendSuper2_stret_fixup"); Params.clear(); - Params.push_back(Int8PtrTy); - UnwindResumeOrRethrowFn = - CGM.CreateRuntimeFunction(llvm::FunctionType::get(llvm::Type::VoidTy, - Params, - false), - "_Unwind_Resume_or_Rethrow"); - ObjCBeginCatchFn = - CGM.CreateRuntimeFunction(llvm::FunctionType::get(Int8PtrTy, - Params, - false), - "objc_begin_catch"); - - Params.clear(); - ObjCEndCatchFn = - CGM.CreateRuntimeFunction(llvm::FunctionType::get(llvm::Type::VoidTy, - Params, - false), - "objc_end_catch"); // struct objc_typeinfo { // const void** vtable; // objc_ehtype_vtable + 2 @@ -5469,7 +5473,7 @@ CGObjCNonFragileABIMac::EmitTryOrSynchronizedStmt(CodeGen::CodeGenFunction &CGF, CGF.setInvokeDest(MatchHandler); llvm::Value *ExcObject = - CGF.Builder.CreateCall(ObjCTypes.ObjCBeginCatchFn, Exc); + CGF.Builder.CreateCall(ObjCTypes.getObjCBeginCatchFn(), Exc); // Bind the catch parameter if it exists. if (CatchParam) { @@ -5512,7 +5516,7 @@ CGObjCNonFragileABIMac::EmitTryOrSynchronizedStmt(CodeGen::CodeGenFunction &CGF, llvm::BasicBlock *MatchEndHandler = CGF.createBasicBlock("match.end.handler"); llvm::BasicBlock *Cont = CGF.createBasicBlock("invoke.cont"); - CGF.Builder.CreateInvoke(ObjCTypes.ObjCEndCatchFn, + CGF.Builder.CreateInvoke(ObjCTypes.getObjCEndCatchFn(), Cont, MatchEndHandler, Args.begin(), Args.begin()); @@ -5571,7 +5575,7 @@ CGObjCNonFragileABIMac::EmitTryOrSynchronizedStmt(CodeGen::CodeGenFunction &CGF, CGF.EmitBranch(FinallyEnd); CGF.EmitBlock(FinallyRethrow); - CGF.Builder.CreateCall(ObjCTypes.UnwindResumeOrRethrowFn, + CGF.Builder.CreateCall(ObjCTypes.getUnwindResumeOrRethrowFn(), CGF.Builder.CreateLoad(RethrowPtr)); CGF.Builder.CreateUnreachable();