Add support for block imported struct variable layout info.
(objc gc and blocks in NeXt runtime).


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@110377 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/CGObjCMac.cpp b/lib/CodeGen/CGObjCMac.cpp
index b8ed516..b3921a4 100644
--- a/lib/CodeGen/CGObjCMac.cpp
+++ b/lib/CodeGen/CGObjCMac.cpp
@@ -1727,10 +1727,18 @@
     QualType Ty = VD->getType();
     assert(!Ty->isArrayType() && 
            "Array block variable should have been caught");
+    if (Ty->isRecordType() && !BDRE->isByRef()) {
+      bool HasUnion = false;
+      BuildAggrIvarRecordLayout(Ty->getAs<RecordType>(),
+                                FieldOffset,
+                                true,
+                                HasUnion);
+      continue;
+    }
     // FIXME. Handle none __block Aggregate variables
 #if 0
-    if ((Ty->isRecordType() || Ty->isUnionType()) && !BDRE->isByRef())
-      assert(false && "Aggregate block variable layout NYI");
+    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);
diff --git a/test/CodeGenObjC/block-var-layout.m b/test/CodeGenObjC/block-var-layout.m
index 6e4b812..f00b44f 100644
--- a/test/CodeGenObjC/block-var-layout.m
+++ b/test/CodeGenObjC/block-var-layout.m
@@ -3,6 +3,17 @@
 // RUN: %clang_cc1 -x objective-c++ -fblocks -fobjc-gc -triple x86_64-apple-darwin -O0 -S %s -o %t-64.s
 // RUN: FileCheck -check-prefix LP64 --input-file=%t-64.s %s
 
+struct S {
+    int i1;
+    id o1;
+    struct V {
+     int i2;
+     id o2;
+    } v1;
+    int i3;
+    id o3;
+};
+
 __weak id wid;
 void x(id y) {}
 void y(int a) {}
@@ -52,6 +63,13 @@
         x(byref_bab);
     };    
     d();
+
+// Test4
+    struct S s2;
+    void (^e)() = ^{
+        x(s2.o1);
+    };    
+    e();
 }
 
 // CHECK-LP64: L_OBJC_CLASS_NAME_:
@@ -63,3 +81,5 @@
 // CHECK-LP64: L_OBJC_CLASS_NAME_6:
 // CHECK-LP64-NEXT: .asciz   "A\023!"
 
+// CHECK-LP64: L_OBJC_CLASS_NAME_11:
+// CHECK-LP64-NEXT: .asciz   "Q\021\021"