diff --git a/lib/CodeGen/CGExpr.cpp b/lib/CodeGen/CGExpr.cpp
index 68878a2..89f5522 100644
--- a/lib/CodeGen/CGExpr.cpp
+++ b/lib/CodeGen/CGExpr.cpp
@@ -744,7 +744,7 @@
   // a class without recompiling all of the subclasses.  If this is the case
   // then the CGObjCRuntime subclass must return true to LateBoundIvars and
   // implement the lookup itself.
-  if (CGM.getObjCRuntime()->LateBoundIVars()) {
+  if (CGM.getObjCRuntime().LateBoundIVars()) {
     assert(0 && "FIXME: Implement support for late-bound instance variables");
     return LValue(); // Not reached.
   }
diff --git a/lib/CodeGen/CGExprConstant.cpp b/lib/CodeGen/CGExprConstant.cpp
index b1f7c51..5865f21 100644
--- a/lib/CodeGen/CGExprConstant.cpp
+++ b/lib/CodeGen/CGExprConstant.cpp
@@ -61,7 +61,7 @@
     return llvm::ConstantInt::get(ConvertType(E->getType()), E->getValue());
   }
   llvm::Constant *VisitObjCStringLiteral(const ObjCStringLiteral *E) {
-    return CGM.getObjCRuntime()->GenerateConstantString(
+    return CGM.getObjCRuntime().GenerateConstantString(
         E->getString()->getStrData(), E->getString()->getByteLength());
   }
   
diff --git a/lib/CodeGen/CGExprScalar.cpp b/lib/CodeGen/CGExprScalar.cpp
index 63b8efc..2bd39c1 100644
--- a/lib/CodeGen/CGExprScalar.cpp
+++ b/lib/CodeGen/CGExprScalar.cpp
@@ -49,7 +49,9 @@
 
   ScalarExprEmitter(CodeGenFunction &cgf) : CGF(cgf), 
     Builder(CGF.Builder), 
-    Runtime(CGF.CGM.getObjCRuntime()) {
+    Runtime(0) {
+    if (CGF.CGM.hasObjCRuntime())
+      Runtime = &CGF.CGM.getObjCRuntime();
   }
   
   //===--------------------------------------------------------------------===//
diff --git a/lib/CodeGen/CGObjC.cpp b/lib/CodeGen/CGObjC.cpp
index d1545a2..e152488 100644
--- a/lib/CodeGen/CGObjC.cpp
+++ b/lib/CodeGen/CGObjC.cpp
@@ -21,7 +21,7 @@
 
 /// Emits an instance of NSConstantString representing the object.
 llvm::Value *CodeGenFunction::EmitObjCStringLiteral(const ObjCStringLiteral *E){
-  return CGM.getObjCRuntime()->GenerateConstantString(
+  return CGM.getObjCRuntime().GenerateConstantString(
       E->getString()->getStrData(), E->getString()->getByteLength());
 }
 
@@ -31,7 +31,7 @@
   // Note that this implementation allows for non-constant strings to be passed
   // as arguments to @selector().  Currently, the only thing preventing this
   // behaviour is the type checking in the front end.
-  return CGM.getObjCRuntime()->GetSelector(Builder, E->getSelector());
+  return CGM.getObjCRuntime().GetSelector(Builder, E->getSelector());
 }
 
 
@@ -41,7 +41,7 @@
   // implementation vary between runtimes.  We can get the receiver and
   // arguments in generic code.
   
-  CGObjCRuntime *Runtime = CGM.getObjCRuntime();
+  CGObjCRuntime &Runtime = CGM.getObjCRuntime();
   const Expr *ReceiverExpr = E->getReceiver();
   bool isSuperMessage = false;
   // Find the receiver
@@ -53,7 +53,7 @@
     }
     llvm::Value *ClassName = CGM.GetAddrOfConstantString(classname);
     ClassName = Builder.CreateStructGEP(ClassName, 0);
-    Receiver = Runtime->LookupClass(Builder, ClassName);
+    Receiver = Runtime.LookupClass(Builder, ClassName);
   } else if (const PredefinedExpr *PDE =
                dyn_cast<PredefinedExpr>(E->getReceiver())) {
     assert(PDE->getIdentType() == PredefinedExpr::ObjCSuper);
@@ -89,12 +89,12 @@
     const ObjCMethodDecl *OMD = cast<ObjCMethodDecl>(CurFuncDecl);
     const char *SuperClass =
       OMD->getClassInterface()->getSuperClass()->getName();
-    return Runtime->GenerateMessageSendSuper(Builder, ConvertType(E->getType()),
+    return Runtime.GenerateMessageSendSuper(Builder, ConvertType(E->getType()),
                                              Receiver, SuperClass,
                                              Receiver, E->getSelector(),
                                              &Args[0], Args.size());
   }
-  return Runtime->GenerateMessageSend(Builder, ConvertType(E->getType()),
+  return Runtime.GenerateMessageSend(Builder, ConvertType(E->getType()),
                                       LoadObjCSelf(),
                                       Receiver, E->getSelector(),
                                       &Args[0], Args.size());
@@ -119,7 +119,7 @@
   }
   const llvm::Type *ReturnTy = 
     CGM.getTypes().ConvertReturnType(OMD->getResultType());
-  CurFn = CGM.getObjCRuntime()->MethodPreamble(
+  CurFn = CGM.getObjCRuntime().MethodPreamble(
                                           OMD->getClassInterface()->getName(),
                                               CategoryName,
                                               OMD->getSelector().getName(),
diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp
index b3e7213..347f4d2 100644
--- a/lib/CodeGen/CodeGenModule.cpp
+++ b/lib/CodeGen/CodeGenModule.cpp
@@ -33,13 +33,16 @@
                              Diagnostic &diags, bool GenerateDebugInfo,
                              bool UseMacObjCRuntime)
   : Context(C), Features(LO), TheModule(M), TheTargetData(TD), Diags(diags),
-    Types(C, M, TD), MemCpyFn(0), MemMoveFn(0), MemSetFn(0),
+    Types(C, M, TD), Runtime(0), MemCpyFn(0), MemMoveFn(0), MemSetFn(0),
     CFConstantStringClassRef(0) {
-  //TODO: Make this selectable at runtime
-  if (UseMacObjCRuntime) {
-    Runtime = CreateMacObjCRuntime(*this);
-  } else {
-    Runtime = CreateGNUObjCRuntime(*this);
+
+  if (Features.ObjC1) {
+    // TODO: Make this selectable at runtime
+    if (UseMacObjCRuntime) {
+      Runtime = CreateMacObjCRuntime(*this);
+    } else {
+      Runtime = CreateGNUObjCRuntime(*this);
+    }
   }
 
   // If debug info generation is enabled, create the CGDebugInfo object.
@@ -53,9 +56,9 @@
 
 void CodeGenModule::Release() {
   EmitStatics();
-  llvm::Function *ObjCInitFunction = Runtime->ModuleInitFunction();
-  if (ObjCInitFunction)
-    AddGlobalCtor(ObjCInitFunction);
+  if (Runtime)
+    if (llvm::Function *ObjCInitFunction = Runtime->ModuleInitFunction())
+      AddGlobalCtor(ObjCInitFunction);
   EmitCtorList(GlobalCtors, "llvm.global_ctors");
   EmitCtorList(GlobalDtors, "llvm.global_dtors");
   EmitAnnotations();
diff --git a/lib/CodeGen/CodeGenModule.h b/lib/CodeGen/CodeGenModule.h
index bd45f65..0b313c4 100644
--- a/lib/CodeGen/CodeGenModule.h
+++ b/lib/CodeGen/CodeGenModule.h
@@ -111,8 +111,18 @@
   
   /// Release - Finalize LLVM code generation.
   void Release();
+
+  /// getObjCRuntime() - Return a reference to the configured
+  /// Objective-C runtime.
+  CGObjCRuntime &getObjCRuntime() { 
+    assert(Runtime && "No Objective-C runtime has been configured.");
+    return *Runtime; 
+  }
   
-  CGObjCRuntime *getObjCRuntime() { return Runtime; }
+  /// hasObjCRuntime() - Return true iff an Objective-C runtime has
+  /// been configured.
+  bool hasObjCRuntime() { return !!Runtime; }
+
   CGDebugInfo *getDebugInfo() { return DebugInfo; }
   ASTContext &getContext() const { return Context; }
   const LangOptions &getLangOptions() const { return Features; }
