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"