diff --git a/lib/CodeGen/CGObjCMac.cpp b/lib/CodeGen/CGObjCMac.cpp
index 97410cb..269f5d5 100644
--- a/lib/CodeGen/CGObjCMac.cpp
+++ b/lib/CodeGen/CGObjCMac.cpp
@@ -102,16 +102,40 @@
   }
   
   /// GcAssignGlobalFn -- LLVM objc_assign_global function.
-  llvm::Constant *GcAssignGlobalFn;
+  llvm::Constant *getGcAssignGlobalFn() {
+    // id objc_assign_global(id, id *)
+    std::vector<const llvm::Type*> Args(1, ObjectPtrTy);
+    Args.push_back(ObjectPtrTy->getPointerTo());
+    llvm::FunctionType *FTy = llvm::FunctionType::get(ObjectPtrTy, Args, false);
+    return CGM.CreateRuntimeFunction(FTy, "objc_assign_global");
+  }
   
   /// GcAssignIvarFn -- LLVM objc_assign_ivar function.
-  llvm::Constant *GcAssignIvarFn;
+  llvm::Constant *getGcAssignIvarFn() {
+    // id objc_assign_ivar(id, id *)
+    std::vector<const llvm::Type*> Args(1, ObjectPtrTy);
+    Args.push_back(ObjectPtrTy->getPointerTo());
+    llvm::FunctionType *FTy = llvm::FunctionType::get(ObjectPtrTy, Args, false);
+    return CGM.CreateRuntimeFunction(FTy, "objc_assign_ivar");
+  }
   
   /// GcAssignStrongCastFn -- LLVM objc_assign_strongCast function.
-  llvm::Constant *GcAssignStrongCastFn;
+  llvm::Constant *getGcAssignStrongCastFn() {
+    // id objc_assign_global(id, id *)
+    std::vector<const llvm::Type*> Args(1, ObjectPtrTy);
+    Args.push_back(ObjectPtrTy->getPointerTo());
+    llvm::FunctionType *FTy = llvm::FunctionType::get(ObjectPtrTy, Args, false);
+    return CGM.CreateRuntimeFunction(FTy, "objc_assign_strongCast");
+  }
 
   /// ExceptionThrowFn - LLVM objc_exception_throw function.
-  llvm::Constant *ExceptionThrowFn;
+  llvm::Constant *getExceptionThrowFn() {
+    // void objc_exception_throw(id)
+    std::vector<const llvm::Type*> Args(1, ObjectPtrTy);
+    llvm::FunctionType *FTy =
+      llvm::FunctionType::get(llvm::Type::VoidTy, Args, false);
+    return CGM.CreateRuntimeFunction(FTy, "objc_exception_throw");
+  }
   
   /// SyncEnterFn - LLVM object_sync_enter function.
   llvm::Constant *getSyncEnterFn() {
@@ -123,7 +147,13 @@
   }
   
   /// SyncExitFn - LLVM object_sync_exit function.
-  llvm::Constant *SyncExitFn;
+  llvm::Constant *getSyncExitFn() {
+    // void objc_sync_exit (id)
+    std::vector<const llvm::Type*> Args(1, ObjectPtrTy);
+    llvm::FunctionType *FTy =
+    llvm::FunctionType::get(llvm::Type::VoidTy, Args, false);
+    return CGM.CreateRuntimeFunction(FTy, "objc_sync_exit");
+  }
   
   ObjCCommonTypesHelper(CodeGen::CodeGenModule &cgm);
   ~ObjCCommonTypesHelper(){}
@@ -2339,7 +2369,7 @@
   } else {
     // Emit objc_sync_exit(expr); as finally's sole statement for
     // @synchronized.
-    CGF.Builder.CreateCall(ObjCTypes.SyncExitFn, SyncArg);
+    CGF.Builder.CreateCall(ObjCTypes.getSyncExitFn(), SyncArg);
   }
 
   // Emit the switch block
@@ -2349,7 +2379,7 @@
     CGF.EmitBlock(Info.EndBlock);
   
   CGF.EmitBlock(FinallyRethrow);
-  CGF.Builder.CreateCall(ObjCTypes.ExceptionThrowFn, 
+  CGF.Builder.CreateCall(ObjCTypes.getExceptionThrowFn(), 
                          CGF.Builder.CreateLoad(RethrowPtr));
   CGF.Builder.CreateUnreachable();
   
@@ -2370,7 +2400,7 @@
     ExceptionAsObject = CGF.ObjCEHValueStack.back();
   }
   
-  CGF.Builder.CreateCall(ObjCTypes.ExceptionThrowFn, ExceptionAsObject);
+  CGF.Builder.CreateCall(ObjCTypes.getExceptionThrowFn(), ExceptionAsObject);
   CGF.Builder.CreateUnreachable();
 
   // Clear the insertion point to indicate we are in unreachable code.
@@ -2429,7 +2459,7 @@
   }
   src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
   dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy);
-  CGF.Builder.CreateCall2(ObjCTypes.GcAssignGlobalFn,
+  CGF.Builder.CreateCall2(ObjCTypes.getGcAssignGlobalFn(),
                           src, dst, "globalassign");
   return;
 }
@@ -2450,7 +2480,7 @@
   }
   src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
   dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy);
-  CGF.Builder.CreateCall2(ObjCTypes.GcAssignIvarFn,
+  CGF.Builder.CreateCall2(ObjCTypes.getGcAssignIvarFn(),
                           src, dst, "assignivar");
   return;
 }
@@ -2471,7 +2501,7 @@
   }
   src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
   dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy);
-  CGF.Builder.CreateCall2(ObjCTypes.GcAssignStrongCastFn,
+  CGF.Builder.CreateCall2(ObjCTypes.getGcAssignStrongCastFn(),
                           src, dst, "weakassign");
   return;
 }
@@ -3416,33 +3446,6 @@
   Params.push_back(Ctx.getPointerType(IdType));
   FTy = Types.GetFunctionType(Types.getFunctionInfo(IdType, Params), false);
   GcReadWeakFn = CGM.CreateRuntimeFunction(FTy, "objc_read_weak");
-
-  // id objc_assign_global (id, id *)
-  Params.clear();
-  Params.push_back(IdType);
-  Params.push_back(Ctx.getPointerType(IdType));
-  
-  FTy = Types.GetFunctionType(Types.getFunctionInfo(IdType, Params), false);
-  GcAssignGlobalFn = CGM.CreateRuntimeFunction(FTy, "objc_assign_global");
-  GcAssignIvarFn = CGM.CreateRuntimeFunction(FTy, "objc_assign_ivar");
-  GcAssignStrongCastFn = 
-    CGM.CreateRuntimeFunction(FTy, "objc_assign_strongCast");
-  
-  // void objc_exception_throw(id)
-  Params.clear();
-  Params.push_back(IdType);
-  
-  FTy = Types.GetFunctionType(Types.getFunctionInfo(Ctx.VoidTy, Params), false);
-  ExceptionThrowFn =
-    CGM.CreateRuntimeFunction(FTy, "objc_exception_throw");
-
-  // synchronized APIs
-  // void objc_sync_exit (id)
-  Params.clear();
-  Params.push_back(IdType);
-
-  FTy = Types.GetFunctionType(Types.getFunctionInfo(Ctx.VoidTy, Params), false);
-  SyncExitFn = CGM.CreateRuntimeFunction(FTy, "objc_sync_exit");
 }
 
 ObjCTypesHelper::ObjCTypesHelper(CodeGen::CodeGenModule &cgm) 
@@ -5251,7 +5254,7 @@
   }
   src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
   dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy);
-  CGF.Builder.CreateCall2(ObjCTypes.GcAssignIvarFn,
+  CGF.Builder.CreateCall2(ObjCTypes.getGcAssignIvarFn(),
                           src, dst, "assignivar");
   return;
 }
@@ -5273,7 +5276,7 @@
   }
   src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
   dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy);
-  CGF.Builder.CreateCall2(ObjCTypes.GcAssignStrongCastFn,
+  CGF.Builder.CreateCall2(ObjCTypes.getGcAssignStrongCastFn(),
                           src, dst, "weakassign");
   return;
 }
@@ -5331,7 +5334,7 @@
   }
   src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
   dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy);
-  CGF.Builder.CreateCall2(ObjCTypes.GcAssignGlobalFn,
+  CGF.Builder.CreateCall2(ObjCTypes.getGcAssignGlobalFn(),
                           src, dst, "globalassign");
   return;
 }
@@ -5566,7 +5569,7 @@
   } else {
     // Emit 'objc_sync_exit(expr)' as finally's sole statement for
     // @synchronized.
-    CGF.Builder.CreateCall(ObjCTypes.SyncExitFn, SyncArg);
+    CGF.Builder.CreateCall(ObjCTypes.getSyncExitFn(), SyncArg);
   }
 
   if (Info.SwitchBlock)
@@ -5602,12 +5605,12 @@
   llvm::BasicBlock *InvokeDest = CGF.getInvokeDest();
   if (InvokeDest) {
     llvm::BasicBlock *Cont = CGF.createBasicBlock("invoke.cont");
-    CGF.Builder.CreateInvoke(ObjCTypes.ExceptionThrowFn,
+    CGF.Builder.CreateInvoke(ObjCTypes.getExceptionThrowFn(),
                              Cont, InvokeDest,
                              &ExceptionAsObject, &ExceptionAsObject + 1);
     CGF.EmitBlock(Cont);
   } else
-    CGF.Builder.CreateCall(ObjCTypes.ExceptionThrowFn, ExceptionAsObject);  
+    CGF.Builder.CreateCall(ObjCTypes.getExceptionThrowFn(), ExceptionAsObject);  
   CGF.Builder.CreateUnreachable();
 
   // Clear the insertion point to indicate we are in unreachable code.
