]> granicus.if.org Git - clang/commitdiff
Introducing objc_assign_ivar to clang.
authorFariborz Jahanian <fjahanian@apple.com>
Thu, 20 Nov 2008 19:23:36 +0000 (19:23 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Thu, 20 Nov 2008 19:23:36 +0000 (19:23 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@59740 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGObjCGNU.cpp
lib/CodeGen/CGObjCMac.cpp
lib/CodeGen/CGObjCRuntime.h

index 7adbd4a8e752247c1fa9e27d07235cc4519ef862..bafac41dbf1b36bdf81a9eb9e1313eb7f99175a7 100644 (file)
@@ -136,6 +136,8 @@ public:
                                   llvm::Value *src, llvm::Value *dst);
   virtual void EmitObjCGlobalAssign(CodeGen::CodeGenFunction &CGF,
                                     llvm::Value *src, llvm::Value *dest);
+  virtual void EmitObjCIvarAssign(CodeGen::CodeGenFunction &CGF,
+                                    llvm::Value *src, llvm::Value *dest);
   virtual void EmitObjCStrongCastAssign(CodeGen::CodeGenFunction &CGF,
                                         llvm::Value *src, llvm::Value *dest);
 };
@@ -994,6 +996,12 @@ void CGObjCGNU::EmitObjCGlobalAssign(CodeGen::CodeGenFunction &CGF,
   return;
 }
 
+void CGObjCGNU::EmitObjCIvarAssign(CodeGen::CodeGenFunction &CGF,
+                                   llvm::Value *src, llvm::Value *dst)
+{
+  return;
+}
+
 void CGObjCGNU::EmitObjCStrongCastAssign(CodeGen::CodeGenFunction &CGF,
                                          llvm::Value *src, llvm::Value *dst)
 {
index 5a45ad90ec1bb7a4ec5aa429d2d9c2bb68a8ee9f..8a9d1fed0afbfe609e75ff1a0f48fafc3634da65 100644 (file)
@@ -175,6 +175,9 @@ public:
   /// GcAssignGlobalFn -- LLVM objc_assign_global function.
   llvm::Function *GcAssignGlobalFn;
   
+  /// GcAssignIvarFn -- LLVM objc_assign_ivar function.
+  llvm::Function *GcAssignIvarFn;
+  
   /// GcAssignStrongCastFn -- LLVM objc_assign_strongCast function.
   llvm::Function *GcAssignStrongCastFn;
   
@@ -460,6 +463,8 @@ public:
                                   llvm::Value *src, llvm::Value *dst); 
   virtual void EmitObjCGlobalAssign(CodeGen::CodeGenFunction &CGF,
                                     llvm::Value *src, llvm::Value *dest);
+  virtual void EmitObjCIvarAssign(CodeGen::CodeGenFunction &CGF,
+                                  llvm::Value *src, llvm::Value *dest);
   virtual void EmitObjCStrongCastAssign(CodeGen::CodeGenFunction &CGF,
                                         llvm::Value *src, llvm::Value *dest);
 };
@@ -1820,6 +1825,19 @@ void CGObjCMac::EmitObjCGlobalAssign(CodeGen::CodeGenFunction &CGF,
   return;
 }
 
+/// EmitObjCIvarAssign - Code gen for assigning to a __strong object.
+/// objc_assign_ivar (id src, id *dst)
+///
+void CGObjCMac::EmitObjCIvarAssign(CodeGen::CodeGenFunction &CGF,
+                                   llvm::Value *src, llvm::Value *dst)
+{
+  src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
+  dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy);
+  CGF.Builder.CreateCall2(ObjCTypes.GcAssignIvarFn,
+                          src, dst, "assignivar");
+  return;
+}
+
 /// EmitObjCStrongCastAssign - Code gen for assigning to a __strong cast object.
 /// objc_assign_strongCast (id src, id *dst)
 ///
@@ -2637,6 +2655,11 @@ ObjCTypesHelper::ObjCTypesHelper(CodeGen::CodeGenModule &cgm)
                                                       Params,
                                                       false),
                            "objc_assign_global");
+  GcAssignIvarFn =
+    CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
+                                                      Params,
+                                                      false),
+                           "objc_assign_ivar");
   GcAssignStrongCastFn =
     CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
                                                       Params,
index 675ff340b64727896a8e5ca0e327db8d6c119cbc..25b3309ab165860194bbee3dff9c9f1c3af95b31 100644 (file)
@@ -151,6 +151,8 @@ public:
                                   llvm::Value *src, llvm::Value *dest) = 0;
   virtual void EmitObjCGlobalAssign(CodeGen::CodeGenFunction &CGF,
                                     llvm::Value *src, llvm::Value *dest) = 0;
+  virtual void EmitObjCIvarAssign(CodeGen::CodeGenFunction &CGF,
+                                  llvm::Value *src, llvm::Value *dest) = 0;
   virtual void EmitObjCStrongCastAssign(CodeGen::CodeGenFunction &CGF,
                                         llvm::Value *src, llvm::Value *dest) = 0;
 };