summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen/CGBlocks.cpp
diff options
context:
space:
mode:
authorMike Stump <mrs@apple.com>2009-03-07 02:53:18 +0000
committerMike Stump <mrs@apple.com>2009-03-07 02:53:18 +0000
commit6f7d9f8774c5888fe25f55ced435510b73cffd0e (patch)
tree5e1c651994e4ffd1ef7cc5243980407fd415e3cd /clang/lib/CodeGen/CGBlocks.cpp
parentaeb0ffd56c2a9109d95b766ad24298389a16ba8a (diff)
downloadbcm5719-llvm-6f7d9f8774c5888fe25f55ced435510b73cffd0e.tar.gz
bcm5719-llvm-6f7d9f8774c5888fe25f55ced435510b73cffd0e.zip
codegen support for dispose helpers for block literals.
llvm-svn: 66320
Diffstat (limited to 'clang/lib/CodeGen/CGBlocks.cpp')
-rw-r--r--clang/lib/CodeGen/CGBlocks.cpp24
1 files changed, 23 insertions, 1 deletions
diff --git a/clang/lib/CodeGen/CGBlocks.cpp b/clang/lib/CodeGen/CGBlocks.cpp
index 8020a8b26f2..344ac60d98a 100644
--- a/clang/lib/CodeGen/CGBlocks.cpp
+++ b/clang/lib/CodeGen/CGBlocks.cpp
@@ -802,7 +802,29 @@ GenerateDestroyHelperFunction(bool BlockHasCopyDispose,
FunctionDecl::Static, false,
true);
CGF.StartFunction(FD, R, Fn, Args, SourceLocation());
- // EmitStmt(BExpr->getBody());
+
+ llvm::Value *SrcObj = CGF.GetAddrOfLocalVar(Src);
+ llvm::Type *PtrPtrT;
+ PtrPtrT = llvm::PointerType::get(llvm::PointerType::get(T, 0), 0);
+ SrcObj = Builder.CreateBitCast(SrcObj, PtrPtrT);
+ SrcObj = Builder.CreateLoad(SrcObj);
+
+ for (unsigned i=0; i < NoteForHelper.size(); ++i) {
+ int flag = NoteForHelper[i].flag;
+ int index = NoteForHelper[i].index;
+
+ if ((NoteForHelper[i].flag & BLOCK_FIELD_IS_BYREF)
+ || NoteForHelper[i].RequiresCopying) {
+ llvm::Value *Srcv = SrcObj;
+ Srcv = Builder.CreateStructGEP(Srcv, index);
+ Srcv = Builder.CreateBitCast(Srcv,
+ llvm::PointerType::get(PtrToInt8Ty, 0));
+ Srcv = Builder.CreateLoad(Srcv);
+
+ BuildBlockRelease(Srcv, flag);
+ }
+ }
+
CGF.FinishFunction();
return llvm::ConstantExpr::getBitCast(Fn, PtrToInt8Ty);
OpenPOWER on IntegriCloud