Add support for block imported struct variable layout info.
(objc gc and blocks in NeXt runtime). llvm-svn: 110377
This commit is contained in:
parent
d3c94af142
commit
903aba39ee
|
@ -1727,10 +1727,18 @@ llvm::Constant *CGObjCCommonMac::GCBlockLayout(CodeGen::CodeGenFunction &CGF,
|
|||
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);
|
||||
|
|
|
@ -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 @@ void (^d)() = ^{
|
|||
x(byref_bab);
|
||||
};
|
||||
d();
|
||||
|
||||
// Test4
|
||||
struct S s2;
|
||||
void (^e)() = ^{
|
||||
x(s2.o1);
|
||||
};
|
||||
e();
|
||||
}
|
||||
|
||||
// CHECK-LP64: L_OBJC_CLASS_NAME_:
|
||||
|
@ -63,3 +81,5 @@ void (^d)() = ^{
|
|||
// 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"
|
||||
|
|
Loading…
Reference in New Issue