Update for LLVM API change, and contextify a bunch of related stuff.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@75705 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/CGObjCMac.cpp b/lib/CodeGen/CGObjCMac.cpp
index 8f624f7..70eb6a7 100644
--- a/lib/CodeGen/CGObjCMac.cpp
+++ b/lib/CodeGen/CGObjCMac.cpp
@@ -101,12 +101,13 @@
                                                unsigned CVRQualifiers,
                                                llvm::Value *Offset) {
   // Compute (type*) ( (char *) BaseValue + Offset)
-  llvm::Type *I8Ptr = llvm::PointerType::getUnqual(llvm::Type::Int8Ty);
+  llvm::LLVMContext &VMContext = CGF.getLLVMContext();
+  llvm::Type *I8Ptr = VMContext.getPointerTypeUnqual(llvm::Type::Int8Ty);
   QualType IvarTy = Ivar->getType();
   const llvm::Type *LTy = CGF.CGM.getTypes().ConvertTypeForMem(IvarTy);
   llvm::Value *V = CGF.Builder.CreateBitCast(BaseValue, I8Ptr);
   V = CGF.Builder.CreateGEP(V, Offset, "add.ptr");
-  V = CGF.Builder.CreateBitCast(V, llvm::PointerType::getUnqual(LTy));
+  V = CGF.Builder.CreateBitCast(V, VMContext.getPointerTypeUnqual(LTy));
   
   if (Ivar->isBitField()) {
     // We need to compute the bit offset for the bit-field, the offset
@@ -139,6 +140,9 @@
   // concatenation is lame.
 
 class ObjCCommonTypesHelper {
+protected:
+  llvm::LLVMContext &VMContext;
+  
 private:
   llvm::Constant *getMessageSendFn() const {
     // id objc_msgSend (id, SEL, ...)
@@ -146,7 +150,7 @@
     Params.push_back(ObjectPtrTy);
     Params.push_back(SelectorPtrTy);
     return
-    CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
+    CGM.CreateRuntimeFunction(VMContext.getFunctionType(ObjectPtrTy,
                                                       Params, true),
                               "objc_msgSend");
   }
@@ -157,7 +161,7 @@
     Params.push_back(ObjectPtrTy);
     Params.push_back(SelectorPtrTy);
     return
-    CGM.CreateRuntimeFunction(llvm::FunctionType::get(llvm::Type::VoidTy,
+    CGM.CreateRuntimeFunction(VMContext.getFunctionType(llvm::Type::VoidTy,
                                                       Params, true),
                               "objc_msgSend_stret");
     
@@ -170,7 +174,7 @@
     Params.push_back(ObjectPtrTy);
     Params.push_back(SelectorPtrTy);
     return
-    CGM.CreateRuntimeFunction(llvm::FunctionType::get(llvm::Type::DoubleTy,
+    CGM.CreateRuntimeFunction(VMContext.getFunctionType(llvm::Type::DoubleTy,
                                                       Params,
                                                       true),
                               "objc_msgSend_fpret");
@@ -183,7 +187,7 @@
     std::vector<const llvm::Type*> Params;
     Params.push_back(SuperPtrTy);
     Params.push_back(SelectorPtrTy);
-    return CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
+    return CGM.CreateRuntimeFunction(VMContext.getFunctionType(ObjectPtrTy,
                                                              Params, true),
                                      SuperName);
   }
@@ -194,7 +198,7 @@
     std::vector<const llvm::Type*> Params;
     Params.push_back(SuperPtrTy);
     Params.push_back(SelectorPtrTy);
-    return CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
+    return CGM.CreateRuntimeFunction(VMContext.getFunctionType(ObjectPtrTy,
                                                              Params, true),
                                      SuperName);
   }
@@ -206,7 +210,8 @@
     Params.push_back(Int8PtrTy);
     Params.push_back(SuperPtrTy);
     Params.push_back(SelectorPtrTy);
-    return CGM.CreateRuntimeFunction(llvm::FunctionType::get(llvm::Type::VoidTy,
+    return CGM.CreateRuntimeFunction(
+                                  VMContext.getFunctionType(llvm::Type::VoidTy,
                                                              Params, true),
                                      "objc_msgSendSuper_stret");
   }
@@ -218,7 +223,8 @@
     Params.push_back(Int8PtrTy);
     Params.push_back(SuperPtrTy);
     Params.push_back(SelectorPtrTy);
-    return CGM.CreateRuntimeFunction(llvm::FunctionType::get(llvm::Type::VoidTy,
+    return CGM.CreateRuntimeFunction(
+                                   VMContext.getFunctionType(llvm::Type::VoidTy,
                                                              Params, true),
                                      "objc_msgSendSuper2_stret");
   }
@@ -331,7 +337,8 @@
     // id objc_read_weak (id *)
     std::vector<const llvm::Type*> Args;
     Args.push_back(ObjectPtrTy->getPointerTo());
-    llvm::FunctionType *FTy = llvm::FunctionType::get(ObjectPtrTy, Args, false);
+    llvm::FunctionType *FTy = 
+      VMContext.getFunctionType(ObjectPtrTy, Args, false);
     return CGM.CreateRuntimeFunction(FTy, "objc_read_weak");
   }    
   
@@ -341,7 +348,7 @@
     std::vector<const llvm::Type*> Args(1, ObjectPtrTy);
     Args.push_back(ObjectPtrTy->getPointerTo());
     llvm::FunctionType *FTy =
-      llvm::FunctionType::get(ObjectPtrTy, Args, false);
+      VMContext.getFunctionType(ObjectPtrTy, Args, false);
     return CGM.CreateRuntimeFunction(FTy, "objc_assign_weak");
   }
   
@@ -350,7 +357,8 @@
     // 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);
+    llvm::FunctionType *FTy =
+      VMContext.getFunctionType(ObjectPtrTy, Args, false);
     return CGM.CreateRuntimeFunction(FTy, "objc_assign_global");
   }
   
@@ -359,7 +367,8 @@
     // 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);
+    llvm::FunctionType *FTy =
+      VMContext.getFunctionType(ObjectPtrTy, Args, false);
     return CGM.CreateRuntimeFunction(FTy, "objc_assign_ivar");
   }
   
@@ -369,7 +378,7 @@
     std::vector<const llvm::Type*> Args(1, Int8PtrTy);
     Args.push_back(Int8PtrTy);
     Args.push_back(LongTy);
-    llvm::FunctionType *FTy = llvm::FunctionType::get(Int8PtrTy, Args, false);
+    llvm::FunctionType *FTy = VMContext.getFunctionType(Int8PtrTy, Args, false);
     return CGM.CreateRuntimeFunction(FTy, "objc_memmove_collectable");
   }
   
@@ -378,7 +387,8 @@
     // 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);
+    llvm::FunctionType *FTy =
+      VMContext.getFunctionType(ObjectPtrTy, Args, false);
     return CGM.CreateRuntimeFunction(FTy, "objc_assign_strongCast");
   }
 
@@ -387,7 +397,7 @@
     // void objc_exception_throw(id)
     std::vector<const llvm::Type*> Args(1, ObjectPtrTy);
     llvm::FunctionType *FTy =
-      llvm::FunctionType::get(llvm::Type::VoidTy, Args, false);
+      VMContext.getFunctionType(llvm::Type::VoidTy, Args, false);
     return CGM.CreateRuntimeFunction(FTy, "objc_exception_throw");
   }
   
@@ -396,7 +406,7 @@
     // void objc_sync_enter (id)
     std::vector<const llvm::Type*> Args(1, ObjectPtrTy);
     llvm::FunctionType *FTy =
-      llvm::FunctionType::get(llvm::Type::VoidTy, Args, false);
+      VMContext.getFunctionType(llvm::Type::VoidTy, Args, false);
     return CGM.CreateRuntimeFunction(FTy, "objc_sync_enter");
   }
   
@@ -405,7 +415,7 @@
     // void objc_sync_exit (id)
     std::vector<const llvm::Type*> Args(1, ObjectPtrTy);
     llvm::FunctionType *FTy =
-    llvm::FunctionType::get(llvm::Type::VoidTy, Args, false);
+      VMContext.getFunctionType(llvm::Type::VoidTy, Args, false);
     return CGM.CreateRuntimeFunction(FTy, "objc_sync_exit");
   }
   
@@ -498,8 +508,9 @@
   /// ExceptionTryEnterFn - LLVM objc_exception_try_enter function.
   llvm::Constant *getExceptionTryEnterFn() {
     std::vector<const llvm::Type*> Params;
-    Params.push_back(llvm::PointerType::getUnqual(ExceptionDataTy));
-    return CGM.CreateRuntimeFunction(llvm::FunctionType::get(llvm::Type::VoidTy,
+    Params.push_back(VMContext.getPointerTypeUnqual(ExceptionDataTy));
+    return CGM.CreateRuntimeFunction(
+                                   VMContext.getFunctionType(llvm::Type::VoidTy,
                                                              Params, false),
                                      "objc_exception_try_enter");
   }
@@ -507,8 +518,9 @@
   /// ExceptionTryExitFn - LLVM objc_exception_try_exit function.
   llvm::Constant *getExceptionTryExitFn() {
     std::vector<const llvm::Type*> Params;
-    Params.push_back(llvm::PointerType::getUnqual(ExceptionDataTy));
-    return CGM.CreateRuntimeFunction(llvm::FunctionType::get(llvm::Type::VoidTy,
+    Params.push_back(VMContext.getPointerTypeUnqual(ExceptionDataTy));
+    return CGM.CreateRuntimeFunction(
+                                   VMContext.getFunctionType(llvm::Type::VoidTy,
                                                              Params, false),
                                      "objc_exception_try_exit");
   }
@@ -516,8 +528,8 @@
   /// ExceptionExtractFn - LLVM objc_exception_extract function.
   llvm::Constant *getExceptionExtractFn() {
     std::vector<const llvm::Type*> Params;
-    Params.push_back(llvm::PointerType::getUnqual(ExceptionDataTy));
-    return CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
+    Params.push_back(VMContext.getPointerTypeUnqual(ExceptionDataTy));
+    return CGM.CreateRuntimeFunction(VMContext.getFunctionType(ObjectPtrTy,
                                                              Params, false),
                                      "objc_exception_extract");
     
@@ -528,7 +540,8 @@
     std::vector<const llvm::Type*> Params;
     Params.push_back(ClassPtrTy);
     Params.push_back(ObjectPtrTy);
-   return CGM.CreateRuntimeFunction(llvm::FunctionType::get(llvm::Type::Int32Ty,
+   return CGM.CreateRuntimeFunction(
+                                  VMContext.getFunctionType(llvm::Type::Int32Ty,
                                                             Params, false),
                                     "objc_exception_match");
     
@@ -537,9 +550,9 @@
   /// SetJmpFn - LLVM _setjmp function.
   llvm::Constant *getSetJmpFn() {
     std::vector<const llvm::Type*> Params;
-    Params.push_back(llvm::PointerType::getUnqual(llvm::Type::Int32Ty));
+    Params.push_back(VMContext.getPointerTypeUnqual(llvm::Type::Int32Ty));
     return
-      CGM.CreateRuntimeFunction(llvm::FunctionType::get(llvm::Type::Int32Ty,
+      CGM.CreateRuntimeFunction(VMContext.getFunctionType(llvm::Type::Int32Ty,
                                                         Params, false),
                                 "_setjmp");
     
@@ -631,7 +644,7 @@
     std::vector<const llvm::Type*> Params;
     Params.push_back(ObjectPtrTy);
     Params.push_back(MessageRefPtrTy);
-    return CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
+    return CGM.CreateRuntimeFunction(VMContext.getFunctionType(ObjectPtrTy,
                                                              Params, true),
                                      "objc_msgSend_fixup");
   }
@@ -641,7 +654,7 @@
     std::vector<const llvm::Type*> Params;
     Params.push_back(ObjectPtrTy);
     Params.push_back(MessageRefPtrTy);
-    return CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
+    return CGM.CreateRuntimeFunction(VMContext.getFunctionType(ObjectPtrTy,
                                                              Params, true),
                                      "objc_msgSend_fpret_fixup");
   }
@@ -651,7 +664,7 @@
     std::vector<const llvm::Type*> Params;
     Params.push_back(ObjectPtrTy);
     Params.push_back(MessageRefPtrTy);
-    return CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
+    return CGM.CreateRuntimeFunction(VMContext.getFunctionType(ObjectPtrTy,
                                                              Params, true),
                                      "objc_msgSend_stret_fixup");
   }
@@ -661,7 +674,7 @@
     std::vector<const llvm::Type*> Params;
     Params.push_back(ObjectPtrTy);
     Params.push_back(MessageRefPtrTy);
-    return CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
+    return CGM.CreateRuntimeFunction(VMContext.getFunctionType(ObjectPtrTy,
                                                              Params, true),
                                      "objc_msgSendId_fixup");
   }
@@ -671,7 +684,7 @@
     std::vector<const llvm::Type*> Params;
     Params.push_back(ObjectPtrTy);
     Params.push_back(MessageRefPtrTy);
-    return CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
+    return CGM.CreateRuntimeFunction(VMContext.getFunctionType(ObjectPtrTy,
                                                              Params, true),
                                      "objc_msgSendId_stret_fixup");
   }
@@ -681,7 +694,7 @@
     std::vector<const llvm::Type*> Params;
     Params.push_back(SuperPtrTy);
     Params.push_back(SuperMessageRefPtrTy);
-    return  CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
+    return  CGM.CreateRuntimeFunction(VMContext.getFunctionType(ObjectPtrTy,
                                                               Params, true),
                                       "objc_msgSendSuper2_fixup");
   }
@@ -692,7 +705,7 @@
     std::vector<const llvm::Type*> Params;
     Params.push_back(SuperPtrTy);
     Params.push_back(SuperMessageRefPtrTy);
-    return  CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
+    return  CGM.CreateRuntimeFunction(VMContext.getFunctionType(ObjectPtrTy,
                                                               Params, true),
                                       "objc_msgSendSuper2_stret_fixup");
   }
@@ -703,22 +716,23 @@
   /// exception personality function.
   llvm::Value *getEHPersonalityPtr() {
     llvm::Constant *Personality = 
-      CGM.CreateRuntimeFunction(llvm::FunctionType::get(llvm::Type::Int32Ty,
+      CGM.CreateRuntimeFunction(VMContext.getFunctionType(llvm::Type::Int32Ty,
                                                         true),
                               "__objc_personality_v0");
-    return llvm::ConstantExpr::getBitCast(Personality, Int8PtrTy);
+    return VMContext.getConstantExprBitCast(Personality, Int8PtrTy);
   }
 
   llvm::Constant *getUnwindResumeOrRethrowFn() {
     std::vector<const llvm::Type*> Params;
     Params.push_back(Int8PtrTy);
-    return CGM.CreateRuntimeFunction(llvm::FunctionType::get(llvm::Type::VoidTy,
+    return CGM.CreateRuntimeFunction(
+                                   VMContext.getFunctionType(llvm::Type::VoidTy,
                                                              Params, false),
                                      "_Unwind_Resume_or_Rethrow");
   }
   
   llvm::Constant *getObjCEndCatchFn() {
-    return CGM.CreateRuntimeFunction(llvm::FunctionType::get(llvm::Type::VoidTy,
+    return CGM.CreateRuntimeFunction(VMContext.getFunctionType(llvm::Type::VoidTy,
                                                              false),
                                      "objc_end_catch");
     
@@ -727,7 +741,7 @@
   llvm::Constant *getObjCBeginCatchFn() {
     std::vector<const llvm::Type*> Params;
     Params.push_back(Int8PtrTy);
-    return CGM.CreateRuntimeFunction(llvm::FunctionType::get(Int8PtrTy,
+    return CGM.CreateRuntimeFunction(VMContext.getFunctionType(Int8PtrTy,
                                                              Params, false),
                                      "objc_begin_catch");
   }
@@ -1366,14 +1380,15 @@
 /* *** Helper Functions *** */
 
 /// getConstantGEP() - Help routine to construct simple GEPs.
-static llvm::Constant *getConstantGEP(llvm::Constant *C, 
+static llvm::Constant *getConstantGEP(llvm::LLVMContext &VMContext,
+                                      llvm::Constant *C, 
                                       unsigned idx0,
                                       unsigned idx1) {
   llvm::Value *Idxs[] = {
-    llvm::ConstantInt::get(llvm::Type::Int32Ty, idx0),
-    llvm::ConstantInt::get(llvm::Type::Int32Ty, idx1)
+    VMContext.getConstantInt(llvm::Type::Int32Ty, idx0),
+    VMContext.getConstantInt(llvm::Type::Int32Ty, idx1)
   };
-  return llvm::ConstantExpr::getGetElementPtr(C, Idxs, 2);
+  return VMContext.getConstantExprGetElementPtr(C, Idxs, 2);
 }
 
 /// hasObjCExceptionAttribute - Return true if this class or any super
@@ -1544,7 +1559,8 @@
                         : ObjCTypes.getSendFn(IsSuper);
   }
   assert(Fn && "EmitLegacyMessageSend - unknown API");
-  Fn = llvm::ConstantExpr::getBitCast(Fn, llvm::PointerType::getUnqual(FTy));
+  Fn = VMContext.getConstantExprBitCast(Fn,
+                                        VMContext.getPointerTypeUnqual(FTy));
   return CGF.EmitCall(FnInfo, Fn, ActualArgs);
 }
 
@@ -1554,7 +1570,7 @@
   // resolved. Investigate. Its also wasteful to look this up over and over.
   LazySymbols.insert(&CGM.getContext().Idents.get("Protocol"));
 
-  return llvm::ConstantExpr::getBitCast(GetProtocolRef(PD),
+  return VMContext.getConstantExprBitCast(GetProtocolRef(PD),
                                         ObjCTypes.ExternalProtocolPtrTy);
 }
 
@@ -1643,7 +1659,7 @@
                             + PD->getNameAsString(),
                        "__OBJC,__cat_cls_meth,regular,no_dead_strip",
                        ClassMethods);
-  llvm::Constant *Init = llvm::ConstantStruct::get(ObjCTypes.ProtocolTy,
+  llvm::Constant *Init = VMContext.getConstantStruct(ObjCTypes.ProtocolTy,
                                                    Values);
   
   if (Entry) {
@@ -1703,7 +1719,7 @@
   uint64_t Size = 
     CGM.getTargetData().getTypeAllocSize(ObjCTypes.ProtocolExtensionTy);
   std::vector<llvm::Constant*> Values(4);
-  Values[0] = llvm::ConstantInt::get(ObjCTypes.IntTy, Size);
+  Values[0] = VMContext.getConstantInt(ObjCTypes.IntTy, Size);
   Values[1] = 
     EmitMethodDescList("\01L_OBJC_PROTOCOL_INSTANCE_METHODS_OPT_" 
                            + PD->getNameAsString(),
@@ -1724,7 +1740,7 @@
     return VMContext.getNullValue(ObjCTypes.ProtocolExtensionPtrTy);
 
   llvm::Constant *Init = 
-    llvm::ConstantStruct::get(ObjCTypes.ProtocolExtensionTy, Values);
+    VMContext.getConstantStruct(ObjCTypes.ProtocolExtensionTy, Values);
 
   // No special section, but goes in llvm.used
   return CreateMetadataVar("\01L_OBJC_PROTOCOLEXT_" + PD->getNameAsString(),
@@ -1758,17 +1774,18 @@
   std::vector<llvm::Constant*> Values(3);
   // This field is only used by the runtime.
   Values[0] = VMContext.getNullValue(ObjCTypes.ProtocolListPtrTy);
-  Values[1] = llvm::ConstantInt::get(ObjCTypes.LongTy, ProtocolRefs.size() - 1);
+  Values[1] = VMContext.getConstantInt(ObjCTypes.LongTy,
+                                       ProtocolRefs.size() - 1);
   Values[2] = 
-    llvm::ConstantArray::get(llvm::ArrayType::get(ObjCTypes.ProtocolPtrTy, 
+    VMContext.getConstantArray(VMContext.getArrayType(ObjCTypes.ProtocolPtrTy, 
                                                   ProtocolRefs.size()), 
                              ProtocolRefs);
   
-  llvm::Constant *Init = llvm::ConstantStruct::get(Values);
+  llvm::Constant *Init = VMContext.getConstantStruct(Values);
   llvm::GlobalVariable *GV = 
     CreateMetadataVar(Name, Init, "__OBJC,__cat_cls_meth,regular,no_dead_strip",
                       4, false);
-  return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.ProtocolListPtrTy);
+  return VMContext.getConstantExprBitCast(GV, ObjCTypes.ProtocolListPtrTy);
 }
 
 /*
@@ -1793,7 +1810,7 @@
     const ObjCPropertyDecl *PD = *I;
     Prop[0] = GetPropertyName(PD->getIdentifier());
     Prop[1] = GetPropertyTypeString(PD, Container);
-    Properties.push_back(llvm::ConstantStruct::get(ObjCTypes.PropertyTy,
+    Properties.push_back(VMContext.getConstantStruct(ObjCTypes.PropertyTy,
                                                    Prop));
   }
 
@@ -1804,12 +1821,12 @@
   unsigned PropertySize = 
     CGM.getTargetData().getTypeAllocSize(ObjCTypes.PropertyTy);
   std::vector<llvm::Constant*> Values(3);
-  Values[0] = llvm::ConstantInt::get(ObjCTypes.IntTy, PropertySize);
-  Values[1] = llvm::ConstantInt::get(ObjCTypes.IntTy, Properties.size());
-  llvm::ArrayType *AT = llvm::ArrayType::get(ObjCTypes.PropertyTy, 
+  Values[0] = VMContext.getConstantInt(ObjCTypes.IntTy, PropertySize);
+  Values[1] = VMContext.getConstantInt(ObjCTypes.IntTy, Properties.size());
+  llvm::ArrayType *AT = VMContext.getArrayType(ObjCTypes.PropertyTy, 
                                              Properties.size());
-  Values[2] = llvm::ConstantArray::get(AT, Properties);
-  llvm::Constant *Init = llvm::ConstantStruct::get(Values);
+  Values[2] = VMContext.getConstantArray(AT, Properties);
+  llvm::Constant *Init = VMContext.getConstantStruct(Values);
 
   llvm::GlobalVariable *GV = 
     CreateMetadataVar(Name, Init, 
@@ -1817,7 +1834,7 @@
                       "__OBJC,__property,regular,no_dead_strip",
                       (ObjCABI == 2) ? 8 : 4, 
                       true);
-  return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.PropertyListPtrTy);
+  return VMContext.getConstantExprBitCast(GV, ObjCTypes.PropertyListPtrTy);
 }
 
 /*
@@ -1829,10 +1846,11 @@
 llvm::Constant *
 CGObjCMac::GetMethodDescriptionConstant(const ObjCMethodDecl *MD) {
   std::vector<llvm::Constant*> Desc(2);
-  Desc[0] = llvm::ConstantExpr::getBitCast(GetMethodVarName(MD->getSelector()),
+  Desc[0] =
+          VMContext.getConstantExprBitCast(GetMethodVarName(MD->getSelector()),
                                            ObjCTypes.SelectorPtrTy);
   Desc[1] = GetMethodVarType(MD);
-  return llvm::ConstantStruct::get(ObjCTypes.MethodDescriptionTy,
+  return VMContext.getConstantStruct(ObjCTypes.MethodDescriptionTy,
                                    Desc);
 }
 
@@ -1844,14 +1862,14 @@
     return VMContext.getNullValue(ObjCTypes.MethodDescriptionListPtrTy);
 
   std::vector<llvm::Constant*> Values(2);
-  Values[0] = llvm::ConstantInt::get(ObjCTypes.IntTy, Methods.size());
-  llvm::ArrayType *AT = llvm::ArrayType::get(ObjCTypes.MethodDescriptionTy, 
+  Values[0] = VMContext.getConstantInt(ObjCTypes.IntTy, Methods.size());
+  llvm::ArrayType *AT = VMContext.getArrayType(ObjCTypes.MethodDescriptionTy, 
                                              Methods.size());
-  Values[1] = llvm::ConstantArray::get(AT, Methods);
-  llvm::Constant *Init = llvm::ConstantStruct::get(Values);
+  Values[1] = VMContext.getConstantArray(AT, Methods);
+  llvm::Constant *Init = VMContext.getConstantStruct(Values);
 
   llvm::GlobalVariable *GV = CreateMetadataVar(Name, Init, Section, 4, true);
-  return llvm::ConstantExpr::getBitCast(GV, 
+  return VMContext.getConstantExprBitCast(GV, 
                                         ObjCTypes.MethodDescriptionListPtrTy);
 }
 
@@ -1912,7 +1930,7 @@
   } else {
     Values[4] = VMContext.getNullValue(ObjCTypes.ProtocolListPtrTy);
   }
-  Values[5] = llvm::ConstantInt::get(ObjCTypes.IntTy, Size);
+  Values[5] = VMContext.getConstantInt(ObjCTypes.IntTy, Size);
 
   // If there is no category @interface then there can be no properties.
   if (Category) {
@@ -1922,7 +1940,7 @@
     Values[6] = VMContext.getNullValue(ObjCTypes.PropertyListPtrTy);
   }
   
-  llvm::Constant *Init = llvm::ConstantStruct::get(ObjCTypes.CategoryTy,
+  llvm::Constant *Init = VMContext.getConstantStruct(ObjCTypes.CategoryTy,
                                                    Values);
 
   llvm::GlobalVariable *GV = 
@@ -2016,16 +2034,16 @@
     LazySymbols.insert(Super->getIdentifier());
 
     Values[ 1] = 
-      llvm::ConstantExpr::getBitCast(GetClassName(Super->getIdentifier()),
+      VMContext.getConstantExprBitCast(GetClassName(Super->getIdentifier()),
                                      ObjCTypes.ClassPtrTy);
   } else {
     Values[ 1] = VMContext.getNullValue(ObjCTypes.ClassPtrTy);
   }
   Values[ 2] = GetClassName(ID->getIdentifier());
   // Version is always 0.
-  Values[ 3] = llvm::ConstantInt::get(ObjCTypes.LongTy, 0);
-  Values[ 4] = llvm::ConstantInt::get(ObjCTypes.LongTy, Flags);
-  Values[ 5] = llvm::ConstantInt::get(ObjCTypes.LongTy, Size);
+  Values[ 3] = VMContext.getConstantInt(ObjCTypes.LongTy, 0);
+  Values[ 4] = VMContext.getConstantInt(ObjCTypes.LongTy, Flags);
+  Values[ 5] = VMContext.getConstantInt(ObjCTypes.LongTy, Size);
   Values[ 6] = EmitIvarList(ID, false);
   Values[ 7] = 
     EmitMethodList("\01L_OBJC_INSTANCE_METHODS_" + ID->getNameAsString(),
@@ -2036,7 +2054,7 @@
   Values[ 9] = Protocols;
   Values[10] = BuildIvarLayout(ID, true); 
   Values[11] = EmitClassExtension(ID);
-  llvm::Constant *Init = llvm::ConstantStruct::get(ObjCTypes.ClassTy,
+  llvm::Constant *Init = VMContext.getConstantStruct(ObjCTypes.ClassTy,
                                                    Values);
 
   llvm::GlobalVariable *GV = 
@@ -2061,23 +2079,23 @@
   while (const ObjCInterfaceDecl *Super = Root->getSuperClass())
     Root = Super;
   Values[ 0] = 
-    llvm::ConstantExpr::getBitCast(GetClassName(Root->getIdentifier()),
+    VMContext.getConstantExprBitCast(GetClassName(Root->getIdentifier()),
                                    ObjCTypes.ClassPtrTy);
   // The super class for the metaclass is emitted as the name of the
   // super class. The runtime fixes this up to point to the
   // *metaclass* for the super class.
   if (ObjCInterfaceDecl *Super = ID->getClassInterface()->getSuperClass()) {
     Values[ 1] = 
-      llvm::ConstantExpr::getBitCast(GetClassName(Super->getIdentifier()),
+      VMContext.getConstantExprBitCast(GetClassName(Super->getIdentifier()),
                                      ObjCTypes.ClassPtrTy);
   } else {
     Values[ 1] = VMContext.getNullValue(ObjCTypes.ClassPtrTy);
   }
   Values[ 2] = GetClassName(ID->getIdentifier());
   // Version is always 0.
-  Values[ 3] = llvm::ConstantInt::get(ObjCTypes.LongTy, 0);
-  Values[ 4] = llvm::ConstantInt::get(ObjCTypes.LongTy, Flags);
-  Values[ 5] = llvm::ConstantInt::get(ObjCTypes.LongTy, Size);
+  Values[ 3] = VMContext.getConstantInt(ObjCTypes.LongTy, 0);
+  Values[ 4] = VMContext.getConstantInt(ObjCTypes.LongTy, Flags);
+  Values[ 5] = VMContext.getConstantInt(ObjCTypes.LongTy, Size);
   Values[ 6] = EmitIvarList(ID, true);
   Values[ 7] = 
     EmitMethodList("\01L_OBJC_CLASS_METHODS_" + ID->getNameAsString(),
@@ -2090,7 +2108,7 @@
   Values[10] = VMContext.getNullValue(ObjCTypes.Int8PtrTy);
   // The class extension is always unused for metaclasses.
   Values[11] = VMContext.getNullValue(ObjCTypes.ClassExtensionPtrTy);
-  llvm::Constant *Init = llvm::ConstantStruct::get(ObjCTypes.ClassTy,
+  llvm::Constant *Init = VMContext.getConstantStruct(ObjCTypes.ClassTy,
                                                    Values);
 
   std::string Name("\01L_OBJC_METACLASS_");
@@ -2153,7 +2171,7 @@
     CGM.getTargetData().getTypeAllocSize(ObjCTypes.ClassExtensionTy);
 
   std::vector<llvm::Constant*> Values(3);
-  Values[0] = llvm::ConstantInt::get(ObjCTypes.IntTy, Size);
+  Values[0] = VMContext.getConstantInt(ObjCTypes.IntTy, Size);
   Values[1] = BuildIvarLayout(ID, false);
   Values[2] = EmitPropertyList("\01l_OBJC_$_PROP_LIST_" + ID->getNameAsString(),
                                ID, ID->getClassInterface(), ObjCTypes);
@@ -2163,7 +2181,7 @@
     return VMContext.getNullValue(ObjCTypes.ClassExtensionPtrTy);
 
   llvm::Constant *Init = 
-    llvm::ConstantStruct::get(ObjCTypes.ClassExtensionTy, Values);
+    VMContext.getConstantStruct(ObjCTypes.ClassExtensionTy, Values);
   return CreateMetadataVar("\01L_OBJC_CLASSEXT_" + ID->getNameAsString(),
                            Init, "__OBJC,__class_ext,regular,no_dead_strip", 
                            4, true);
@@ -2206,9 +2224,9 @@
       continue;    
     Ivar[0] = GetMethodVarName(IVD->getIdentifier());
     Ivar[1] = GetMethodVarType(IVD);
-    Ivar[2] = llvm::ConstantInt::get(ObjCTypes.IntTy, 
+    Ivar[2] = VMContext.getConstantInt(ObjCTypes.IntTy, 
                                      ComputeIvarBaseOffset(CGM, OID, IVD));
-    Ivars.push_back(llvm::ConstantStruct::get(ObjCTypes.IvarTy, Ivar));
+    Ivars.push_back(VMContext.getConstantStruct(ObjCTypes.IvarTy, Ivar));
   }
 
   // Return null for empty list.
@@ -2216,11 +2234,11 @@
     return VMContext.getNullValue(ObjCTypes.IvarListPtrTy);
 
   std::vector<llvm::Constant*> Values(2);
-  Values[0] = llvm::ConstantInt::get(ObjCTypes.IntTy, Ivars.size());
-  llvm::ArrayType *AT = llvm::ArrayType::get(ObjCTypes.IvarTy,
+  Values[0] = VMContext.getConstantInt(ObjCTypes.IntTy, Ivars.size());
+  llvm::ArrayType *AT = VMContext.getArrayType(ObjCTypes.IvarTy,
                                              Ivars.size());
-  Values[1] = llvm::ConstantArray::get(AT, Ivars);
-  llvm::Constant *Init = llvm::ConstantStruct::get(Values);
+  Values[1] = VMContext.getConstantArray(AT, Ivars);
+  llvm::Constant *Init = VMContext.getConstantStruct(Values);
 
   llvm::GlobalVariable *GV;
   if (ForClass)
@@ -2232,7 +2250,7 @@
                            + ID->getNameAsString(),
                            Init, "__OBJC,__instance_vars,regular,no_dead_strip",
                            4, true);
-  return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.IvarListPtrTy);
+  return VMContext.getConstantExprBitCast(GV, ObjCTypes.IvarListPtrTy);
 }
 
 /*
@@ -2260,11 +2278,11 @@
   
   std::vector<llvm::Constant*> Method(3);
   Method[0] = 
-    llvm::ConstantExpr::getBitCast(GetMethodVarName(MD->getSelector()),
+    VMContext.getConstantExprBitCast(GetMethodVarName(MD->getSelector()),
                                    ObjCTypes.SelectorPtrTy);
   Method[1] = GetMethodVarType(MD);
-  Method[2] = llvm::ConstantExpr::getBitCast(Fn, ObjCTypes.Int8PtrTy);
-  return llvm::ConstantStruct::get(ObjCTypes.MethodTy, Method);
+  Method[2] = VMContext.getConstantExprBitCast(Fn, ObjCTypes.Int8PtrTy);
+  return VMContext.getConstantStruct(ObjCTypes.MethodTy, Method);
 }
 
 llvm::Constant *CGObjCMac::EmitMethodList(const std::string &Name,
@@ -2276,14 +2294,14 @@
 
   std::vector<llvm::Constant*> Values(3);
   Values[0] = VMContext.getNullValue(ObjCTypes.Int8PtrTy);
-  Values[1] = llvm::ConstantInt::get(ObjCTypes.IntTy, Methods.size());
-  llvm::ArrayType *AT = llvm::ArrayType::get(ObjCTypes.MethodTy,
+  Values[1] = VMContext.getConstantInt(ObjCTypes.IntTy, Methods.size());
+  llvm::ArrayType *AT = VMContext.getArrayType(ObjCTypes.MethodTy,
                                              Methods.size());
-  Values[2] = llvm::ConstantArray::get(AT, Methods);
-  llvm::Constant *Init = llvm::ConstantStruct::get(Values);
+  Values[2] = VMContext.getConstantArray(AT, Methods);
+  llvm::Constant *Init = VMContext.getConstantStruct(Values);
 
   llvm::GlobalVariable *GV = CreateMetadataVar(Name, Init, Section, 4, true);
-  return llvm::ConstantExpr::getBitCast(GV,
+  return VMContext.getConstantExprBitCast(GV,
                                         ObjCTypes.MethodListPtrTy);
 }
 
@@ -2468,7 +2486,7 @@
                                                  "_rethrow");
   llvm::Value *CallTryExitPtr = CGF.CreateTempAlloca(llvm::Type::Int1Ty,
                                                      "_call_try_exit");
-  CGF.Builder.CreateStore(llvm::ConstantInt::getTrue(), CallTryExitPtr);
+  CGF.Builder.CreateStore(VMContext.getConstantIntTrue(), CallTryExitPtr);
   
   // Enter a new try block and call setjmp.
   CGF.Builder.CreateCall(ObjCTypes.getExceptionTryEnterFn(), ExceptionData);
@@ -2501,7 +2519,7 @@
   if (!isTry)
   {
     CGF.Builder.CreateStore(Caught, RethrowPtr);
-    CGF.Builder.CreateStore(llvm::ConstantInt::getFalse(), CallTryExitPtr);
+    CGF.Builder.CreateStore(VMContext.getConstantIntFalse(), CallTryExitPtr);
     CGF.EmitBranchThroughCleanup(FinallyRethrow);
   }
   else if (const ObjCAtCatchStmt* CatchStmt = 
@@ -2602,11 +2620,11 @@
                     CGF.Builder.CreateCall(ObjCTypes.getExceptionExtractFn(),
                                            ExceptionData), 
                             RethrowPtr);
-    CGF.Builder.CreateStore(llvm::ConstantInt::getFalse(), CallTryExitPtr);
+    CGF.Builder.CreateStore(VMContext.getConstantIntFalse(), CallTryExitPtr);
     CGF.EmitBranchThroughCleanup(FinallyRethrow);
   } else {
     CGF.Builder.CreateStore(Caught, RethrowPtr);
-    CGF.Builder.CreateStore(llvm::ConstantInt::getFalse(), CallTryExitPtr);
+    CGF.Builder.CreateStore(VMContext.getConstantIntFalse(), CallTryExitPtr);
     CGF.EmitBranchThroughCleanup(FinallyRethrow);
   }
   
@@ -2777,7 +2795,7 @@
                                                unsigned long size) {
   SrcPtr = CGF.Builder.CreateBitCast(SrcPtr, ObjCTypes.Int8PtrTy);
   DestPtr = CGF.Builder.CreateBitCast(DestPtr, ObjCTypes.Int8PtrTy);
-  llvm::Value *N = llvm::ConstantInt::get(ObjCTypes.LongTy, size);
+  llvm::Value *N = VMContext.getConstantInt(ObjCTypes.LongTy, size);
   CGF.Builder.CreateCall3(ObjCTypes.GcMemmoveCollectableFn(),
                           DestPtr, SrcPtr, N);
   return;
@@ -2799,7 +2817,7 @@
                                        const ObjCInterfaceDecl *Interface,
                                        const ObjCIvarDecl *Ivar) {
   uint64_t Offset = ComputeIvarBaseOffset(CGM, Interface, Ivar);
-  return llvm::ConstantInt::get(
+  return VMContext.getConstantInt(
                             CGM.getTypes().ConvertType(CGM.getContext().LongTy),
                             Offset);
 }
@@ -2841,10 +2859,10 @@
 
   // Emitted as int[2];
   llvm::Constant *values[2] = {
-    llvm::ConstantInt::get(llvm::Type::Int32Ty, version),
-    llvm::ConstantInt::get(llvm::Type::Int32Ty, flags)
+    VMContext.getConstantInt(llvm::Type::Int32Ty, version),
+    VMContext.getConstantInt(llvm::Type::Int32Ty, flags)
   };
-  llvm::ArrayType *AT = llvm::ArrayType::get(llvm::Type::Int32Ty, 2);  
+  llvm::ArrayType *AT = VMContext.getArrayType(llvm::Type::Int32Ty, 2);  
 
   const char *Section;
   if (ObjCABI == 1)
@@ -2853,7 +2871,7 @@
     Section = "__DATA, __objc_imageinfo, regular, no_dead_strip";
   llvm::GlobalVariable *GV = 
     CreateMetadataVar("\01L_OBJC_IMAGE_INFO",
-                      llvm::ConstantArray::get(AT, values, 2),
+                      VMContext.getConstantArray(AT, values, 2),
                       Section,
                       0,
                       true);
@@ -2875,13 +2893,13 @@
   uint64_t Size = CGM.getTargetData().getTypeAllocSize(ObjCTypes.ModuleTy);
   
   std::vector<llvm::Constant*> Values(4);
-  Values[0] = llvm::ConstantInt::get(ObjCTypes.LongTy, ModuleVersion);
-  Values[1] = llvm::ConstantInt::get(ObjCTypes.LongTy, Size);
+  Values[0] = VMContext.getConstantInt(ObjCTypes.LongTy, ModuleVersion);
+  Values[1] = VMContext.getConstantInt(ObjCTypes.LongTy, Size);
   // This used to be the filename, now it is unused. <rdr://4327263>
   Values[2] = GetClassName(&CGM.getContext().Idents.get(""));
   Values[3] = EmitModuleSymbols();
   CreateMetadataVar("\01L_OBJC_MODULES", 
-                    llvm::ConstantStruct::get(ObjCTypes.ModuleTy, Values),
+                    VMContext.getConstantStruct(ObjCTypes.ModuleTy, Values),
                     "__OBJC,__module_info,regular,no_dead_strip",
                     4, true);
 }
@@ -2895,34 +2913,34 @@
     return VMContext.getNullValue(ObjCTypes.SymtabPtrTy);
 
   std::vector<llvm::Constant*> Values(5);
-  Values[0] = llvm::ConstantInt::get(ObjCTypes.LongTy, 0);
+  Values[0] = VMContext.getConstantInt(ObjCTypes.LongTy, 0);
   Values[1] = VMContext.getNullValue(ObjCTypes.SelectorPtrTy);
-  Values[2] = llvm::ConstantInt::get(ObjCTypes.ShortTy, NumClasses);
-  Values[3] = llvm::ConstantInt::get(ObjCTypes.ShortTy, NumCategories);
+  Values[2] = VMContext.getConstantInt(ObjCTypes.ShortTy, NumClasses);
+  Values[3] = VMContext.getConstantInt(ObjCTypes.ShortTy, NumCategories);
 
   // The runtime expects exactly the list of defined classes followed
   // by the list of defined categories, in a single array.
   std::vector<llvm::Constant*> Symbols(NumClasses + NumCategories);
   for (unsigned i=0; i<NumClasses; i++)
-    Symbols[i] = llvm::ConstantExpr::getBitCast(DefinedClasses[i],
+    Symbols[i] = VMContext.getConstantExprBitCast(DefinedClasses[i],
                                                 ObjCTypes.Int8PtrTy);
   for (unsigned i=0; i<NumCategories; i++)
     Symbols[NumClasses + i] = 
-      llvm::ConstantExpr::getBitCast(DefinedCategories[i],
+      VMContext.getConstantExprBitCast(DefinedCategories[i],
                                      ObjCTypes.Int8PtrTy);
 
   Values[4] = 
-    llvm::ConstantArray::get(llvm::ArrayType::get(ObjCTypes.Int8PtrTy,
+    VMContext.getConstantArray(VMContext.getArrayType(ObjCTypes.Int8PtrTy,
                                                   NumClasses + NumCategories),
                              Symbols);
 
-  llvm::Constant *Init = llvm::ConstantStruct::get(Values);  
+  llvm::Constant *Init = VMContext.getConstantStruct(Values);  
 
   llvm::GlobalVariable *GV =
     CreateMetadataVar("\01L_OBJC_SYMBOLS", Init,
                       "__OBJC,__symbols,regular,no_dead_strip",
                       4, true);
-  return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.SymtabPtrTy);
+  return VMContext.getConstantExprBitCast(GV, ObjCTypes.SymtabPtrTy);
 }
 
 llvm::Value *CGObjCMac::EmitClassRef(CGBuilderTy &Builder, 
@@ -2933,7 +2951,7 @@
   
   if (!Entry) {
     llvm::Constant *Casted = 
-      llvm::ConstantExpr::getBitCast(GetClassName(ID->getIdentifier()),
+      VMContext.getConstantExprBitCast(GetClassName(ID->getIdentifier()),
                                      ObjCTypes.ClassPtrTy);
     Entry = 
       CreateMetadataVar("\01L_OBJC_CLASS_REFERENCES_", Casted,
@@ -2949,7 +2967,7 @@
   
   if (!Entry) {
     llvm::Constant *Casted = 
-      llvm::ConstantExpr::getBitCast(GetMethodVarName(Sel),
+      VMContext.getConstantExprBitCast(GetMethodVarName(Sel),
                                      ObjCTypes.SelectorPtrTy);
     Entry = 
       CreateMetadataVar("\01L_OBJC_SELECTOR_REFERENCES_", Casted,
@@ -2965,11 +2983,11 @@
 
   if (!Entry)
     Entry = CreateMetadataVar("\01L_OBJC_CLASS_NAME_", 
-                              llvm::ConstantArray::get(Ident->getName()), 
+                              VMContext.getConstantArray(Ident->getName()), 
                               "__TEXT,__cstring,cstring_literals",
                               1, true);
 
-  return getConstantGEP(Entry, 0, 0);
+  return getConstantGEP(VMContext, Entry, 0, 0);
 }
 
 /// GetIvarLayoutName - Returns a unique constant for the given
@@ -3179,7 +3197,7 @@
   bool hasUnion = false;
   
   unsigned int WordsToScan, WordsToSkip;
-  const llvm::Type *PtrTy = llvm::PointerType::getUnqual(llvm::Type::Int8Ty);
+  const llvm::Type *PtrTy = VMContext.getPointerTypeUnqual(llvm::Type::Int8Ty);
   if (CGM.getLangOptions().getGCMode() == LangOptions::NonGC)
     return VMContext.getNullValue(PtrTy);
   
@@ -3344,10 +3362,10 @@
   if (ForStrongLayout && !BytesSkipped)
     return VMContext.getNullValue(PtrTy);
   llvm::GlobalVariable * Entry = CreateMetadataVar("\01L_OBJC_CLASS_NAME_",
-                                      llvm::ConstantArray::get(BitMap.c_str()),
+                                    VMContext.getConstantArray(BitMap.c_str()),
                                       "__TEXT,__cstring,cstring_literals",
                                       1, true);
-    return getConstantGEP(Entry, 0, 0);
+    return getConstantGEP(VMContext, Entry, 0, 0);
 }
 
 llvm::Constant *CGObjCCommonMac::GetMethodVarName(Selector Sel) {
@@ -3356,11 +3374,11 @@
   // FIXME: Avoid std::string copying.
   if (!Entry)
     Entry = CreateMetadataVar("\01L_OBJC_METH_VAR_NAME_", 
-                              llvm::ConstantArray::get(Sel.getAsString()),
+                              VMContext.getConstantArray(Sel.getAsString()),
                               "__TEXT,__cstring,cstring_literals",
                               1, true);
 
-  return getConstantGEP(Entry, 0, 0);
+  return getConstantGEP(VMContext, Entry, 0, 0);
 }
 
 // FIXME: Merge into a single cstring creation function.
@@ -3381,11 +3399,11 @@
 
   if (!Entry)
     Entry = CreateMetadataVar("\01L_OBJC_METH_VAR_TYPE_",
-                              llvm::ConstantArray::get(TypeStr),
+                              VMContext.getConstantArray(TypeStr),
                               "__TEXT,__cstring,cstring_literals",
                               1, true);
     
-  return getConstantGEP(Entry, 0, 0);
+  return getConstantGEP(VMContext, Entry, 0, 0);
 }
 
 llvm::Constant *CGObjCCommonMac::GetMethodVarType(const ObjCMethodDecl *D) {
@@ -3397,11 +3415,11 @@
 
   if (!Entry)
     Entry = CreateMetadataVar("\01L_OBJC_METH_VAR_TYPE_",
-                              llvm::ConstantArray::get(TypeStr),
+                              VMContext.getConstantArray(TypeStr),
                               "__TEXT,__cstring,cstring_literals",
                               1, true);
 
-  return getConstantGEP(Entry, 0, 0);
+  return getConstantGEP(VMContext, Entry, 0, 0);
 }
 
 // FIXME: Merge into a single cstring creation function.
@@ -3410,11 +3428,11 @@
   
   if (!Entry)
     Entry = CreateMetadataVar("\01L_OBJC_PROP_NAME_ATTR_", 
-                              llvm::ConstantArray::get(Ident->getName()),
+                              VMContext.getConstantArray(Ident->getName()),
                               "__TEXT,__cstring,cstring_literals",
                               1, true);
 
-  return getConstantGEP(Entry, 0, 0);
+  return getConstantGEP(VMContext, Entry, 0, 0);
 }
 
 // FIXME: Merge into a single cstring creation function.
@@ -3448,10 +3466,11 @@
 
 void CGObjCCommonMac::MergeMetadataGlobals(
                                   std::vector<llvm::Constant*> &UsedArray) {
-  llvm::Type *i8PTy = llvm::PointerType::getUnqual(llvm::Type::Int8Ty);
+  llvm::Type *i8PTy = VMContext.getPointerTypeUnqual(llvm::Type::Int8Ty);
   for (std::vector<llvm::GlobalVariable*>::iterator i = UsedGlobals.begin(),
        e = UsedGlobals.end(); i != e; ++i) {
-    UsedArray.push_back(llvm::ConstantExpr::getBitCast(cast<llvm::Constant>(*i), 
+    UsedArray.push_back(
+                      VMContext.getConstantExprBitCast(cast<llvm::Constant>(*i), 
                                                        i8PTy));
   }
 }
@@ -3473,7 +3492,7 @@
     Values[3] = Values[4] =
       VMContext.getNullValue(ObjCTypes.MethodDescriptionListPtrTy);
     i->second->setLinkage(llvm::GlobalValue::InternalLinkage);
-    i->second->setInitializer(llvm::ConstantStruct::get(ObjCTypes.ProtocolTy,
+    i->second->setInitializer(VMContext.getConstantStruct(ObjCTypes.ProtocolTy,
                                                         Values));
   }
 
@@ -3511,7 +3530,7 @@
 /* *** */
 
 ObjCCommonTypesHelper::ObjCCommonTypesHelper(CodeGen::CodeGenModule &cgm)
-: CGM(cgm)
+: VMContext(cgm.getLLVMContext()), CGM(cgm)
 {
   CodeGen::CodeGenTypes &Types = CGM.getTypes();
   ASTContext &Ctx = CGM.getContext();
@@ -3520,16 +3539,16 @@
   IntTy = Types.ConvertType(Ctx.IntTy);
   LongTy = Types.ConvertType(Ctx.LongTy);
   LongLongTy = Types.ConvertType(Ctx.LongLongTy);
-  Int8PtrTy = llvm::PointerType::getUnqual(llvm::Type::Int8Ty);
+  Int8PtrTy = VMContext.getPointerTypeUnqual(llvm::Type::Int8Ty);
   
   ObjectPtrTy = Types.ConvertType(Ctx.getObjCIdType());
-  PtrObjectPtrTy = llvm::PointerType::getUnqual(ObjectPtrTy);
+  PtrObjectPtrTy = VMContext.getPointerTypeUnqual(ObjectPtrTy);
   SelectorPtrTy = Types.ConvertType(Ctx.getObjCSelType());
   
   // FIXME: It would be nice to unify this with the opaque type, so that the IR
   // comes out a bit cleaner.
   const llvm::Type *T = Types.ConvertType(Ctx.getObjCProtoType());
-  ExternalProtocolPtrTy = llvm::PointerType::getUnqual(T);
+  ExternalProtocolPtrTy = VMContext.getPointerTypeUnqual(T);
   
   // I'm not sure I like this. The implicit coordination is a bit
   // gross. We should solve this in a reasonable fashion because this
@@ -3556,13 +3575,13 @@
   SuperPtrCTy = Ctx.getPointerType(SuperCTy);
   
   SuperTy = cast<llvm::StructType>(Types.ConvertType(SuperCTy));
-  SuperPtrTy = llvm::PointerType::getUnqual(SuperTy); 
+  SuperPtrTy = VMContext.getPointerTypeUnqual(SuperTy); 
   
   // struct _prop_t {
   //   char *name;
   //   char *attributes; 
   // }
-  PropertyTy = llvm::StructType::get(Int8PtrTy, Int8PtrTy, NULL);
+  PropertyTy = VMContext.getStructType(Int8PtrTy, Int8PtrTy, NULL);
   CGM.getModule().addTypeName("struct._prop_t", 
                               PropertyTy);
   
@@ -3571,30 +3590,30 @@
   //   uint32_t count_of_properties;
   //   struct _prop_t prop_list[count_of_properties];
   // }
-  PropertyListTy = llvm::StructType::get(IntTy,
+  PropertyListTy = VMContext.getStructType(IntTy,
                                          IntTy,
-                                         llvm::ArrayType::get(PropertyTy, 0),
+                                         VMContext.getArrayType(PropertyTy, 0),
                                          NULL);
   CGM.getModule().addTypeName("struct._prop_list_t", 
                               PropertyListTy);
   // struct _prop_list_t *
-  PropertyListPtrTy = llvm::PointerType::getUnqual(PropertyListTy);
+  PropertyListPtrTy = VMContext.getPointerTypeUnqual(PropertyListTy);
   
   // struct _objc_method {
   //   SEL _cmd;
   //   char *method_type;
   //   char *_imp;
   // }
-  MethodTy = llvm::StructType::get(SelectorPtrTy,
+  MethodTy = VMContext.getStructType(SelectorPtrTy,
                                    Int8PtrTy,
                                    Int8PtrTy,
                                    NULL);
   CGM.getModule().addTypeName("struct._objc_method", MethodTy);
   
   // struct _objc_cache *
-  CacheTy = llvm::OpaqueType::get();
+  CacheTy = VMContext.getOpaqueType();
   CGM.getModule().addTypeName("struct._objc_cache", CacheTy);
-  CachePtrTy = llvm::PointerType::getUnqual(CacheTy);
+  CachePtrTy = VMContext.getPointerTypeUnqual(CacheTy);
 }
 
 ObjCTypesHelper::ObjCTypesHelper(CodeGen::CodeGenModule &cgm) 
@@ -3605,7 +3624,7 @@
   //   char *types;
   // }
   MethodDescriptionTy = 
-    llvm::StructType::get(SelectorPtrTy,
+    VMContext.getStructType(SelectorPtrTy,
                           Int8PtrTy,
                           NULL);
   CGM.getModule().addTypeName("struct._objc_method_description", 
@@ -3616,15 +3635,15 @@
   //   struct _objc_method_description[1];
   // }
   MethodDescriptionListTy = 
-    llvm::StructType::get(IntTy,
-                          llvm::ArrayType::get(MethodDescriptionTy, 0),
+    VMContext.getStructType(IntTy,
+                          VMContext.getArrayType(MethodDescriptionTy, 0),
                           NULL);
   CGM.getModule().addTypeName("struct._objc_method_description_list", 
                               MethodDescriptionListTy);
   
   // struct _objc_method_description_list *
   MethodDescriptionListPtrTy = 
-    llvm::PointerType::getUnqual(MethodDescriptionListTy);
+    VMContext.getPointerTypeUnqual(MethodDescriptionListTy);
 
   // Protocol description structures
 
@@ -3635,7 +3654,7 @@
   //   struct _objc_property_list *instance_properties;
   // }
   ProtocolExtensionTy = 
-    llvm::StructType::get(IntTy,
+    VMContext.getStructType(IntTy,
                           MethodDescriptionListPtrTy,
                           MethodDescriptionListPtrTy,
                           PropertyListPtrTy,
@@ -3644,17 +3663,17 @@
                               ProtocolExtensionTy);
   
   // struct _objc_protocol_extension *
-  ProtocolExtensionPtrTy = llvm::PointerType::getUnqual(ProtocolExtensionTy);
+  ProtocolExtensionPtrTy = VMContext.getPointerTypeUnqual(ProtocolExtensionTy);
 
   // Handle recursive construction of Protocol and ProtocolList types
 
-  llvm::PATypeHolder ProtocolTyHolder = llvm::OpaqueType::get();
-  llvm::PATypeHolder ProtocolListTyHolder = llvm::OpaqueType::get();
+  llvm::PATypeHolder ProtocolTyHolder = VMContext.getOpaqueType();
+  llvm::PATypeHolder ProtocolListTyHolder = VMContext.getOpaqueType();
 
   const llvm::Type *T = 
-    llvm::StructType::get(llvm::PointerType::getUnqual(ProtocolListTyHolder),
+    VMContext.getStructType(VMContext.getPointerTypeUnqual(ProtocolListTyHolder),
                           LongTy,
-                          llvm::ArrayType::get(ProtocolTyHolder, 0),
+                          VMContext.getArrayType(ProtocolTyHolder, 0),
                           NULL);
   cast<llvm::OpaqueType>(ProtocolListTyHolder.get())->refineAbstractTypeTo(T);
 
@@ -3665,9 +3684,9 @@
   //   struct _objc_method_description_list *instance_methods;
   //   struct _objc_method_description_list *class_methods;
   // }
-  T = llvm::StructType::get(ProtocolExtensionPtrTy,
+  T = VMContext.getStructType(ProtocolExtensionPtrTy,
                             Int8PtrTy,
-                            llvm::PointerType::getUnqual(ProtocolListTyHolder),
+                           VMContext.getPointerTypeUnqual(ProtocolListTyHolder),
                             MethodDescriptionListPtrTy,
                             MethodDescriptionListPtrTy,
                             NULL);
@@ -3677,11 +3696,11 @@
   CGM.getModule().addTypeName("struct._objc_protocol_list", 
                               ProtocolListTy);
   // struct _objc_protocol_list *
-  ProtocolListPtrTy = llvm::PointerType::getUnqual(ProtocolListTy);
+  ProtocolListPtrTy = VMContext.getPointerTypeUnqual(ProtocolListTy);
 
   ProtocolTy = cast<llvm::StructType>(ProtocolTyHolder.get());
   CGM.getModule().addTypeName("struct._objc_protocol", ProtocolTy);
-  ProtocolPtrTy = llvm::PointerType::getUnqual(ProtocolTy);
+  ProtocolPtrTy = VMContext.getPointerTypeUnqual(ProtocolTy);
 
   // Class description structures
 
@@ -3690,32 +3709,32 @@
   //   char *ivar_type;
   //   int  ivar_offset;
   // }
-  IvarTy = llvm::StructType::get(Int8PtrTy, 
+  IvarTy = VMContext.getStructType(Int8PtrTy, 
                                  Int8PtrTy, 
                                  IntTy, 
                                  NULL);
   CGM.getModule().addTypeName("struct._objc_ivar", IvarTy);
 
   // struct _objc_ivar_list *
-  IvarListTy = llvm::OpaqueType::get();
+  IvarListTy = VMContext.getOpaqueType();
   CGM.getModule().addTypeName("struct._objc_ivar_list", IvarListTy);
-  IvarListPtrTy = llvm::PointerType::getUnqual(IvarListTy);
+  IvarListPtrTy = VMContext.getPointerTypeUnqual(IvarListTy);
 
   // struct _objc_method_list *
-  MethodListTy = llvm::OpaqueType::get();
+  MethodListTy = VMContext.getOpaqueType();
   CGM.getModule().addTypeName("struct._objc_method_list", MethodListTy);
-  MethodListPtrTy = llvm::PointerType::getUnqual(MethodListTy);
+  MethodListPtrTy = VMContext.getPointerTypeUnqual(MethodListTy);
 
   // struct _objc_class_extension *
   ClassExtensionTy = 
-    llvm::StructType::get(IntTy,
+    VMContext.getStructType(IntTy,
                           Int8PtrTy,
                           PropertyListPtrTy,
                           NULL);
   CGM.getModule().addTypeName("struct._objc_class_extension", ClassExtensionTy);
-  ClassExtensionPtrTy = llvm::PointerType::getUnqual(ClassExtensionTy);
+  ClassExtensionPtrTy = VMContext.getPointerTypeUnqual(ClassExtensionTy);
 
-  llvm::PATypeHolder ClassTyHolder = llvm::OpaqueType::get();
+  llvm::PATypeHolder ClassTyHolder = VMContext.getOpaqueType();
 
   // struct _objc_class {
   //   Class isa;
@@ -3731,8 +3750,8 @@
   //   char *ivar_layout;
   //   struct _objc_class_ext *ext;
   // };
-  T = llvm::StructType::get(llvm::PointerType::getUnqual(ClassTyHolder),
-                            llvm::PointerType::getUnqual(ClassTyHolder),
+  T = VMContext.getStructType(VMContext.getPointerTypeUnqual(ClassTyHolder),
+                            VMContext.getPointerTypeUnqual(ClassTyHolder),
                             Int8PtrTy,
                             LongTy,
                             LongTy,
@@ -3748,7 +3767,7 @@
   
   ClassTy = cast<llvm::StructType>(ClassTyHolder.get());
   CGM.getModule().addTypeName("struct._objc_class", ClassTy);
-  ClassPtrTy = llvm::PointerType::getUnqual(ClassTy);
+  ClassPtrTy = VMContext.getPointerTypeUnqual(ClassTy);
 
   // struct _objc_category {
   //   char *category_name;
@@ -3758,7 +3777,7 @@
   //   uint32_t size;  // sizeof(struct _objc_category)
   //   struct _objc_property_list *instance_properties;// category's @property
   // }
-  CategoryTy = llvm::StructType::get(Int8PtrTy,
+  CategoryTy = VMContext.getStructType(Int8PtrTy,
                                      Int8PtrTy,
                                      MethodListPtrTy,
                                      MethodListPtrTy,
@@ -3777,14 +3796,14 @@
   //   short cat_def_cnt;
   //   char *defs[cls_def_cnt + cat_def_cnt];
   // }
-  SymtabTy = llvm::StructType::get(LongTy,
+  SymtabTy = VMContext.getStructType(LongTy,
                                    SelectorPtrTy,
                                    ShortTy,
                                    ShortTy,
-                                   llvm::ArrayType::get(Int8PtrTy, 0),
+                                   VMContext.getArrayType(Int8PtrTy, 0),
                                    NULL);
   CGM.getModule().addTypeName("struct._objc_symtab", SymtabTy);
-  SymtabPtrTy = llvm::PointerType::getUnqual(SymtabTy);
+  SymtabPtrTy = VMContext.getPointerTypeUnqual(SymtabTy);
 
   // struct _objc_module {
   //   long version;
@@ -3793,7 +3812,7 @@
   //   struct _objc_symtab* symtab;
   //  }
   ModuleTy = 
-    llvm::StructType::get(LongTy,
+    VMContext.getStructType(LongTy,
                           LongTy,
                           Int8PtrTy,
                           SymtabPtrTy,
@@ -3806,11 +3825,11 @@
   uint64_t SetJmpBufferSize = 18;
  
   // Exceptions
-  const llvm::Type *StackPtrTy = 
-    llvm::ArrayType::get(llvm::PointerType::getUnqual(llvm::Type::Int8Ty), 4);
+  const llvm::Type *StackPtrTy = VMContext.getArrayType(
+                         VMContext.getPointerTypeUnqual(llvm::Type::Int8Ty), 4);
                            
   ExceptionDataTy = 
-    llvm::StructType::get(llvm::ArrayType::get(llvm::Type::Int32Ty, 
+    VMContext.getStructType(VMContext.getArrayType(llvm::Type::Int32Ty, 
                                                SetJmpBufferSize),
                           StackPtrTy, NULL);
   CGM.getModule().addTypeName("struct._objc_exception_data", 
@@ -3826,14 +3845,14 @@
   //   uint32_t method_count;
   //   struct _objc_method method_list[method_count];
   // }
-  MethodListnfABITy = llvm::StructType::get(IntTy,
+  MethodListnfABITy = VMContext.getStructType(IntTy,
                                             IntTy,
-                                            llvm::ArrayType::get(MethodTy, 0),
+                                            VMContext.getArrayType(MethodTy, 0),
                                             NULL);
   CGM.getModule().addTypeName("struct.__method_list_t",
                               MethodListnfABITy);
   // struct method_list_t *
-  MethodListnfABIPtrTy = llvm::PointerType::getUnqual(MethodListnfABITy);
+  MethodListnfABIPtrTy = VMContext.getPointerTypeUnqual(MethodListnfABITy);
   
   // struct _protocol_t {
   //   id isa;  // NULL
@@ -3849,11 +3868,11 @@
   // }
   
   // Holder for struct _protocol_list_t *
-  llvm::PATypeHolder ProtocolListTyHolder = llvm::OpaqueType::get();
+  llvm::PATypeHolder ProtocolListTyHolder = VMContext.getOpaqueType();
   
-  ProtocolnfABITy = llvm::StructType::get(ObjectPtrTy,
+  ProtocolnfABITy = VMContext.getStructType(ObjectPtrTy,
                                           Int8PtrTy,
-                                          llvm::PointerType::getUnqual(
+                                          VMContext.getPointerTypeUnqual(
                                             ProtocolListTyHolder),
                                           MethodListnfABIPtrTy,
                                           MethodListnfABIPtrTy,
@@ -3867,14 +3886,14 @@
                               ProtocolnfABITy);
 
   // struct _protocol_t*
-  ProtocolnfABIPtrTy = llvm::PointerType::getUnqual(ProtocolnfABITy);
+  ProtocolnfABIPtrTy = VMContext.getPointerTypeUnqual(ProtocolnfABITy);
   
   // struct _protocol_list_t {
   //   long protocol_count;   // Note, this is 32/64 bit
   //   struct _protocol_t *[protocol_count];
   // }
-  ProtocolListnfABITy = llvm::StructType::get(LongTy,
-                                              llvm::ArrayType::get(
+  ProtocolListnfABITy = VMContext.getStructType(LongTy,
+                                              VMContext.getArrayType(
                                                 ProtocolnfABIPtrTy, 0),
                                               NULL);
   CGM.getModule().addTypeName("struct._objc_protocol_list",
@@ -3883,7 +3902,7 @@
                                                       ProtocolListnfABITy);
   
   // struct _objc_protocol_list*
-  ProtocolListnfABIPtrTy = llvm::PointerType::getUnqual(ProtocolListnfABITy);
+  ProtocolListnfABIPtrTy = VMContext.getPointerTypeUnqual(ProtocolListnfABITy);
   
   // struct _ivar_t {
   //   unsigned long int *offset;  // pointer to ivar offset location
@@ -3892,7 +3911,7 @@
   //   uint32_t alignment;
   //   uint32_t size;
   // }
-  IvarnfABITy = llvm::StructType::get(llvm::PointerType::getUnqual(LongTy),
+  IvarnfABITy = VMContext.getStructType(VMContext.getPointerTypeUnqual(LongTy),
                                       Int8PtrTy,
                                       Int8PtrTy,
                                       IntTy,
@@ -3905,14 +3924,14 @@
   //   uint32 count;
   //   struct _iver_t list[count];
   // }
-  IvarListnfABITy = llvm::StructType::get(IntTy,
+  IvarListnfABITy = VMContext.getStructType(IntTy,
                                           IntTy,
-                                          llvm::ArrayType::get(
+                                          VMContext.getArrayType(
                                                                IvarnfABITy, 0),
                                           NULL);
   CGM.getModule().addTypeName("struct._ivar_list_t", IvarListnfABITy);
   
-  IvarListnfABIPtrTy = llvm::PointerType::getUnqual(IvarListnfABITy);
+  IvarListnfABIPtrTy = VMContext.getPointerTypeUnqual(IvarListnfABITy);
   
   // struct _class_ro_t {
   //   uint32_t const flags;
@@ -3929,7 +3948,7 @@
   // }
   
   // FIXME. Add 'reserved' field in 64bit abi mode!
-  ClassRonfABITy = llvm::StructType::get(IntTy,
+  ClassRonfABITy = VMContext.getStructType(IntTy,
                                          IntTy,
                                          IntTy,
                                          Int8PtrTy,
@@ -3947,8 +3966,8 @@
   std::vector<const llvm::Type*> Params;
   Params.push_back(ObjectPtrTy);
   Params.push_back(SelectorPtrTy);
-  ImpnfABITy = llvm::PointerType::getUnqual(
-                          llvm::FunctionType::get(ObjectPtrTy, Params, false));
+  ImpnfABITy = VMContext.getPointerTypeUnqual(
+                      VMContext.getFunctionType(ObjectPtrTy, Params, false));
   
   // struct _class_t {
   //   struct _class_t *isa;
@@ -3958,21 +3977,21 @@
   //   struct class_ro_t *ro;
   // }
   
-  llvm::PATypeHolder ClassTyHolder = llvm::OpaqueType::get();
-  ClassnfABITy = llvm::StructType::get(llvm::PointerType::getUnqual(ClassTyHolder),
-                                       llvm::PointerType::getUnqual(ClassTyHolder),
-                                       CachePtrTy,
-                                       llvm::PointerType::getUnqual(ImpnfABITy),
-                                       llvm::PointerType::getUnqual(
-                                                                ClassRonfABITy),
-                                       NULL);
+  llvm::PATypeHolder ClassTyHolder = VMContext.getOpaqueType();
+  ClassnfABITy =
+    VMContext.getStructType(VMContext.getPointerTypeUnqual(ClassTyHolder),
+                            VMContext.getPointerTypeUnqual(ClassTyHolder),
+                            CachePtrTy,
+                            VMContext.getPointerTypeUnqual(ImpnfABITy),
+                            VMContext.getPointerTypeUnqual(ClassRonfABITy),
+                            NULL);
   CGM.getModule().addTypeName("struct._class_t", ClassnfABITy);
 
   cast<llvm::OpaqueType>(ClassTyHolder.get())->refineAbstractTypeTo(
                                                                 ClassnfABITy);
   
   // LLVM for struct _class_t *
-  ClassnfABIPtrTy = llvm::PointerType::getUnqual(ClassnfABITy);
+  ClassnfABIPtrTy = VMContext.getPointerTypeUnqual(ClassnfABITy);
   
   // struct _category_t {
   //   const char * const name;
@@ -3982,7 +4001,7 @@
   //   const struct _protocol_list_t * const protocols;
   //   const struct _prop_list_t * const properties;
   // }
-  CategorynfABITy = llvm::StructType::get(Int8PtrTy,
+  CategorynfABITy = VMContext.getStructType(Int8PtrTy,
                                           ClassnfABIPtrTy,
                                           MethodListnfABIPtrTy,
                                           MethodListnfABIPtrTy,
@@ -4016,20 +4035,20 @@
   MessageRefTy = cast<llvm::StructType>(Types.ConvertType(MessageRefCTy));
   
   // MessageRefPtrTy - LLVM for struct _message_ref_t*
-  MessageRefPtrTy = llvm::PointerType::getUnqual(MessageRefTy);
+  MessageRefPtrTy = VMContext.getPointerTypeUnqual(MessageRefTy);
   
   // SuperMessageRefTy - LLVM for:
   // struct _super_message_ref_t {
   //   SUPER_IMP messenger;
   //   SEL name;
   // };
-  SuperMessageRefTy = llvm::StructType::get(ImpnfABITy,
+  SuperMessageRefTy = VMContext.getStructType(ImpnfABITy,
                                             SelectorPtrTy,
                                             NULL);
   CGM.getModule().addTypeName("struct._super_message_ref_t", SuperMessageRefTy);
   
   // SuperMessageRefPtrTy - LLVM for struct _super_message_ref_t*
-  SuperMessageRefPtrTy = llvm::PointerType::getUnqual(SuperMessageRefTy);  
+  SuperMessageRefPtrTy = VMContext.getPointerTypeUnqual(SuperMessageRefTy);  
   
 
   // struct objc_typeinfo {
@@ -4037,12 +4056,12 @@
   //   const char*  name;    // c++ typeinfo string
   //   Class        cls;
   // };
-  EHTypeTy = llvm::StructType::get(llvm::PointerType::getUnqual(Int8PtrTy),
+  EHTypeTy = VMContext.getStructType(VMContext.getPointerTypeUnqual(Int8PtrTy),
                                    Int8PtrTy,
                                    ClassnfABIPtrTy,
                                    NULL);
   CGM.getModule().addTypeName("struct._objc_typeinfo", EHTypeTy);
-  EHTypePtrTy = llvm::PointerType::getUnqual(EHTypeTy);
+  EHTypePtrTy = VMContext.getPointerTypeUnqual(EHTypeTy);
 }
 
 llvm::Function *CGObjCNonFragileABIMac::ModuleInitFunction() { 
@@ -4063,10 +4082,10 @@
   
   std::vector<llvm::Constant*> Symbols(NumClasses);
   for (unsigned i=0; i<NumClasses; i++)
-    Symbols[i] = llvm::ConstantExpr::getBitCast(Container[i],
+    Symbols[i] = VMContext.getConstantExprBitCast(Container[i],
                                                 ObjCTypes.Int8PtrTy);
   llvm::Constant* Init = 
-    llvm::ConstantArray::get(llvm::ArrayType::get(ObjCTypes.Int8PtrTy,
+    VMContext.getConstantArray(VMContext.getArrayType(ObjCTypes.Int8PtrTy,
                                                   NumClasses),
                              Symbols);
   
@@ -4104,16 +4123,16 @@
   //  static int L_OBJC_IMAGE_INFO[2] = { 0, flags };
   // FIXME. flags can be 0 | 1 | 2 | 6. For now just use 0
   std::vector<llvm::Constant*> Values(2);
-  Values[0] = llvm::ConstantInt::get(ObjCTypes.IntTy, 0);
+  Values[0] = VMContext.getConstantInt(ObjCTypes.IntTy, 0);
   unsigned int flags = 0;
   // FIXME: Fix and continue?
   if (CGM.getLangOptions().getGCMode() != LangOptions::NonGC)
     flags |= eImageInfo_GarbageCollected;
   if (CGM.getLangOptions().getGCMode() == LangOptions::GCOnly)
     flags |= eImageInfo_GCOnly;
-  Values[1] = llvm::ConstantInt::get(ObjCTypes.IntTy, flags);
-  llvm::Constant* Init = llvm::ConstantArray::get(
-                                      llvm::ArrayType::get(ObjCTypes.IntTy, 2),
+  Values[1] = VMContext.getConstantInt(ObjCTypes.IntTy, flags);
+  llvm::Constant* Init = VMContext.getConstantArray(
+                                    VMContext.getArrayType(ObjCTypes.IntTy, 2),
                                       Values);   
   llvm::GlobalVariable *IMGV =
     new llvm::GlobalVariable(CGM.getModule(), Init->getType(), false,
@@ -4193,9 +4212,9 @@
                                                 const ObjCImplementationDecl *ID) {
   std::string ClassName = ID->getNameAsString();
   std::vector<llvm::Constant*> Values(10); // 11 for 64bit targets!
-  Values[ 0] = llvm::ConstantInt::get(ObjCTypes.IntTy, flags);
-  Values[ 1] = llvm::ConstantInt::get(ObjCTypes.IntTy, InstanceStart);
-  Values[ 2] = llvm::ConstantInt::get(ObjCTypes.IntTy, InstanceSize);
+  Values[ 0] = VMContext.getConstantInt(ObjCTypes.IntTy, flags);
+  Values[ 1] = VMContext.getConstantInt(ObjCTypes.IntTy, InstanceStart);
+  Values[ 2] = VMContext.getConstantInt(ObjCTypes.IntTy, InstanceSize);
   // FIXME. For 64bit targets add 0 here.
   Values[ 3] = (flags & CLS_META) ? GetIvarLayoutName(0, ObjCTypes) 
                                   : BuildIvarLayout(ID, true); 
@@ -4256,7 +4275,7 @@
       EmitPropertyList(
                        "\01l_OBJC_$_PROP_LIST_" + ID->getNameAsString(),
                        ID, ID->getClassInterface(), ObjCTypes);
-  llvm::Constant *Init = llvm::ConstantStruct::get(ObjCTypes.ClassRonfABITy,
+  llvm::Constant *Init = VMContext.getConstantStruct(ObjCTypes.ClassRonfABITy,
                                                    Values);
   llvm::GlobalVariable *CLASS_RO_GV =
   new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.ClassRonfABITy, false,
@@ -4296,7 +4315,7 @@
   Values[2] = ObjCEmptyCacheVar;  // &ObjCEmptyCacheVar
   Values[3] = ObjCEmptyVtableVar; // &ObjCEmptyVtableVar
   Values[4] = ClassRoGV;                 // &CLASS_RO_GV
-  llvm::Constant *Init = llvm::ConstantStruct::get(ObjCTypes.ClassnfABITy, 
+  llvm::Constant *Init = VMContext.getConstantStruct(ObjCTypes.ClassnfABITy, 
                                                    Values);
   llvm::GlobalVariable *GV = GetClassGlobal(ClassName);
   GV->setInitializer(Init);
@@ -4440,7 +4459,8 @@
   // This routine is called for @protocol only. So, we must build definition
   // of protocol's meta-data (not a reference to it!)
   //
-  llvm::Constant *Init =  llvm::ConstantExpr::getBitCast(GetOrEmitProtocol(PD),
+  llvm::Constant *Init = 
+       VMContext.getConstantExprBitCast(GetOrEmitProtocol(PD),
                                         ObjCTypes.ExternalProtocolPtrTy);
   
   std::string ProtocolName("\01l_OBJC_PROTOCOL_REFERENCE_$_");
@@ -4532,7 +4552,7 @@
   }
     
   llvm::Constant *Init = 
-    llvm::ConstantStruct::get(ObjCTypes.CategorynfABITy, 
+    VMContext.getConstantStruct(ObjCTypes.CategorynfABITy, 
                               Values);
   llvm::GlobalVariable *GCATV
     = new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.CategorynfABITy, 
@@ -4563,11 +4583,11 @@
   
   std::vector<llvm::Constant*> Method(3);
   Method[0] = 
-  llvm::ConstantExpr::getBitCast(GetMethodVarName(MD->getSelector()),
-                                 ObjCTypes.SelectorPtrTy);
+    VMContext.getConstantExprBitCast(GetMethodVarName(MD->getSelector()),
+                                     ObjCTypes.SelectorPtrTy);
   Method[1] = GetMethodVarType(MD);
-  Method[2] = llvm::ConstantExpr::getBitCast(Fn, ObjCTypes.Int8PtrTy);
-  return llvm::ConstantStruct::get(ObjCTypes.MethodTy, Method);
+  Method[2] = VMContext.getConstantExprBitCast(Fn, ObjCTypes.Int8PtrTy);
+  return VMContext.getConstantStruct(ObjCTypes.MethodTy, Method);
 }
 
 /// EmitMethodList - Build meta-data for method declarations
@@ -4588,13 +4608,13 @@
   std::vector<llvm::Constant*> Values(3);
   // sizeof(struct _objc_method)
   unsigned Size = CGM.getTargetData().getTypeAllocSize(ObjCTypes.MethodTy);
-  Values[0] = llvm::ConstantInt::get(ObjCTypes.IntTy, Size);
+  Values[0] = VMContext.getConstantInt(ObjCTypes.IntTy, Size);
   // method_count
-  Values[1] = llvm::ConstantInt::get(ObjCTypes.IntTy, Methods.size());
-  llvm::ArrayType *AT = llvm::ArrayType::get(ObjCTypes.MethodTy,
+  Values[1] = VMContext.getConstantInt(ObjCTypes.IntTy, Methods.size());
+  llvm::ArrayType *AT = VMContext.getArrayType(ObjCTypes.MethodTy,
                                              Methods.size());
-  Values[2] = llvm::ConstantArray::get(AT, Methods);
-  llvm::Constant *Init = llvm::ConstantStruct::get(Values);
+  Values[2] = VMContext.getConstantArray(AT, Methods);
+  llvm::Constant *Init = VMContext.getConstantStruct(Values);
   
   llvm::GlobalVariable *GV =
     new llvm::GlobalVariable(CGM.getModule(), Init->getType(), false,
@@ -4605,7 +4625,7 @@
     CGM.getTargetData().getPrefTypeAlignment(Init->getType()));
   GV->setSection(Section);
   UsedGlobals.push_back(GV);
-  return llvm::ConstantExpr::getBitCast(GV,
+  return VMContext.getConstantExprBitCast(GV,
                                         ObjCTypes.MethodListnfABIPtrTy);
 }
 
@@ -4638,7 +4658,7 @@
                                               const ObjCIvarDecl *Ivar,
                                               unsigned long int Offset) {
   llvm::GlobalVariable *IvarOffsetGV = ObjCIvarOffsetVariable(ID, Ivar);
-  IvarOffsetGV->setInitializer(llvm::ConstantInt::get(ObjCTypes.LongTy, 
+  IvarOffsetGV->setInitializer(VMContext.getConstantInt(ObjCTypes.LongTy, 
                                                       Offset));
   IvarOffsetGV->setAlignment(
     CGM.getTargetData().getPrefTypeAlignment(ObjCTypes.LongTy));
@@ -4701,26 +4721,26 @@
     unsigned Align = CGM.getContext().getPreferredTypeAlign(
                        IVD->getType().getTypePtr()) >> 3;
     Align = llvm::Log2_32(Align);
-    Ivar[3] = llvm::ConstantInt::get(ObjCTypes.IntTy, Align);
+    Ivar[3] = VMContext.getConstantInt(ObjCTypes.IntTy, Align);
     // NOTE. Size of a bitfield does not match gcc's, because of the
     // way bitfields are treated special in each. But I am told that
     // 'size' for bitfield ivars is ignored by the runtime so it does
     // not matter.  If it matters, there is enough info to get the
     // bitfield right!
-    Ivar[4] = llvm::ConstantInt::get(ObjCTypes.IntTy, Size);
-    Ivars.push_back(llvm::ConstantStruct::get(ObjCTypes.IvarnfABITy, Ivar));
+    Ivar[4] = VMContext.getConstantInt(ObjCTypes.IntTy, Size);
+    Ivars.push_back(VMContext.getConstantStruct(ObjCTypes.IvarnfABITy, Ivar));
   }
   // Return null for empty list.
   if (Ivars.empty())
     return VMContext.getNullValue(ObjCTypes.IvarListnfABIPtrTy);
   std::vector<llvm::Constant*> Values(3);
   unsigned Size = CGM.getTargetData().getTypeAllocSize(ObjCTypes.IvarnfABITy);
-  Values[0] = llvm::ConstantInt::get(ObjCTypes.IntTy, Size);
-  Values[1] = llvm::ConstantInt::get(ObjCTypes.IntTy, Ivars.size());
-  llvm::ArrayType *AT = llvm::ArrayType::get(ObjCTypes.IvarnfABITy,
+  Values[0] = VMContext.getConstantInt(ObjCTypes.IntTy, Size);
+  Values[1] = VMContext.getConstantInt(ObjCTypes.IntTy, Ivars.size());
+  llvm::ArrayType *AT = VMContext.getArrayType(ObjCTypes.IvarnfABITy,
                                              Ivars.size());
-  Values[2] = llvm::ConstantArray::get(AT, Ivars);
-  llvm::Constant *Init = llvm::ConstantStruct::get(Values);
+  Values[2] = VMContext.getConstantArray(AT, Ivars);
+  llvm::Constant *Init = VMContext.getConstantStruct(Values);
   const char *Prefix = "\01l_OBJC_$_INSTANCE_VARIABLES_";
   llvm::GlobalVariable *GV =
     new llvm::GlobalVariable(CGM.getModule(), Init->getType(), false,
@@ -4732,8 +4752,7 @@
   GV->setSection("__DATA, __objc_const");
                  
   UsedGlobals.push_back(GV);
-  return llvm::ConstantExpr::getBitCast(GV,
-                                        ObjCTypes.IvarListnfABIPtrTy);
+  return VMContext.getConstantExprBitCast(GV, ObjCTypes.IvarListnfABIPtrTy);
 }
 
 llvm::Constant *CGObjCNonFragileABIMac::GetOrEmitProtocolRef(
@@ -4837,9 +4856,9 @@
                                0, PD, ObjCTypes);
   uint32_t Size = 
     CGM.getTargetData().getTypeAllocSize(ObjCTypes.ProtocolnfABITy);
-  Values[8] = llvm::ConstantInt::get(ObjCTypes.IntTy, Size);
+  Values[8] = VMContext.getConstantInt(ObjCTypes.IntTy, Size);
   Values[9] = VMContext.getNullValue(ObjCTypes.IntTy);
-  llvm::Constant *Init = llvm::ConstantStruct::get(ObjCTypes.ProtocolnfABITy,
+  llvm::Constant *Init = VMContext.getConstantStruct(ObjCTypes.ProtocolnfABITy,
                                                    Values);
   
   if (Entry) {
@@ -4896,7 +4915,7 @@
   // FIXME: We shouldn't need to do this lookup here, should we?
   llvm::GlobalVariable *GV = CGM.getModule().getGlobalVariable(Name, true);
   if (GV)
-    return llvm::ConstantExpr::getBitCast(GV, 
+    return VMContext.getConstantExprBitCast(GV, 
                                           ObjCTypes.ProtocolListnfABIPtrTy);
   
   for (; begin != end; ++begin)
@@ -4907,13 +4926,15 @@
                                             ObjCTypes.ProtocolnfABIPtrTy));
   
   std::vector<llvm::Constant*> Values(2);
-  Values[0] = llvm::ConstantInt::get(ObjCTypes.LongTy, ProtocolRefs.size() - 1);
+  Values[0] =
+    VMContext.getConstantInt(ObjCTypes.LongTy, ProtocolRefs.size() - 1);
   Values[1] = 
-    llvm::ConstantArray::get(llvm::ArrayType::get(ObjCTypes.ProtocolnfABIPtrTy,
-                                                  ProtocolRefs.size()), 
-                                                  ProtocolRefs);
+    VMContext.getConstantArray(
+      VMContext.getArrayType(ObjCTypes.ProtocolnfABIPtrTy,
+                             ProtocolRefs.size()), 
+                             ProtocolRefs);
   
-  llvm::Constant *Init = llvm::ConstantStruct::get(Values);
+  llvm::Constant *Init = VMContext.getConstantStruct(Values);
   GV = new llvm::GlobalVariable(CGM.getModule(), Init->getType(), false,
                                 llvm::GlobalValue::InternalLinkage,
                                 Init,
@@ -4922,7 +4943,7 @@
   GV->setAlignment(
     CGM.getTargetData().getPrefTypeAlignment(Init->getType()));
   UsedGlobals.push_back(GV);
-  return llvm::ConstantExpr::getBitCast(GV, 
+  return VMContext.getConstantExprBitCast(GV, 
                                         ObjCTypes.ProtocolListnfABIPtrTy);
 }
 
@@ -4936,12 +4957,13 @@
 llvm::Constant *
 CGObjCNonFragileABIMac::GetMethodDescriptionConstant(const ObjCMethodDecl *MD) {
   std::vector<llvm::Constant*> Desc(3);
-  Desc[0] = llvm::ConstantExpr::getBitCast(GetMethodVarName(MD->getSelector()),
+  Desc[0] =
+          VMContext.getConstantExprBitCast(GetMethodVarName(MD->getSelector()),
                                            ObjCTypes.SelectorPtrTy);
   Desc[1] = GetMethodVarType(MD);
   // Protocol methods have no implementation. So, this entry is always NULL.
   Desc[2] = VMContext.getNullValue(ObjCTypes.Int8PtrTy);
-  return llvm::ConstantStruct::get(ObjCTypes.MethodTy, Desc);
+  return VMContext.getConstantStruct(ObjCTypes.MethodTy, Desc);
 }
 
 /// EmitObjCValueForIvar - Code Gen for nonfragile ivar reference.
@@ -5055,7 +5077,7 @@
     std::vector<llvm::Constant*> Values(2);
     Values[0] = Fn;
     Values[1] = GetMethodVarName(Sel);
-    llvm::Constant *Init = llvm::ConstantStruct::get(Values);
+    llvm::Constant *Init = VMContext.getConstantStruct(Values);
     GV =  new llvm::GlobalVariable(CGM.getModule(), Init->getType(), false,
                                    llvm::GlobalValue::WeakAnyLinkage,
                                    Init,
@@ -5076,7 +5098,7 @@
   Callee = CGF.Builder.CreateLoad(Callee);
   const llvm::FunctionType *FTy = Types.GetFunctionType(FnInfo1, true);
   Callee = CGF.Builder.CreateBitCast(Callee,
-                                     llvm::PointerType::getUnqual(FTy));
+                                     VMContext.getPointerTypeUnqual(FTy));
   return CGF.EmitCall(FnInfo1, Callee, ActualArgs);
 }
 
@@ -5252,7 +5274,7 @@
   
   if (!Entry) {
     llvm::Constant *Casted = 
-    llvm::ConstantExpr::getBitCast(GetMethodVarName(Sel),
+    VMContext.getConstantExprBitCast(GetMethodVarName(Sel),
                                    ObjCTypes.SelectorPtrTy);
     Entry = 
     new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.SelectorPtrTy, false,
@@ -5314,7 +5336,7 @@
                                          unsigned long size) {
   SrcPtr = CGF.Builder.CreateBitCast(SrcPtr, ObjCTypes.Int8PtrTy);
   DestPtr = CGF.Builder.CreateBitCast(DestPtr, ObjCTypes.Int8PtrTy);
-  llvm::Value *N = llvm::ConstantInt::get(ObjCTypes.LongTy, size);
+  llvm::Value *N = VMContext.getConstantInt(ObjCTypes.LongTy, size);
   CGF.Builder.CreateCall3(ObjCTypes.GcMemmoveCollectableFn(),
                           DestPtr, SrcPtr, N);
   return;
@@ -5477,7 +5499,7 @@
 
   // We use a cleanup unless there was already a catch all.
   if (!HasCatchAll) {
-    SelectorArgs.push_back(llvm::ConstantInt::get(llvm::Type::Int32Ty, 0));
+    SelectorArgs.push_back(VMContext.getConstantInt(llvm::Type::Int32Ty, 0));
     Handlers.push_back(std::make_pair((const ParmVarDecl*) 0, (const Stmt*) 0));
   }
     
@@ -5547,7 +5569,7 @@
       llvm::SmallVector<llvm::Value*, 8> Args;
       Args.push_back(Exc);
       Args.push_back(ObjCTypes.getEHPersonalityPtr());
-      Args.push_back(llvm::ConstantInt::get(llvm::Type::Int32Ty,
+      Args.push_back(VMContext.getConstantInt(llvm::Type::Int32Ty,
                                             0));
       CGF.Builder.CreateCall(llvm_eh_selector_i64, Args.begin(), Args.end());
       CGF.Builder.CreateStore(Exc, RethrowPtr);
@@ -5579,7 +5601,7 @@
       Args.clear();
       Args.push_back(Exc);
       Args.push_back(ObjCTypes.getEHPersonalityPtr());
-      Args.push_back(llvm::ConstantInt::get(llvm::Type::Int32Ty,
+      Args.push_back(VMContext.getConstantInt(llvm::Type::Int32Ty,
                                             0));
       CGF.Builder.CreateCall(llvm_eh_selector_i64, Args.begin(), Args.end());
       CGF.Builder.CreateStore(Exc, RethrowPtr);
@@ -5692,13 +5714,14 @@
                                         llvm::GlobalValue::ExternalLinkage,
                                         0, VTableName);
 
-  llvm::Value *VTableIdx = llvm::ConstantInt::get(llvm::Type::Int32Ty, 2);
+  llvm::Value *VTableIdx = VMContext.getConstantInt(llvm::Type::Int32Ty, 2);
 
   std::vector<llvm::Constant*> Values(3);
-  Values[0] = llvm::ConstantExpr::getGetElementPtr(VTableGV, &VTableIdx, 1);
+  Values[0] = VMContext.getConstantExprGetElementPtr(VTableGV, &VTableIdx, 1);
   Values[1] = GetClassName(ID->getIdentifier());
   Values[2] = GetClassGlobal(ClassName);
-  llvm::Constant *Init = llvm::ConstantStruct::get(ObjCTypes.EHTypeTy, Values);
+  llvm::Constant *Init =
+    VMContext.getConstantStruct(ObjCTypes.EHTypeTy, Values);
 
   if (Entry) {
     Entry->setInitializer(Init);