From 903aba39eea68679058a49ff07364aed12592a1d Mon Sep 17 00:00:00 2001 From: Fariborz Jahanian Date: Thu, 5 Aug 2010 21:00:25 +0000 Subject: [PATCH] Add support for block imported struct variable layout info. (objc gc and blocks in NeXt runtime). llvm-svn: 110377 --- clang/lib/CodeGen/CGObjCMac.cpp | 12 ++++++++++-- clang/test/CodeGenObjC/block-var-layout.m | 20 ++++++++++++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/clang/lib/CodeGen/CGObjCMac.cpp b/clang/lib/CodeGen/CGObjCMac.cpp index b8ed516ad7da..b3921a481654 100644 --- a/clang/lib/CodeGen/CGObjCMac.cpp +++ b/clang/lib/CodeGen/CGObjCMac.cpp @@ -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(), + 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/clang/test/CodeGenObjC/block-var-layout.m b/clang/test/CodeGenObjC/block-var-layout.m index 6e4b8125392d..f00b44fdd553 100644 --- a/clang/test/CodeGenObjC/block-var-layout.m +++ b/clang/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 @@ 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"