codegen support for dispose helpers for block literals.
llvm-svn: 66320
This commit is contained in:
parent
aeb0ffd56c
commit
6f7d9f8774
|
@ -802,7 +802,29 @@ GenerateDestroyHelperFunction(bool BlockHasCopyDispose,
|
||||||
FunctionDecl::Static, false,
|
FunctionDecl::Static, false,
|
||||||
true);
|
true);
|
||||||
CGF.StartFunction(FD, R, Fn, Args, SourceLocation());
|
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();
|
CGF.FinishFunction();
|
||||||
|
|
||||||
return llvm::ConstantExpr::getBitCast(Fn, PtrToInt8Ty);
|
return llvm::ConstantExpr::getBitCast(Fn, PtrToInt8Ty);
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
// RUN: clang %s -emit-llvm -o %t -fblocks -f__block &&
|
// RUN: clang %s -emit-llvm -o %t -fblocks -f__block &&
|
||||||
// RUN: grep "_Block_object_dispose" %t | count 6 &&
|
// RUN: grep "_Block_object_dispose" %t | count 10 &&
|
||||||
// RUN: grep "__copy_helper_block_" %t | count 6 &&
|
// RUN: grep "__copy_helper_block_" %t | count 6 &&
|
||||||
// RUN: grep "__destroy_helper_block_" %t | count 6 &&
|
// RUN: grep "__destroy_helper_block_" %t | count 6 &&
|
||||||
// RUN: grep "__Block_byref_id_object_copy_" %t | count 2 &&
|
// RUN: grep "__Block_byref_id_object_copy_" %t | count 2 &&
|
||||||
|
|
Loading…
Reference in New Issue