]> granicus.if.org Git - clang/commitdiff
Pass the type of the block literal around to make required temporal ordering of code...
authorMike Stump <mrs@apple.com>
Fri, 6 Mar 2009 18:42:23 +0000 (18:42 +0000)
committerMike Stump <mrs@apple.com>
Fri, 6 Mar 2009 18:42:23 +0000 (18:42 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@66284 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGBlocks.cpp
lib/CodeGen/CGBlocks.h
lib/CodeGen/CodeGenFunction.h

index 3326f83c19b9b43354622bb60cb597416b5c21d1..3b602a0a1b790afc37b9ae17e6c160505db1b1df 100644 (file)
@@ -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::
index e915a512b787c18ee548de5e8276f983809c7044..5d6c0899237d9904bb4a9688b304d17cc038b325 100644 (file)
@@ -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);
index 26fde8423c36f2e0d8713b9141e768c8ecec8e7a..2ac886d840336008fae07da172a6eded44f30377 100644 (file)
@@ -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,