diff --git a/lib/CodeGen/CGExpr.cpp b/lib/CodeGen/CGExpr.cpp
index 96ded8b..f7bbb60 100644
--- a/lib/CodeGen/CGExpr.cpp
+++ b/lib/CodeGen/CGExpr.cpp
@@ -1025,17 +1025,7 @@
   // implement the lookup itself.
   if (CGM.getObjCRuntime().LateBoundIVars())
     assert(0 && "late-bound ivars are unsupported");
-
-  const llvm::Type *InterfaceLTy = 
-    CGM.getTypes().ConvertType(getContext().getObjCInterfaceType(Interface));
-  const llvm::StructLayout *Layout =
-    CGM.getTargetData().getStructLayout(cast<llvm::StructType>(InterfaceLTy));
-  FieldDecl *Field = Interface->lookupFieldDeclForIvar(getContext(), Ivar);
-  uint64_t Offset = 
-    Layout->getElementOffset(CGM.getTypes().getLLVMFieldNo(Field));
-  
-  return llvm::ConstantInt::get(CGM.getTypes().ConvertType(getContext().LongTy),
-                                Offset);                                                             
+  return CGM.getObjCRuntime().EmitIvarOffset(*this, Interface, Ivar);
 }
 
 LValue CodeGenFunction::EmitLValueForIvar(QualType ObjectTy,
diff --git a/lib/CodeGen/CGObjCGNU.cpp b/lib/CodeGen/CGObjCGNU.cpp
index 8cee0f0..b41f76d 100644
--- a/lib/CodeGen/CGObjCGNU.cpp
+++ b/lib/CodeGen/CGObjCGNU.cpp
@@ -146,6 +146,9 @@
                                       const ObjCIvarDecl *Ivar,
                                       const FieldDecl *Field,
                                       unsigned CVRQualifiers);
+  virtual llvm::Value *EmitIvarOffset(CodeGen::CodeGenFunction &CGF,
+                                      ObjCInterfaceDecl *Interface,
+                                      const ObjCIvarDecl *Ivar);
 };
 } // end anonymous namespace
 
@@ -1035,6 +1038,23 @@
   return LV;
 }
 
+llvm::Value *CGObjCGNU::EmitIvarOffset(CodeGen::CodeGenFunction &CGF,
+                         ObjCInterfaceDecl *Interface,
+                         const ObjCIvarDecl *Ivar) {
+  const llvm::Type *InterfaceLTy =
+    CGM.getTypes().ConvertType(
+                            CGM.getContext().getObjCInterfaceType(Interface));
+  const llvm::StructLayout *Layout =
+    CGM.getTargetData().getStructLayout(cast<llvm::StructType>(InterfaceLTy));
+  FieldDecl *Field = Interface->lookupFieldDeclForIvar(CGM.getContext(), Ivar);
+  uint64_t Offset =
+    Layout->getElementOffset(CGM.getTypes().getLLVMFieldNo(Field));
+  
+  return llvm::ConstantInt::get(
+                            CGM.getTypes().ConvertType(CGM.getContext().LongTy),
+                            Offset);
+}
+
 CodeGen::CGObjCRuntime *CodeGen::CreateGNUObjCRuntime(CodeGen::CodeGenModule &CGM){
   return new CGObjCGNU(CGM);
 }
diff --git a/lib/CodeGen/CGObjCMac.cpp b/lib/CodeGen/CGObjCMac.cpp
index 275bdf7..43da911 100644
--- a/lib/CodeGen/CGObjCMac.cpp
+++ b/lib/CodeGen/CGObjCMac.cpp
@@ -590,6 +590,9 @@
                                       const ObjCIvarDecl *Ivar,
                                       const FieldDecl *Field,
                                       unsigned CVRQualifiers);
+  virtual llvm::Value *EmitIvarOffset(CodeGen::CodeGenFunction &CGF,
+                                      ObjCInterfaceDecl *Interface,
+                                      const ObjCIvarDecl *Ivar);
 };
   
 class CGObjCNonFragileABIMac : public CGObjCCommonMac {
@@ -704,9 +707,12 @@
   virtual llvm::Value *GenerateProtocolRef(CGBuilderTy &Builder,
                                            const ObjCProtocolDecl *PD);
   
-  virtual llvm::Function *GetPropertyGetFunction(){ return 0; }
-  virtual llvm::Function *GetPropertySetFunction()
-    { return 0; }
+  virtual llvm::Function *GetPropertyGetFunction(){ 
+    return ObjCTypes.GetPropertyFn;
+  }
+  virtual llvm::Function *GetPropertySetFunction(){ 
+    return ObjCTypes.SetPropertyFn; 
+  }
   virtual llvm::Function *EnumerationMutationFunction()
     { return 0; }
   
@@ -737,6 +743,10 @@
                                       const ObjCIvarDecl *Ivar,
                                       const FieldDecl *Field,
                                       unsigned CVRQualifiers);
+  virtual llvm::Value *EmitIvarOffset(CodeGen::CodeGenFunction &CGF,
+                                      ObjCInterfaceDecl *Interface,
+                                      const ObjCIvarDecl *Ivar);
+  virtual bool LateBoundIVars() const { return true; }
 };
   
 } // end anonymous namespace
@@ -2170,6 +2180,22 @@
   return LV;
 }
 
+llvm::Value *CGObjCMac::EmitIvarOffset(CodeGen::CodeGenFunction &CGF,
+                                       ObjCInterfaceDecl *Interface,
+                                       const ObjCIvarDecl *Ivar) {
+  const llvm::Type *InterfaceLTy =
+  CGM.getTypes().ConvertType(CGM.getContext().getObjCInterfaceType(Interface));
+  const llvm::StructLayout *Layout =
+  CGM.getTargetData().getStructLayout(cast<llvm::StructType>(InterfaceLTy));
+  FieldDecl *Field = Interface->lookupFieldDeclForIvar(CGM.getContext(), Ivar);
+  uint64_t Offset =
+  Layout->getElementOffset(CGM.getTypes().getLLVMFieldNo(Field));
+  
+  return llvm::ConstantInt::get(
+                            CGM.getTypes().ConvertType(CGM.getContext().LongTy),
+                            Offset);
+}
+
 /* *** Private Interface *** */
 
 /// EmitImageInfo - Emit the image info marker used to encode some module
@@ -4280,6 +4306,13 @@
   return LV;
 }
 
+llvm::Value *CGObjCNonFragileABIMac::EmitIvarOffset(
+                                       CodeGen::CodeGenFunction &CGF,
+                                       ObjCInterfaceDecl *Interface,
+                                       const ObjCIvarDecl *Ivar) {
+  return 0;
+}
+
 CodeGen::RValue CGObjCNonFragileABIMac::EmitMessageSend(
                                            CodeGen::CodeGenFunction &CGF,
                                            QualType ResultType,
diff --git a/lib/CodeGen/CGObjCRuntime.h b/lib/CodeGen/CGObjCRuntime.h
index c85e9de..1513157 100644
--- a/lib/CodeGen/CGObjCRuntime.h
+++ b/lib/CodeGen/CGObjCRuntime.h
@@ -163,6 +163,9 @@
                                       const ObjCIvarDecl *Ivar,
                                       const FieldDecl *Field,
                                       unsigned CVRQualifiers) = 0;
+  virtual llvm::Value *EmitIvarOffset(CodeGen::CodeGenFunction &CGF,
+                                      ObjCInterfaceDecl *Interface,
+                                      const ObjCIvarDecl *Ivar) = 0;
 };
 
 /// Creates an instance of an Objective-C runtime class.  
