diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2010-11-16 19:29:39 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2010-11-16 19:29:39 +0000 |
commit | a3e54bd33e07341633e89e7f9ec9ff877277b3ad (patch) | |
tree | 3e428099af9c1baf0cc7ad3fc60c486fc716950d /clang/lib/CodeGen/CGBlocks.cpp | |
parent | 288018519489979f97e8d638e50add3b6156eee8 (diff) | |
download | bcm5719-llvm-a3e54bd33e07341633e89e7f9ec9ff877277b3ad.tar.gz bcm5719-llvm-a3e54bd33e07341633e89e7f9ec9ff877277b3ad.zip |
Implements __block API for c++ objects. There is still
issue with runtime which I am discussing it with Blaine.
This is wip (so no test yet).
llvm-svn: 119368
Diffstat (limited to 'clang/lib/CodeGen/CGBlocks.cpp')
-rw-r--r-- | clang/lib/CodeGen/CGBlocks.cpp | 43 |
1 files changed, 38 insertions, 5 deletions
diff --git a/clang/lib/CodeGen/CGBlocks.cpp b/clang/lib/CodeGen/CGBlocks.cpp index 2206e8a1cd7..e21664607cf 100644 --- a/clang/lib/CodeGen/CGBlocks.cpp +++ b/clang/lib/CodeGen/CGBlocks.cpp @@ -1006,14 +1006,36 @@ GenerateCopyHelperFunction(const llvm::StructType *T, || NoteForHelper[i].RequiresCopying) { llvm::Value *Srcv = SrcObj; Srcv = Builder.CreateStructGEP(Srcv, index); - Srcv = Builder.CreateBitCast(Srcv, - llvm::PointerType::get(PtrToInt8Ty, 0)); - llvm::Value *Dstv = Builder.CreateStructGEP(DstObj, index); + llvm::Value *Dstv; if (NoteForHelper[i].cxxvar_import) { - CGF.EmitSynthesizedCXXCopyCtor(Dstv, Srcv, - NoteForHelper[i].cxxvar_import); + if (NoteForHelper[i].flag & BLOCK_FIELD_IS_BYREF) { + const ValueDecl *VD = NoteForHelper[i].cxxvar_import->getDecl(); + const llvm::Type *PtrStructTy + = llvm::PointerType::get(CGF.BuildByRefType(VD), 0); + Srcv = Builder.CreateLoad(Srcv); + Srcv = Builder.CreateBitCast(Srcv, PtrStructTy); + Srcv = Builder.CreateStructGEP(Srcv, CGF.getByRefValueLLVMField(VD), + VD->getNameAsString()); + Dstv = Builder.CreateStructGEP(DstObj, index); + Dstv = Builder.CreateLoad(Dstv); + Dstv = Builder.CreateBitCast(Dstv, PtrStructTy); + Dstv = Builder.CreateStructGEP(Dstv, CGF.getByRefValueLLVMField(VD), + VD->getNameAsString()); + CGF.EmitSynthesizedCXXCopyCtor(Dstv, Srcv, + NoteForHelper[i].cxxvar_import); + } + else { + Srcv = Builder.CreateBitCast(Srcv, + llvm::PointerType::get(PtrToInt8Ty, 0)); + Dstv = Builder.CreateStructGEP(DstObj, index); + CGF.EmitSynthesizedCXXCopyCtor(Dstv, Srcv, + NoteForHelper[i].cxxvar_import); + } } else { + Srcv = Builder.CreateBitCast(Srcv, + llvm::PointerType::get(PtrToInt8Ty, 0)); + Dstv = Builder.CreateStructGEP(DstObj, index); Srcv = Builder.CreateLoad(Srcv); Dstv = Builder.CreateBitCast(Dstv, PtrToInt8Ty); llvm::Value *N = llvm::ConstantInt::get(CGF.Int32Ty, flag); @@ -1091,6 +1113,17 @@ GenerateDestroyHelperFunction(const llvm::StructType* T, QualType ClassTy = E->getType(); QualType PtrClassTy = getContext().getPointerType(ClassTy); const llvm::Type *t = CGM.getTypes().ConvertType(PtrClassTy); + + if (NoteForHelper[i].flag & BLOCK_FIELD_IS_BYREF) { + const ValueDecl *VD = NoteForHelper[i].cxxvar_import->getDecl(); + const llvm::Type *PtrStructTy + = llvm::PointerType::get(CGF.BuildByRefType(VD), 0); + Srcv = Builder.CreateLoad(Srcv); + Srcv = Builder.CreateBitCast(Srcv, PtrStructTy); + Srcv = Builder.CreateStructGEP(Srcv, CGF.getByRefValueLLVMField(VD), + VD->getNameAsString()); + + } Srcv = Builder.CreateBitCast(Srcv, t); CGF.PushDestructorCleanup(ClassTy, Srcv); } |