diff options
-rw-r--r-- | lib/CodeGen/CGBlocks.cpp | 29 | ||||
-rw-r--r-- | lib/CodeGen/CGBlocks.h | 8 | ||||
-rw-r--r-- | lib/CodeGen/CodeGenFunction.h | 2 |
3 files changed, 22 insertions, 17 deletions
diff --git a/lib/CodeGen/CGBlocks.cpp b/lib/CodeGen/CGBlocks.cpp index 3326f83c19..3b602a0a1b 100644 --- a/lib/CodeGen/CGBlocks.cpp +++ b/lib/CodeGen/CGBlocks.cpp @@ -33,7 +33,8 @@ Enable__block("f__block", llvm::cl::ZeroOrMore, llvm::cl::init(false)); -llvm::Constant *CodeGenFunction::BuildDescriptorBlockDecl(uint64_t Size) { +llvm::Constant *CodeGenFunction:: +BuildDescriptorBlockDecl(uint64_t Size, const llvm::Type* Ty) { const llvm::Type *UnsignedLongTy = CGM.getTypes().ConvertType(getContext().UnsignedLongTy); llvm::Constant *C; @@ -52,10 +53,10 @@ llvm::Constant *CodeGenFunction::BuildDescriptorBlockDecl(uint64_t Size) { if (BlockHasCopyDispose) { // copy_func_helper_decl - Elts.push_back(BuildCopyHelper()); + Elts.push_back(BuildCopyHelper(Ty)); // destroy_func_decl - Elts.push_back(BuildDestroyHelper()); + Elts.push_back(BuildDestroyHelper(Ty)); } C = llvm::ConstantStruct::get(Elts); @@ -180,10 +181,10 @@ llvm::Value *CodeGenFunction::BuildBlockLiteralTmp(const BlockExpr *BE) { C = llvm::ConstantInt::get(IntTy, 0); Elts[2] = C; - // __descriptor - Elts[4] = BuildDescriptorBlockDecl(subBlockSize); - if (subBlockDeclRefDecls.size() == 0) { + // __descriptor + Elts[4] = BuildDescriptorBlockDecl(subBlockSize, 0); + // Optimize to being a global block. Elts[0] = CGM.getNSConcreteGlobalBlock(); Elts[1] = llvm::ConstantInt::get(IntTy, flags|BLOCK_IS_GLOBAL); @@ -295,6 +296,9 @@ llvm::Value *CodeGenFunction::BuildBlockLiteralTmp(const BlockExpr *BE) { // FIXME: Ensure that the offset created by the backend for // the struct matches the previously computed offset in BlockDecls. } + + // __descriptor + Elts[4] = BuildDescriptorBlockDecl(subBlockSize, Ty); } QualType BPT = BE->getType(); @@ -671,7 +675,7 @@ uint64_t CodeGenFunction::getBlockOffset(const BlockDeclRefExpr *BDRE) { return BlockOffset-Size; } -llvm::Constant *BlockFunction::GenerateCopyHelperFunction() { +llvm::Constant *BlockFunction::GenerateCopyHelperFunction(const llvm::Type *Ty) { QualType R = getContext().VoidTy; FunctionArgList Args; @@ -709,7 +713,8 @@ llvm::Constant *BlockFunction::GenerateCopyHelperFunction() { return llvm::ConstantExpr::getBitCast(Fn, PtrToInt8Ty); } -llvm::Constant *BlockFunction::GenerateDestroyHelperFunction() { +llvm::Constant *BlockFunction:: +GenerateDestroyHelperFunction(const llvm::Type* Ty) { QualType R = getContext().VoidTy; FunctionArgList Args; @@ -747,12 +752,12 @@ llvm::Constant *BlockFunction::GenerateDestroyHelperFunction() { return llvm::ConstantExpr::getBitCast(Fn, PtrToInt8Ty); } -llvm::Constant *BlockFunction::BuildCopyHelper() { - return CodeGenFunction(CGM).GenerateCopyHelperFunction(); +llvm::Constant *BlockFunction::BuildCopyHelper(const llvm::Type *Ty) { + return CodeGenFunction(CGM).GenerateCopyHelperFunction(Ty); } -llvm::Constant *BlockFunction::BuildDestroyHelper() { - return CodeGenFunction(CGM).GenerateDestroyHelperFunction(); +llvm::Constant *BlockFunction::BuildDestroyHelper(const llvm::Type *Ty) { + return CodeGenFunction(CGM).GenerateDestroyHelperFunction(Ty); } llvm::Constant *BlockFunction:: diff --git a/lib/CodeGen/CGBlocks.h b/lib/CodeGen/CGBlocks.h index e915a512b7..5d6c089923 100644 --- a/lib/CodeGen/CGBlocks.h +++ b/lib/CodeGen/CGBlocks.h @@ -158,11 +158,11 @@ public: ImplicitParamDecl *BlockStructDecl; ImplicitParamDecl *getBlockStructDecl() { return BlockStructDecl; } - llvm::Constant *GenerateCopyHelperFunction(); - llvm::Constant *GenerateDestroyHelperFunction(); + llvm::Constant *GenerateCopyHelperFunction(const llvm::Type *); + llvm::Constant *GenerateDestroyHelperFunction(const llvm::Type *); - llvm::Constant *BuildCopyHelper(); - llvm::Constant *BuildDestroyHelper(); + llvm::Constant *BuildCopyHelper(const llvm::Type *); + llvm::Constant *BuildDestroyHelper(const llvm::Type *); llvm::Constant *GeneratebyrefCopyHelperFunction(const llvm::Type *, int flag); llvm::Constant *GeneratebyrefDestroyHelperFunction(const llvm::Type *T, int); diff --git a/lib/CodeGen/CodeGenFunction.h b/lib/CodeGen/CodeGenFunction.h index 26fde8423c..2ac886d840 100644 --- a/lib/CodeGen/CodeGenFunction.h +++ b/lib/CodeGen/CodeGenFunction.h @@ -266,7 +266,7 @@ public: //===--------------------------------------------------------------------===// llvm::Value *BuildBlockLiteralTmp(const BlockExpr *); - llvm::Constant *BuildDescriptorBlockDecl(uint64_t Size); + llvm::Constant *BuildDescriptorBlockDecl(uint64_t Size, const llvm::Type *); llvm::Function *GenerateBlockFunction(const BlockExpr *BExpr, const BlockInfo& Info, |