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();