diff options
| author | Fariborz Jahanian <fjahanian@apple.com> | 2008-11-20 19:23:36 +0000 |
|---|---|---|
| committer | Fariborz Jahanian <fjahanian@apple.com> | 2008-11-20 19:23:36 +0000 |
| commit | e881b536e8e185fa0b9e14cb440f7fb1372bde83 (patch) | |
| tree | 2d1683e77dde5719a368519ff9ad38dafdd2dbfb /clang/lib/CodeGen | |
| parent | 073b0b12a5714a73f38cae8d446a523e1e186f6c (diff) | |
| download | bcm5719-llvm-e881b536e8e185fa0b9e14cb440f7fb1372bde83.tar.gz bcm5719-llvm-e881b536e8e185fa0b9e14cb440f7fb1372bde83.zip | |
Introducing objc_assign_ivar to clang.
llvm-svn: 59740
Diffstat (limited to 'clang/lib/CodeGen')
| -rw-r--r-- | clang/lib/CodeGen/CGObjCGNU.cpp | 8 | ||||
| -rw-r--r-- | clang/lib/CodeGen/CGObjCMac.cpp | 23 | ||||
| -rw-r--r-- | clang/lib/CodeGen/CGObjCRuntime.h | 2 |
3 files changed, 33 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/CGObjCGNU.cpp b/clang/lib/CodeGen/CGObjCGNU.cpp index 7adbd4a8e75..bafac41dbf1 100644 --- a/clang/lib/CodeGen/CGObjCGNU.cpp +++ b/clang/lib/CodeGen/CGObjCGNU.cpp @@ -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) { 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, diff --git a/clang/lib/CodeGen/CGObjCRuntime.h b/clang/lib/CodeGen/CGObjCRuntime.h index 675ff340b64..25b3309ab16 100644 --- a/clang/lib/CodeGen/CGObjCRuntime.h +++ b/clang/lib/CodeGen/CGObjCRuntime.h @@ -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; }; |

