[cfe-commits] r69010 - in /cfe/trunk: lib/CodeGen/CGExpr.cpp lib/Sema/SemaDecl.cpp test/CodeGenObjC/blocks-1.m

Mike Stump mrs at apple.com
Mon Apr 13 17:57:30 PDT 2009


Author: mrs
Date: Mon Apr 13 19:57:29 2009
New Revision: 69010

URL: http://llvm.org/viewvc/llvm-project?rev=69010&view=rev
Log:
Fixup CodeGen for __weak __block variables.  Radar 6756266

Modified:
    cfe/trunk/lib/CodeGen/CGExpr.cpp
    cfe/trunk/lib/Sema/SemaDecl.cpp
    cfe/trunk/test/CodeGenObjC/blocks-1.m

Modified: cfe/trunk/lib/CodeGen/CGExpr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExpr.cpp?rev=69010&r1=69009&r2=69010&view=diff

==============================================================================
--- cfe/trunk/lib/CodeGen/CGExpr.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGExpr.cpp Mon Apr 13 19:57:29 2009
@@ -422,7 +422,7 @@
     // load of a __weak object. 
     llvm::Value *LvalueDst = Dst.getAddress();
     llvm::Value *src = Src.getScalarVal();
-    CGM.getObjCRuntime().EmitObjCWeakAssign(*this, src, LvalueDst);
+     CGM.getObjCRuntime().EmitObjCWeakAssign(*this, src, LvalueDst);
     return;
   }
   
@@ -631,6 +631,7 @@
   if (VD && (VD->isBlockVarDecl() || isa<ParmVarDecl>(VD) ||
         isa<ImplicitParamDecl>(VD))) {
     LValue LV;
+    bool GCable = VD->hasLocalStorage() && ! VD->getAttr<BlocksAttr>();
     if (VD->getStorageClass() == VarDecl::Extern) {
       LV = LValue::MakeAddr(CGM.GetAddrOfGlobalVar(VD),
                             E->getType().getCVRQualifiers(),
@@ -642,7 +643,7 @@
       // local variables do not get their gc attribute set.
       QualType::GCAttrTypes attr = QualType::GCNone;
       // local static?
-      if (!VD->hasLocalStorage())
+      if (!GCable)
         attr = getContext().getObjCGCAttrKind(E->getType());
       if (VD->hasAttr<BlocksAttr>()) {
         bool needsCopyDispose = BlockRequiresCopying(VD->getType());
@@ -657,7 +658,7 @@
       }
       LV = LValue::MakeAddr(V, E->getType().getCVRQualifiers(), attr);
     }
-    LValue::SetObjCNonGC(LV, VD->hasLocalStorage());
+    LValue::SetObjCNonGC(LV, GCable);
     return LV;
   } else if (VD && VD->isFileVarDecl()) {
     LValue LV = LValue::MakeAddr(CGM.GetAddrOfGlobalVar(VD),

Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=69010&r1=69009&r2=69010&view=diff

==============================================================================
--- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDecl.cpp Mon Apr 13 19:57:29 2009
@@ -1803,7 +1803,8 @@
     Invalid = true;
   }
 
-  if (NewVD->hasLocalStorage() && T.isObjCGCWeak())
+  if (NewVD->hasLocalStorage() && T.isObjCGCWeak()
+      && !NewVD->getAttr<BlocksAttr>())
     Diag(NewVD->getLocation(), diag::warn_attribute_weak_on_local);
 
   bool isIllegalVLA = T->isVariableArrayType() && NewVD->hasGlobalStorage();

Modified: cfe/trunk/test/CodeGenObjC/blocks-1.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenObjC/blocks-1.m?rev=69010&r1=69009&r2=69010&view=diff

==============================================================================
--- cfe/trunk/test/CodeGenObjC/blocks-1.m (original)
+++ cfe/trunk/test/CodeGenObjC/blocks-1.m Mon Apr 13 19:57:29 2009
@@ -1,14 +1,26 @@
-// RUN: clang-cc %s -emit-llvm -o %t -fblocks &&
-// RUN: grep "_Block_object_dispose" %t | count 2 &&
+// RUN: clang-cc %s -emit-llvm -o %t -fobjc-gc -fblocks &&
+// RUN: grep "_Block_object_dispose" %t | count 4 &&
 // RUN: grep "__copy_helper_block_" %t | count 2 &&
 // RUN: grep "__destroy_helper_block_" %t | count 2 &&
-// RUN: grep "__Block_byref_id_object_copy_" %t | count 0 &&
-// RUN: grep "__Block_byref_id_object_dispose_" %t | count 0 &&
+// RUN: grep "__Block_byref_id_object_copy_" %t | count 2 &&
+// RUN: grep "__Block_byref_id_object_dispose_" %t | count 2 &&
 // RUN: grep "i32 135)" %t | count 0 &&
-// RUN: grep "_Block_object_assign" %t | count 2
+// RUN: grep "_Block_object_assign" %t | count 3 &&
+// RUN: grep "objc_read_weak" %t | count 2 &&
+// RUN: grep "objc_assign_weak" %t | count 2
 
 @interface NSDictionary @end
 
 void test1(NSDictionary * dict) {
   ^{ (void)dict; }();
 }
+
+ at interface D
+ at end
+
+void foo() {
+  __block __weak D *weakSelf;
+  D *l;
+  l = weakSelf;
+  weakSelf = l;
+}





More information about the cfe-commits mailing list