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 de29427..e987261 100644
--- a/lib/CodeGen/CGObjCMac.cpp
+++ b/lib/CodeGen/CGObjCMac.cpp
@@ -317,7 +317,29 @@
return llvm::ConstantExpr::getBitCast(Personality, Int8PtrTy);
}
- llvm::Constant *UnwindResumeOrRethrowFn, *ObjCBeginCatchFn, *ObjCEndCatchFn;
+ llvm::Constant *getUnwindResumeOrRethrowFn() {
+ std::vector<const llvm::Type*> 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<const llvm::Type*> Params;
+ return CGM.CreateRuntimeFunction(llvm::FunctionType::get(llvm::Type::VoidTy,
+ Params, false),
+ "objc_end_catch");
+
+ }
+
+ llvm::Constant *getObjCBeginCatchFn() {
+ std::vector<const llvm::Type*> 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 @@
"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 @@
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 @@
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 @@
CGF.EmitBranch(FinallyEnd);
CGF.EmitBlock(FinallyRethrow);
- CGF.Builder.CreateCall(ObjCTypes.UnwindResumeOrRethrowFn,
+ CGF.Builder.CreateCall(ObjCTypes.getUnwindResumeOrRethrowFn(),
CGF.Builder.CreateLoad(RethrowPtr));
CGF.Builder.CreateUnreachable();