summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen/CGObjCMac.cpp
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2008-11-20 19:23:36 +0000
committerFariborz Jahanian <fjahanian@apple.com>2008-11-20 19:23:36 +0000
commite881b536e8e185fa0b9e14cb440f7fb1372bde83 (patch)
tree2d1683e77dde5719a368519ff9ad38dafdd2dbfb /clang/lib/CodeGen/CGObjCMac.cpp
parent073b0b12a5714a73f38cae8d446a523e1e186f6c (diff)
downloadbcm5719-llvm-e881b536e8e185fa0b9e14cb440f7fb1372bde83.tar.gz
bcm5719-llvm-e881b536e8e185fa0b9e14cb440f7fb1372bde83.zip
Introducing objc_assign_ivar to clang.
llvm-svn: 59740
Diffstat (limited to 'clang/lib/CodeGen/CGObjCMac.cpp')
-rw-r--r--clang/lib/CodeGen/CGObjCMac.cpp23
1 files changed, 23 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/CGObjCMac.cpp b/clang/lib/CodeGen/CGObjCMac.cpp
index 5a45ad90ec1..8a9d1fed0af 100644
--- a/clang/lib/CodeGen/CGObjCMac.cpp
+++ b/clang/lib/CodeGen/CGObjCMac.cpp
@@ -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,
OpenPOWER on IntegriCloud