]> granicus.if.org Git - clang/commitdiff
Fixes an obscure bug in importd block variable layout
authorFariborz Jahanian <fjahanian@apple.com>
Sat, 11 Sep 2010 01:27:29 +0000 (01:27 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Sat, 11 Sep 2010 01:27:29 +0000 (01:27 +0000)
information when imported variable is used
more than once. Originally though to be a bug in importing
block varibles. Fixes radar 8417746.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@113675 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGBlocks.cpp
lib/CodeGen/CGObjCGNU.cpp
lib/CodeGen/CGObjCMac.cpp
lib/CodeGen/CGObjCRuntime.h
test/CodeGenObjC/block-var-layout.m

index 04f1ef24b29715d3f00faede23e06c02b5c9b5a2..d4e703ce03ab336a06587f7b83edcbd7a9dbb240 100644 (file)
@@ -757,7 +757,7 @@ CodeGenFunction::GenerateBlockFunction(GlobalDecl GD, const BlockExpr *BExpr,
 
   // Capture block layout info. here.
   if (CGM.getContext().getLangOptions().ObjC1)
-    BlockVarLayout = CGM.getObjCRuntime().GCBlockLayout(*this, Info.DeclRefs);
+    BlockVarLayout = CGM.getObjCRuntime().GCBlockLayout(*this, BlockLayout);
   else
     BlockVarLayout = llvm::Constant::getNullValue(PtrToInt8Ty);
   
index d7960beb1d1d4a25758fb68470f90f2de3581eb0..0b3e31db049290895dd12f1c85721e0658854fe8 100644 (file)
@@ -213,7 +213,7 @@ public:
                                       const ObjCInterfaceDecl *Interface,
                                       const ObjCIvarDecl *Ivar);
   virtual llvm::Constant *GCBlockLayout(CodeGen::CodeGenFunction &CGF,
-              const llvm::SmallVectorImpl<const BlockDeclRefExpr *> &) {
+              const llvm::SmallVectorImpl<const Expr *> &) {
     return NULLPtr;
   }
 };
index 82541356863c6ec60e401bb82036bbb29094227f..73074b6bbe5285085e8db03c601bd203450ca6de 100644 (file)
@@ -1000,7 +1000,7 @@ public:
   /// definition is seen. The return value has type ProtocolPtrTy.
   virtual llvm::Constant *GetOrEmitProtocolRef(const ObjCProtocolDecl *PD)=0;
   virtual llvm::Constant *GCBlockLayout(CodeGen::CodeGenFunction &CGF,
-                      const llvm::SmallVectorImpl<const BlockDeclRefExpr *> &);
+                      const llvm::SmallVectorImpl<const Expr *> &);
   
 };
 
@@ -1663,11 +1663,11 @@ static Qualifiers::GC GetGCAttrTypeForType(ASTContext &Ctx, QualType FQT) {
 }
 
 llvm::Constant *CGObjCCommonMac::GCBlockLayout(CodeGen::CodeGenFunction &CGF,
-              const llvm::SmallVectorImpl<const BlockDeclRefExpr *> &DeclRefs) {
+              const llvm::SmallVectorImpl<const Expr *> &BlockLayout) {
   llvm::Constant *NullPtr = 
     llvm::Constant::getNullValue(llvm::Type::getInt8PtrTy(VMContext));
   if ((CGM.getLangOptions().getGCMode() == LangOptions::NonGC) ||
-      DeclRefs.empty())
+      BlockLayout.empty())
     return NullPtr;
   bool hasUnion = false;
   SkipIvars.clear();
@@ -1678,8 +1678,11 @@ llvm::Constant *CGObjCCommonMac::GCBlockLayout(CodeGen::CodeGenFunction &CGF,
   // __isa is the first field in block descriptor and must assume by runtime's
   // convention that it is GC'able.
   IvarsInfo.push_back(GC_IVAR(0, 1));
-  for (size_t i = 0; i < DeclRefs.size(); ++i) {
-    const BlockDeclRefExpr *BDRE = DeclRefs[i];
+  for (size_t i = 0; i < BlockLayout.size(); ++i) {
+    const Expr *E = BlockLayout[i];
+    const BlockDeclRefExpr *BDRE = dyn_cast<BlockDeclRefExpr>(E);
+    if (!BDRE)
+      continue;
     const ValueDecl *VD = BDRE->getDecl();
     CharUnits Offset = CGF.BlockDecls[VD];
     uint64_t FieldOffset = Offset.getQuantity();
index 584760f6f343cbe66e3ce55924f20ce1ea7f2865..c9b0c6d10c7984f3aae57a815ec3fe71a5cb271c 100644 (file)
@@ -220,7 +220,7 @@ public:
                                         llvm::Value *SrcPtr,
                                         llvm::Value *Size) = 0;
   virtual llvm::Constant *GCBlockLayout(CodeGen::CodeGenFunction &CGF,
-                  const llvm::SmallVectorImpl<const BlockDeclRefExpr *> &) = 0;
+                  const llvm::SmallVectorImpl<const Expr *> &) = 0;
                                         
 };
 
index f57d7d99cd5ff124e9f09333272ac5a4ea309247..c2a01d35fe09174022f8023d9237777ad6955e00 100644 (file)
@@ -107,6 +107,23 @@ c();
 
 }
 
+// rdar: //8417746
+void CFRelease(id);
+void notifyBlock(id dependentBlock) {
+ id singleObservationToken;
+ id token;
+ void (^b)();
+ void (^wrapperBlock)() = ^() {
+     CFRelease(singleObservationToken);
+     CFRelease(singleObservationToken);
+     CFRelease(token);
+     CFRelease(singleObservationToken);
+     b();
+    };
+ wrapperBlock();
+}
+
+
 // CHECK-LP64: L_OBJC_CLASS_NAME_:
 // CHECK-LP64-NEXT: .asciz      "\0011\024"
 
@@ -121,3 +138,6 @@ c();
 
 // CHECK-LP64: L_OBJC_CLASS_NAME_14:
 // CHECK-LP64-NEXT: .asciz   "\001A\021\022p"
+
+// CHECK-LP64: L_OBJC_CLASS_NAME_16:
+// CHECK-LP64-NEXT: .asciz   "\0013"