[cfe-commits] r110448 - in /cfe/trunk: lib/CodeGen/CGObjCMac.cpp test/CodeGenObjC/block-var-layout.m

Fariborz Jahanian fjahanian at apple.com
Fri Aug 6 09:28:55 PDT 2010


Author: fjahanian
Date: Fri Aug  6 11:28:55 2010
New Revision: 110448

URL: http://llvm.org/viewvc/llvm-project?rev=110448&view=rev
Log:
Finishing up block variable layout API by supporting 
union type variables and their nesting inside other
aggregate types.

Modified:
    cfe/trunk/lib/CodeGen/CGObjCMac.cpp
    cfe/trunk/test/CodeGenObjC/block-var-layout.m

Modified: cfe/trunk/lib/CodeGen/CGObjCMac.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGObjCMac.cpp?rev=110448&r1=110447&r2=110448&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGObjCMac.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGObjCMac.cpp Fri Aug  6 11:28:55 2010
@@ -1714,6 +1714,7 @@
   if ((CGM.getLangOptions().getGCMode() == LangOptions::NonGC) ||
       DeclRefs.empty())
     return NullPtr;
+  bool hasUnion = false;
   SkipIvars.clear();
   IvarsInfo.clear();
   unsigned WordSizeInBits = CGM.getContext().Target.getPointerWidth(0);
@@ -1727,19 +1728,14 @@
     QualType Ty = VD->getType();
     assert(!Ty->isArrayType() && 
            "Array block variable should have been caught");
-    if (Ty->isRecordType() && !BDRE->isByRef()) {
-      bool HasUnion = false;
+    if ((Ty->isRecordType() || Ty->isUnionType()) && !BDRE->isByRef()) {
       BuildAggrIvarRecordLayout(Ty->getAs<RecordType>(),
                                 FieldOffset,
                                 true,
-                                HasUnion);
+                                hasUnion);
       continue;
     }
-    // FIXME. Handle none __block Aggregate variables
-#if 0
-    if (Ty->isUnionType() && !BDRE->isByRef())
-      assert(false && "union block variable layout NYI");
-#endif
+      
     Qualifiers::GC GCAttr = GetGCAttrTypeForType(CGM.getContext(), Ty);
     unsigned FieldSize = CGM.getContext().getTypeSize(Ty);
     // __block variables are passed by their descriptior address. So, size
@@ -1756,6 +1752,12 @@
   
   if (IvarsInfo.empty())
     return NullPtr;
+  // Sort on byte position in case we encounterred a union nested in
+  // block variable type's aggregate type.
+  if (hasUnion && !IvarsInfo.empty())
+    std::sort(IvarsInfo.begin(), IvarsInfo.end());
+  if (hasUnion && !SkipIvars.empty())
+    std::sort(SkipIvars.begin(), SkipIvars.end());
   
   std::string BitMap;
   llvm::Constant *C = BuildIvarLayoutBitmap(BitMap);

Modified: cfe/trunk/test/CodeGenObjC/block-var-layout.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenObjC/block-var-layout.m?rev=110448&r1=110447&r2=110448&view=diff
==============================================================================
--- cfe/trunk/test/CodeGenObjC/block-var-layout.m (original)
+++ cfe/trunk/test/CodeGenObjC/block-var-layout.m Fri Aug  6 11:28:55 2010
@@ -72,6 +72,41 @@
     e();
 }
 
+// Test 5 (unions/structs and their nesting):
+void Test5() {
+struct S5 {
+    int i1;
+    id o1;
+    struct V {
+     int i2;
+     id o2;
+    } v1;
+    int i3;
+    union UI {
+        void * i1;
+        id o1;
+        int i3;
+        id o3;
+    }ui;
+};
+
+union U {
+        void * i1;
+        id o1;
+        int i3;
+        id o3;
+}ui;
+
+struct S5 s2;
+union U u2;
+void (^c)() = ^{
+    x(s2.ui.o1);
+    x(u2.o1);
+};
+c();
+
+}
+
 // CHECK-LP64: L_OBJC_CLASS_NAME_:
 // CHECK-LP64-NEXT: .asciz      "A\024"
 
@@ -83,3 +118,6 @@
 
 // CHECK-LP64: L_OBJC_CLASS_NAME_11:
 // CHECK-LP64-NEXT: .asciz   "Q\021\021"
+
+// CHECK-LP64: L_OBJC_CLASS_NAME_14:
+// CHECK-LP64-NEXT: .asciz   "Q\021\022p"





More information about the cfe-commits mailing list