Finishing up block variable layout API by supporting 
union type variables and their nesting inside other
aggregate types.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@110448 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/CGObjCMac.cpp b/lib/CodeGen/CGObjCMac.cpp
index b3921a4..d9d79e1 100644
--- a/lib/CodeGen/CGObjCMac.cpp
+++ b/lib/CodeGen/CGObjCMac.cpp
@@ -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);